第2周个人作业:WordCount
github地址
https://github.com/fqd332/wc
PSP表格
PSP2.1 |
PSP阶段 |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
45 |
· Estimate |
· 估计这个任务需要多少时间 |
15 |
20 |
Development |
开发 |
1200 |
1200 |
· Analysis |
· 需求分析 (包括学习新技术) |
150 |
200 |
· Design Spec |
· 生成设计文档 |
30 |
45 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
45 |
60 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
15 |
· Design |
· 具体设计 |
70 |
40 |
· Coding |
· 具体编码 |
700 |
900 |
· Code Review |
· 代码复审 |
150 |
200 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
300 |
150 |
Reporting |
报告 |
150 |
90 |
· Test Report |
· 测试报告 |
50 |
50 |
· Size Measurement |
· 计算工作量 |
15 |
20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
合计 |
3005 |
3365 |
解题思路
第一步,想到徐丽萍老师教的编译原理,第二步,修改编译原理词法源程序,第三步,不会的请教寝室大佬,这样就昨完了基本功能。关于扩展功能,参考和借鉴了寝室张武科哥大佬的项目,在他的基础上进行修改而形成了本项目,相同内容的版权归原作者所有,并在此对上述大佬表示衷心感谢。
程序设计实现过程
根据编译原理改变,只能用C语言实现,单词行数等都用递归下降分析法完成。扩展功能参考张大佬的项目,理解后再修改实现。
代码说明
核心代码采用递归下降分析,沿用上学期的开发项目,降低开发成本。
1 int count()//统计单词数、行数、注释行数 2 { 3 get(); 4 clearToken(); 5 while (isSpace(ch) || isNewline(ch) || isTab(ch) || isComma(ch)) 6 { 7 if (isNewline(ch)) line_num++; 8 get(); 9 } 10 if (isStar(ch)) 11 { 12 catToken(ch); 13 } 14 else if (isDivi(ch)) 15 { 16 catToken(ch); 17 get(); 18 if (isStar(ch)) 19 { 20 note_num++; 21 catToken(ch); 22 do 23 { 24 do 25 { 26 get(); 27 if (isNewline(ch)) 28 { 29 note_num++; 30 line_num++; 31 } 32 33 } while (!isStar(ch)); 34 do 35 { 36 get(); 37 if (isNewline(ch)) 38 { 39 note_num++; 40 line_num++; 41 } 42 if (isDivi(ch)) 43 { 44 catToken(ch); 45 return 0; 46 } 47 } while (isStar(ch)); 48 } while (!isStar(ch)); 49 } 50 if (isDivi(ch)) 51 { 52 catToken(ch); 53 do 54 { 55 get(); 56 } while (!isNewline(ch)); 57 note_num++; 58 } 59 if (isNewline(ch)) 60 line_num++; 61 } 62 else if (isEnd(ch)) 63 return 0; 64 else 65 { 66 while (!(isSpace(ch) || isNewline(ch) || isTab(ch) || isComma(ch) || isDivi(ch))) 67 { 68 catToken(ch); 69 get(); 70 } 71 retract(); 72 if(strcmp(stopWord, "") == 0 || strcmp(token,stopWord)!=0) 73 word_num++; 74 }
没有回溯和左递归,顺着检测即可,获取停用词后,检测到停用词就++。
void none()//统计空行数 { int i,j = 0; for (i = 0;; i++) { if (art[i] == EOF) break; if (art[i] != '\n'&& art[i] != '\t'&& art[i] != ' ') { j++; } if (art[i] == '\n') { if (j <= 1) none_num++; j = 0; } } }
没有或者只有一个字符,判定为空行
输出输入与格式控制等省略
测试设计过程
测试程序整合在主函数中,参数有任意个,并且部分参数在一起才有意义,如-e 和 -w,部分参数单独无意义,如-s,由于代码原因,考虑参数先后顺序,如-o最低,-s其次,在此基础上做排列组合即可。因为是有穷自动机,存在部分字符无法识别导致出错的问题,需要注意。以下例举对老师给的file.c的部分测试及测试结果:
测试:
测试结果: