结对编程--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 王坤彬 - ...
随机推荐
- MySQL应用架构优化-实时数据处理
1.1. 场景 在和开发人员做优化的时候,讨论最多的应该是结合应用场景编写出合适的SQL.并培训开发应该如何编写SQL让MySQL的性能尽量好.但是有一些的场景对于SQL的优化是行不通的. 打个比方, ...
- tcp的半连接与完全连接队列
队列及参数 https://segmentfault.com/a/1190000008224853 server端的半连接队列(syn队列) 在三次握手协议中,服务器维护一个半连接队列,该队列为每个客 ...
- python基础学习10----集合
集合具有无序性,互异性 一.集合的建立 空集合 s=set() s={}#这样默认为是一个空字典 集合内的元素是可哈希的即不可变的数据类型 s={1,2,3,4} s=set([1,2,3,4]) s ...
- python set集合一些基本方法
set集合是一个无序且不重复的元素集合 这个数据类型没有重复的,而且也没有顺序 一些基本的方法: 添加元素 s1 = {11, 22, 33} s1.add(123)#添加一个新的元素 print(s ...
- [Python_5] Python 线程
0. 说明 Python 线程笔记 1. 低级 API # -*-coding:utf-8-*- """ 线程 """ "&quo ...
- 搭建企业级NFS网络文件共享服务
NFS服务简介 NFS是Network File System(网络文件系统).主要功能是通过网络让不同的服务器之间可以共享文件或者目录.NFS客户端一般是应用服务器(比如web,负载均衡等),可以 ...
- 安装和配置Apache服务器(上)
首先,安装软件分安装版和压缩版,压缩版也就是我们现在所说的绿色安装包.安装板和压缩版的区别就是,安装板在安装的时候就已经自动给你配置好环境,压缩版安装之后还要自己配置环境.自己配置环境也是有好处的,知 ...
- 死磕nginx系列-nginx日志配置
nginx access日志配置 access_log日志配置 access_log用来定义日志级别,日志位置.语法如下: 日志级别: debug > info > notice > ...
- MP实战系列(九)之集成Shiro
下面示例是在之前的基础上进行的,大家如果有什么不明白的可以参考MP实战系列的前八章 当然,同时也可以参考MyBatis Plus官方教程 建议如果参考如下教程,使用的技术为spring+mybatis ...
- numpy库数组拼接np.concatenate的用法
concatenate功能:数组拼接 函数定义:numpy.concatenate((a1, a2, ...), axis=0, out=None)