1、 2015年 6月15 日1 课程设计目标 1.1实用性分析 系统基本上实现了Cminus的词法分析器和语法分析器的功能,在词法分析阶段,能正确识别词法单元Token,遇到非法字符和不匹配token时能准确定位错误的位置和发生错误的原因。在语法分析部分能由词法分析器的正确输入得到源文件的语法分析树。 1.2 要求 开发环境:Ubuntu 14.04 LTS + eclipse + GCC 运行环境:Win7 / Ubuntu / Windows XP 1.3目标 实现Cminus的词法分析器和语法分析器2 分析与设计 2.1系统设计思想 根据Cminus的语法定义得到正则表达式,转换为NFA后
2、化简为DFA,从而实现语言的词法分析器,使用递归下降程序分析定义和实现语言的文法,实现语言的语法分析器,在词法分析阶段通过DFA定义了简单从错误处理功能,如Token不匹配等错误,可以定位错误发生的位置行数以及错误发生的原因。 2.2程序流程图 否 是 否 是 2.3词法分析 2.3.1 token的类型typedef enum ENDFILE,ERROR, IF,ELSE,INT,RETURN,VOID,WHILE, /关键字 ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,BT,LQ,BQ, UEQ,DOU,LZG
3、H,RZGH,LDGH,RDGH,/特殊字符 TokenType; 2.3.2 DFA分析/DFA中的状态 START, / 开始状态 INID, INNUM, DONE, INASSIGN, INCOMMENT, / 注释状态 ZHU, ZZHU StateType; 2.3.3 代码结构分析 2.4 语法分析 2.4.1 节点的定义和类型typedef enum Stmtk,Expk Nodekind;typedef enum IfK,ElseK,IntK,ReturnK,VoidK,WhileK,AssignK,HanK,HanshutiK Stmtkind;typedef enum O
4、pk,Constk,Idk,Vark Expkind;typedef enum Void,Integer,Boolean ExpType;typedef struct treeNode struct treeNode*childMAXCHILDREN; struct treeNode*sibling; int lineno; Nodekind nodekind; union Stmtkind stmt; Expkind exp; kind; union TokenType op; int val; char*name; attr; ExpType type; TreeNode; 2.4.2递归
5、下降语法分析 根据Cminus的语法规则得到BNF如下:program - declaration-listdeclaration-list - declaration-list declaration | declarationdeclaration - var-declaration | fun-declaration var-declaration - type-specifier ID; | type-specifier ID NUM;type-specifier - int | void fun-declaration - type-specifier ID(params) | co
6、mpound-stmtparams - param-list | voidparam-list - param-list , param | paramparam - type-specifier ID | type-specifier IDcompound-stmt - local-declarations statement-listlocal-declarations - local-declarations var-declaration | emptystatement-list - statement-list statement | emptystatement - expres
7、sion-stmt | compound-stmt | selection-stmt | iteration-stmt | return-stmtexpression-stmt - expression ; | ;selection-stmt - if(expression) statement | if(expression) statement else statementiteration-stmt - while(expression) statementreturn-stmt - return; | return expression;expression - var = expre
8、ssion | simple-expressionvar - ID | IDexpressionsimple-expression - additive-expression relop additive-expression | additive-expressionrelop - = | = | = | != additive-expression - additive-expression addop term | termaddop - + | -term - term mulop factor | factormulop - * | /factor - (expression) |
9、var | call | NUMcall - ID(args)args - arg-list | emptyarg-list - arg-list, expression | expression 2.4.3 代码结构分析 1、在globals.h中定义Token类型、语法分析树节点类型、DFA状态和lineno等全局变量。 2、在util.h 和util.c中定义和实现了printToken、newStmtNode、newExpNode、copyString、printSpace、printTree几个工具函数。 3、在scan.h 和 scan.c 中定义和实现了getToken用于进行词
10、法分析。 4、在parse.h 和 parse.c中定义和实现了parse函数以及文法的实现函数。 5、最后再main.c中进行调用和调试。3 程序代码实现 见附件4 测试结果 4.1测试数据选择 测试用例为课本中C-的程序例子: test.cm 4.2 测试结果分析 4.2.1词法分析测试 1. 正确结果: 2.当注释不匹配时,词法分析会报错,如下图所示: 3.当出现非法字符时(C-语言中不可能出现的字符),会报错,如下图所示: 4.2.2 词法分析测试 1.正确结果 2. 当语法分析阶段出现错误时,语法树的生成将会终止。5 总结 5.1收获 通过实现Cminus的词法分析器和语法分析器,掌
11、握了编译原理的理论知识,通过动手实现练习了正则表达式的设计,从正则表达式到NFA再到DFA的转换,理解了BNF文法和文法的二义性的消除。在词法分析过程中掌握了基本的调试功能。 通过语法分析,理解了递归下降分析和LL(1)文法。 在调试过程中体验到了合作的作用,尤其是在debug的时候,能从不同的角度去检查代码可以加快bug的排查。在练习过程中学学习到了工程化开发方法。同时,项目尝试在Ubuntu下完成,更加充分地学习了Linux系统的用法和特色。 5.2特色 1、代码整洁清晰,结构化和规范化,有完整的注释和说明,输出结果完整清晰,便于调试和查看修改。 2、可以选择将输出重定向到其他文件,如使用
12、如下shell命令运行: ./cminus input.cm output #其中output 为可选的输出文件名 3、程序识别文件名,只接收后缀名为.cm 为源文件,可以在输入阶段对源文件进行关联。 5.3不足 1、只实现了基本的功能,不能检查token不匹配以外的更多错误。在语法分析阶段,如果词法分析并没有得到正确的结果,在某些情况下(如注释不匹配)可能会出现出现无限循环,使输出文件一直增大,造成出现卡死。 2、程序的实现参考了书本中的tiny的源码实现,对其中部分不完善和不适用的部分进行了改进,但仍然出现了很多隐藏的bug,所幸的是程序能正常实现功能。 3、由于时间有限,系统只采用了递归下降分析来实现,没有通过多种方法类对比实验结果,可能会出现其他未知的错误。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1