编译原理课程设计报告-6_第1页
编译原理课程设计报告-6_第2页
编译原理课程设计报告-6_第3页
编译原理课程设计报告-6_第4页
编译原理课程设计报告-6_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理课程设计报告课题名称:C-语言扫描器和分析器提交文档学生姓名: 提交文档学生学号: 同组成员名单: 指导教师姓名: 指导教师评阅成绩:指导教师评阅意见: 提交报告时间:2015年6月15日1课程设计目标1.1实用性分析 系统基本上实现了Cminus的词法分析器和语法分析器的功能,在词法分析阶段,能正确识别词法单元Token,遇到非法字符和不匹配token时能准确定位错误的位置和发生错误的原因。在语法分析部分能由词法分析器的正确输入得到源文件的语法分析树。1.2要求 开发环境:Ubuntu14.04LTS+eclipse+GCC 运行环境:Win7/Ubuntu/WindowsXP1.3目标 实现Cminus的词法分析器和语法分析器2分析与设计2.1系统设计思想 根据Cminus的语法定义得到正则表达式,转换为NFA后化简为DFA,从而实现语言的词法分析器,使用递归下降程序分析定义和实现语言的文法,实现语言的语法分析器,在词法分析阶段通过DFA定义了简单从错误处理功能,如Token不匹配等错误,可以定位错误发生的位置行数以及错误发生的原因。源文件2.2程序流程图源文件逐行读取源文件逐行读取源文件读取一个字符 否读取一个字符输出错误信息输出错误信息DONE?DONE? 是mmatch(token)是否合法 否 是否合法printToken()是printToken()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中的状态typedefenum{ 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-listdeclaration-list->declaration-listdeclaration|declarationdeclaration->var-declaration|fun-declarationvar-declaration->type-specifierID;|type-specifierID[NUM];type-specifier->int|voidfun-declaration->type-specifierID(params)|compound-stmtparams->param-list|voidparam-list->param-list,param|paramparam->type-specifierID|type-specifierID[]compound-stmt->{local-declarationsstatement-list}local-declarations->local-declarationsvar-declaration|emptystatement-list->statement-liststatement|emptystatement->expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmtexpression-stmt->expression;|;selection-stmt->if(expression)statement|if(expression)statementelsestatementiteration-stmt->while(expression)statementreturn-stmt->return;|returnexpression;expression->var=expression|simple-expressionvar->ID|ID[expression]simple-expression->additive-expressionrelopadditive-expression|additive-expressionrelop-><=|<|>|>=|==|!=additive-expression->additive-expressionaddopterm|termaddop->+|-term->termmulopfactor|factormulop->*|/factor->(expression)|var|call|NUMcall->ID(args)args->arg-list|emptyarg-list->arg-list,expression|expression2.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.cm4.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、只实现了基本的功能,不能检查to

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论