编译原理课程设计报告Word格式.docx
《编译原理课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计报告Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
2015年6月15日
1课程设计目标
1.1实用性分析
系统基本上实现了Cminus的词法分析器和语法分析器的功能,在词法分析阶段,能正确识别词法单元Token,遇到非法字符和不匹配token时能准确定位错误的位置和发生错误的原因。
在语法分析部分能由词法分析器的正确输入得到源文件的语法分析树。
1.2要求
开发环境:
Ubuntu14.04LTS+eclipse+GCC
运行环境:
Win7/Ubuntu/WindowsXP
1.3目标
实现Cminus的词法分析器和语法分析器
2分析与设计
2.1系统设计思想
根据Cminus的语法定义得到正则表达式,转换为NFA后化简为DFA,从而实现语言的词法分析器,使用递归下降程序分析定义和实现语言的文法,实现语言的语法分析器,在词法分析阶段通过DFA定义了简单从错误处理功能,如Token不匹配等错误,可以定位错误发生的位置行数以及错误发生的原因。
2.2程序流程图
否
是
否
是
2.3词法分析
2.3.1token的类型
typedefenum
{
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,LZGH,RZGH,LDGH,RDGH,//特殊字符
}TokenType;
2.3.2DFA分析
//DFA中的状态
START,//开始状态
INID,
INNUM,
DONE,
INASSIGN,
INCOMMENT,//注释状态
ZHU,
ZZHU
}StateType;
2.3.3代码结构分析
2.4语法分析
2.4.1节点的定义和类型
typedefenum{Stmtk,Expk}Nodekind;
typedefenum{IfK,ElseK,IntK,ReturnK,VoidK,WhileK,AssignK,HanK,HanshutiK}Stmtkind;
typedefenum{Opk,Constk,Idk,Vark}Expkind;
typedefenum{Void,Integer,Boolean}ExpType;
typedefstructtreeNode
structtreeNode*child[MAXCHILDREN];
structtreeNode*sibling;
intlineno;
Nodekindnodekind;
union{Stmtkindstmt;
Expkindexp;
}kind;
union{TokenTypeop;
intval;
char*name;
}attr;
ExpTypetype;
}TreeNode;
2.4.2递归下降语法分析
根据Cminus的语法规则得到BNF如下:
program->
declaration-list
declaration-list->
declaration-listdeclaration|declaration
declaration->
var-declaration|fun-declaration
var-declaration->
type-specifierID;
|type-specifierID[NUM];
type-specifier->
int|void
fun-declaration->
type-specifierID(params)|compound-stmt
params->
param-list|void
param-list->
param-list,param|param
param->
type-specifierID|type-specifierID[]
compound-stmt->
{local-declarationsstatement-list}
local-declarations->
local-declarationsvar-declaration|empty
statement-list->
statement-liststatement|empty
statement->
expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmt
expression-stmt->
expression;
|;
selection-stmt->
if(expression)statement|if(expression)statementelsestatement
iteration-stmt->
while(expression)statement
return-stmt->
return;
|returnexpression;
expression->
var=expression|simple-expression
var->
ID|ID[expression]
simple-expression->
additive-expressionrelopadditive-expression|additive-expression
relop->
<
=|<
|>
=|==|!
=
additive-expression->
additive-expressionaddopterm|term
addop->
+|-
term->
termmulopfactor|factor
mulop->
*|/
factor->
(expression)|var|call|NUM
call->
ID(args)
args->
arg-list|empty
arg-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用于进行词法分析。
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的词法分析器和语法分析器,掌握了编译原理的理论知识,通过动手实现练习了正则表达式的设计,从正则表达式到NFA再到DFA的转换,理解了BNF文法和文法的二义性的消除。
在词法分析过程中掌握了基本的调试功能。
通过语法分析,理解了递归下降分析和LL
(1)文法。
在调试过程中体验到了合作的作用,尤其是在debug的时候,能从不同的角度去检查代码可以加快bug的排查。
在练习过程中学学习到了工程化开发方法。
同时,项目尝试在Ubuntu下完成,更加充分地学习了Linux系统的用法和特色。
5.2特色
1、代码整洁清晰,结构化和规范化,有完整的注释和说明,输出结果完整清晰,便于调试和查看修改。
2、可以选择将输出重定向到其他文件,如使用如下shell命令运行:
./cminusinput.cm[output]#其中output为可选的输出文件名
3、程序识别文件名,只接收后缀名为.cm为源文件,可以在输入阶段对源文件进行关联。
5.3不足
1、只实现了基本的功能,不能检查token不匹配以外的更多错误。
在语法分析阶段,如果词法分析并没有得到正确的结果,在某些情况下(如注释不匹配)可能会出现出现无限循环,使输出文件一直增大,造成出现卡死。
2、程序的实现参考了书本中的tiny的源码实现,对其中部分不完善和不适用的部分进行了改进,但仍然出现了很多隐藏的bug,所幸的是程序能正常实现功能。
3、由于时间有限,系统只采用了递归下降分析来实现,没有通过多种方法类对比实验结果,可能会出现其他未知的错误。