结对编程--C语言子程序词法分析
一、问题描述
- C语言小子集表的定义

- C语言小子集表的定义
2.设计单词属性值,各类表格(表示标识符表、常量表),单词符号及机内表示,采用标准输入和输出的方式。程序从键盘接收代码,遇到代码结束符“#”时结束,并将词法分析的结果输出到屏幕上。要求实现:
- (1)对正确源程序的识别;
- (2)对包含有注释//和/* */的源程序的识别;
- (3)对包含错误标识符的源程序的识别。
二、审查表
代码 Conding链接
| 功能模块名称 | c语言小子集的词法分析 | ||
| 审查人 | 王屹超 | 审查日期 | 2018.4.5 |
| 代码名称 | c语言小子集的词法分析 | 代码作者 | 周磊 |
| 文件结构 | |||
| 重要性 | 审查项 | 结论 | |
| 头文件和定义文件的名称是否合理? | 是 | ||
| 头文件和定义文件的目录结构是否合理? | 是 | ||
| 版权和版本声明是否完整? | 否 | ||
| 重要 | 头文件是否使用了 ifndef/define/endif 预处理块? | 是 | |
| 头文件中是否只存放“声明”而不存放“定义” | 是 | ||
| 程序的版式 | |||
| 重要性 | 审查项 | 结论 | |
| 空行是否得体? | 是 | ||
| 代码行内的空格是否得体? | 是 | ||
| 长行拆分是否得体? | 是 | ||
| “{” 和 “}” 是否各占一行并且对齐于同一列? | 是 | ||
| 重要 | 一行代码是否只做一件事?如只定义一个变量,只写一条语句。 | 否 | |
| 重要 | If、for、while、do等语句自占一行,不论执行语句多少都要加 “{}”。 | 否 | |
| 重要 | 在定义变量(或参数)时,是否将修饰符 * 和 & 紧靠变量名?注释是否清晰并且必要? | 是 | |
| 重要 | 注释是否有错误或者可能导致误解? | 否 | |
| 重要 | 类结构的public, protected, private顺序是否在所有的程序中保持一致? | 是 | |
| 命名规则 | |||
| 重要性 | 审查项 | 结论 | |
| 重要 | 命名规则是否与所采用的操作系统或开发工具的风格保持一致? | 是 | |
| 标识符是否直观且可以拼读? | 是 | ||
| 标识符的长度应当符合“min-length && max-information”原则? | 是 | ||
| 重要 | 程序中是否出现相同的局部变量和全部变量? | 否 | |
| 类名、函数名、变量和参数、常量的书写格式是否遵循一定的规则? | 是 | ||
| 静态变量、全局变量、类的成员变量是否加前缀? | 是 | ||
| 表达式与基本语句 | |||
| 重要性 | 审查项 | 结论 | |
| 重要 | 如果代码行中的运算符比较多,是否已经用括号清楚地确定表达式的操作顺序? | 是 | |
| 是否编写太复杂或者多用途的复合表达式? | 是 | ||
| 重要 | 是否将复合表达式与“真正的数学表达式”混淆? | 否 | |
| 重要 | 是否用隐含错误的方式写if语句? | 否 | |
| 否 | (1)将布尔变量直接与TRUE、FALSE或者1、0进行比较。 | 否 | |
| (2)将浮点变量用“==”或“!=”与任何数字比较。 | 否 | ||
| (3)将指针变量用“==”或“!=”与NULL比较。 | 否 | ||
| 如果循环体内存在逻辑判断,并且循环次数很大,是否已经将逻辑判 | 否 | ||
| 断移到循环体的外面? | 否 | ||
| 重要 | Case语句的结尾是否忘了加break? | 未使用 | |
| 重要 | 是否忘记写switch的default分支? | 未使用 | |
| 重要 | 使用goto 语句时是否留下隐患? 例如跳过了某些对象的构造、变量的初始化、重要的计算等。 | 未使用 | |
| 常量 | |||
| 重要性 | 审查项 | 结论 | |
| 是否使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串? | 是 | ||
| 在C++ 程序中,是否用const常量取代宏常量? | 否 | ||
| 重要 | 如果某一常量与其它常量密切相关,是否在定义中包含了这种关系? | 否 | |
| 是否误解了类中的const数据成员?因为const数据成员只在某个对象 | 否 | ||
| 生存期内是常量,而对于整个类而言却是可变的。 | 否 | ||
| 函数设计 | |||
| 重要性 | 审查项 | 结论 | |
| 参数的书写是否完整?不要贪图省事只写参数的类型而省略参数名字。 | 是 | ||
| 参数命名、顺序是否合理? | 是 | ||
| 参数的个数是否太多? | 是 | ||
| 是否使用类型和数目不确定的参数? | 否 | ||
| 是否省略了函数返回值的类型? | 是 | ||
| 函数名字与返回值类型在语义上是否冲突? | 否 | ||
| 重要 | 是否将正常值和错误标志混在一起返回?正常值应当用输出参数获得,而错误标志用return语句返回。 | 否 | |
| 重要 | 在函数体的“入口处”,是否用assert对参数的有效性进行检查? | 否 | |
| 重要 | 使用滥用了assert? 例如混淆非法情况与错误情况,后者是必然存在的并且是一定要作出处理的。 | 否 | |
| 重要 | return语句是否返回指向“栈内存”的“指针”或者“引用”? | 否 | |
| 是否使用const提高函数的健壮性?const可以强制保护函数的参数、返回值,甚至函数的定义体。“Use const whenever you need” | 否 | ||
| 内存管理 | |||
| 重要性 | 审查项 | 结论 | |
| 重要 | 用malloc或new申请内存之后,是否立即检查指针值是否为NULL?(防止使用指针值为NULL的内存) | 是 | |
| 重要 | 是否忘记为数组和动态内存赋初值?(防止将未被初始化的内存作为右值使用) | 是 | |
| 重要 | 数组或指针的下标是否越界? | 否 | |
| 重要 | 动态内存的申请与释放是否配对?(防止内存泄漏) | 是 | |
| 重要 | 是否有效地处理了“内存耗尽”问题? | 否 | |
| 重要 | 是否修改“指向常量的指针”的内容? | 否 | |
| 重要 | 是否出现野指针?例如(1)指针变量没有被初始化;(2)用free或delete释放了内存之后,忘记将指针设置为NULL。 | 否 | |
| 重要 | 是否将malloc/free 和 new/delete 混淆使用? | 否 | |
| 重要 | malloc语句是否正确无误?例如字节数是否正确?类型转换是否正 确? | 否 | |
| 重要 | 在创建与释放动态对象数组时,new/delete的语句是否正确无误? | 未使用 | |
| 其它常见问题 | |||
| 重要性 | 审查项 | 结论 | |
| 重要 | 数据类型问题: | ||
| (1)变量的数据类型有错误吗? | 否 | ||
| (2)存在不同数据类型的赋值吗? | 否 | ||
| (3)存在不同数据类型的比较吗? | 否 | ||
| 重要 | 变量值问题: | ||
| (1)变量的初始化或缺省值有错误吗? | 否 | ||
| (2)变量发生上溢或下溢吗? | 否 | ||
| (3)变量的精度够吗? | 是 | ||
| 重要 | 逻辑判断问题: | ||
| (1)由于精度原因导致比较无效吗? | 否 | ||
| (2)表达式中的优先级有误吗? | 否 | ||
| (3)逻辑判断结果颠倒吗? | 否 | ||
| 重要 | 循环问题: | ||
| (1)循环终止条件不正确吗? | 否 | ||
| (2)无法正常终止(死循环)吗? | 否 | ||
| (3)错误地修改循环变量吗? | 否 | ||
| (4)存在误差累积吗? | 否 | ||
| 重要 | 错误处理问题: | ||
| (1)忘记进行错误处理吗? | 否 | ||
| (2)错误处理程序块一直没有机会被运行? | 否 | ||
| (3)错误处理程序块本身就有毛病吗?如报告的错误与实际错误不一致,处理方式不正确等等。 | 否 | ||
| (4)错误处理程序块是“马后炮”吗?如在被它被调用之前软件已经出错。 | 否 | ||
| 重要 | 文件I/O问题: | ||
| (1)对不存在的或者错误的文件进行操作吗? | 否 | ||
| (2)文件以不正确的方式打开吗? | 否 | ||
| (3)文件结束判断不正确吗? | 否 | ||
| (4)没有正确地关闭文件吗? | 否 | ||
三、总结
1.程序注释
大部分的程序没有注释,在重新阅读的过程中就需要重新分析程序的执行过程,这个过程占用了很多时间,对于源程序的注释修改给出以下修改部分
```C//deal '//' and '/* /'
if(ch =='/')
{
ch = Nike[Nummber++];
switch(ch)
{
//find //
case'/':
flag++;
while(Nike[Nummber]!='\n')
Nummber++;
Var = -3;//set Var
break;
//find /
case'':
flag ++;
while((Nike[Nummber]!='')&&(Nike[Nummber+1]!='/'))
Nummber++;
Var = -3;//set Var
Nummber = Nummber+2;
ch = Nike[Nummber];
break;
//'/' only a symble
default:
Var = 6;
Save[M++]=ch;
break;
}```
修改部分代码 Coding链接
2.心得总结
C语言小子集程序的词法分析是我们编译原理课程的一次实验内容,对于算法的印象早已经模糊不清,这次重审队友代码让我充分意识到了注释对于代码重审,或者说后期维护的重要性。它不仅可以提高阅读效率,也使我们思路更加清晰。
通过阅读周磊同学的代码,我能够感受到他解决此次问题的思路是非常清晰的,代码的整体逻辑性也非常好,在重申同学代码的同时我也在反思自己,一方面自己应该注重算法逻辑方面的学习,让程序更加高效的执行。另一方面,在代码风格,命名格式等等一些团队项目上甚至自己日常编程中,一定要遵从标准的代码编程规范,让代码重审、程序维护更易更高效。
结对编程--C语言子程序词法分析的更多相关文章
- 结对编程项目——C语言实现WordCount Web化
结对编程项目 代码地址 201631062219,201631011410 gitee项目地址:https://gitee.com/xxlznb/pair_programming 作业地址:https ...
- 结对编程项目——四则运算vs版
结对编程项目--四则运算vs版 1)小伙伴信息: 学号:130201238 赵莹 博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...
- 结对编程—黄金点游戏WinForm单机版
本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...
- 结对编程——关于Fault、Error、Failure程序设计
一.问题描述: 构造程序,分别是: •不能触发Fault •触发Fault,但是不能触发Error •触发Error,但是不能产生Fai ...
- GUI、模块化与结对编程(homework-03)
摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...
- BJDP结对编程活动
7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1. 金锐分享单元测试的Mocking技术,20 mins 2. 伍 ...
- 结对编程1-四则运算(基于GUI)
林晓芳201421123092.陈惠201421123096 coding 地址:https://git.coding.net/lianlian/92.96.1.git 一.题目描述 我们在个人作业1 ...
- 结对编程1 —— 基于GUI和Swing的四则运算题目生成器
合作伙伴 201421123102 王艳秋 201421123106 陈 雄 代码地址 题目描述 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI( ...
- 结对编程四则运算gui
码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...
随机推荐
- SQL Server 当表分区遇上唯一约束(转载)
一.前言 我已经在高兴对服务器创建了表分区并且获得良好性能和自动化管理分区切换的时候,某一天,开发人员告诉我,某表的两个字段的数据不唯一,需要为这两个字段创建唯一索引的时候,这一切就变得不完美了.列的 ...
- 无法获取链接服务器 "XXX" 的 OLE DB 访问接口 "SQLNCLI10" 的架构行集 "DBSCHEMA_TABLES_INFO"。该访问接口支持该接口,但使用该接口时返回了失败代码。
1. SQL 2000 下载补丁 SQL2KSP4 ,进行安装 2.找到SQL2KSP4\install\instcat.sql 并在sql2000 中打开查询分析器中执行
- 运维安全之Tripwire
转自网络 Tripwire是最为著名的unix下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来. 当文件现在的数字签名与保留的数字签名不一致时,那 ...
- 1.4环境的准备(四)之Pycharm的使用技巧
返回总目录 目录: 1.快捷键的使用: 2.提示技巧: 3.其他技巧: (一)快捷键的使用: (1)Pycharm自带默认的快捷键 1.Ctrl + C 复制 2.Ctrl + V 粘贴 3.Ctrl ...
- 团队作业——Alpha冲刺 5/12
团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:编辑界面完成部分内容,学习了下拉菜单控件的建立,完善界面标题内容,以及交互. 明日任务:继续完善编辑界面,学习使用gallery,着手配图 ...
- sourceTree跳过注册
sourceTree是一个很方便的git管理工具,但是现在一直无法注册,本文记录了跳过注册的方法. 将下面的代码赋值到地址栏 %LocalAppData%\Atlassian\SourceTree\ ...
- world转html在线编辑器
轻量富文本编辑器插件:http://fex.baidu.com/ueditor/ http://ueditor.baidu.com/website/onlinedemo.html
- HTML5音/视频标签详解
一.发展历: 早期:<embed>+<object>+文件 问题:不是所有浏览器都支持,而且embed不是标准. 现状:Realplay.window media.Qu ...
- Linux第三课——目录操作
ls 列出目录下的文件及子目录 ls -l 以列表的方式显示详细信息 ls -a 显示所有的 包括隐藏文件 ls -A 显示除了 . ..以外的任何文件 ls -i 显示文件的节点号 ls --col ...
- splay专题复习——bzoj 3224 & 1862 & 1503 题解
[前言]快要省选二试了.上次去被虐出翔了~~这次即便是打酱油.也要打出风採! 于是暂停新东西的学习,然后開始复习曾经的知识.为骗分做准备.PS:区间翻转的临时跳过,就算学了也来不及巩固了. [BZOJ ...