资源描述:
《大学毕设论文__cminus词法分析和语法分析设计编译器编译原理设计.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、编译原理课程设计报告课题名称:C-Minus词法分析和语法分析设计提交文档学生姓名:XXX提交文档学生学号:XXXXXXXXXX同组成员名单:XXX指导教师姓名:XX指导教师评阅成绩:指导教师评阅意见:..提交报告时间:2015年6月10日1.课程设计目标实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。2.分析与设计C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。2.1、扫描程序scanner部分2.1.1系统设计思想设计思想:根据DFA图用switch-case结构实现状态转换。惯用词法
2、:① 语言的关键字:elseifintreturnvoidwhile② 专用符号:+-*/<<=>>===!==;,()[]{}/**/③ 其他标记是ID和NUM,通过下列正则表达式定义:ID=letterletter*NUM=digitdigit*letter=a
3、..
4、z
5、A
6、..
7、Zdigit=0
8、..
9、9大写和小写字母是有区别的④ 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字。⑤ 注释用通常的C语言符号/*...*/围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套
10、说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。2.1.2程序流程图2.1.3各文件或函数的设计说明扫描程序用到:scanner.h,scanner.cp
11、pØscanner.h:声明词法状态,词法分析//DFA中的状态typedefenum{START=1,INNUM,INID,INDBSYM,DONE}DFAState;//定义的Token的类型(31种),分别对应于else、if、int、return、void、while、+、-、*、/、<、<=、>、>=、==、!=、=、;、,、(、)、[、]、{、}、/*、*/、num、id、错误、结束typedefenum{ELSE=1,IF,INT,RETURN,VOID,WHILE,PLUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,
12、EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LMBRACKET,RMBRACKET,LBBRACKET,RBBRACKET,LCOMMENT,RCOMMENT,NUM,ID,ERROR,ENDFILE}TokenType;//定义的Token结构体,包括类型、对应的串、所在代码的行号structToken{TokenTypetokenType;stringtokenString;intlineNo;};//每种TokenType对应的串,如tokenTypeString[ELSE]=="ELSE"conststring
13、tokenTypeString[32]={"OTHER","ELSE","IF","INT","RETURN","VOID","WHILE","PLUS","MINUS","TIMES","OVER","LT","LEQ","GT","GEQ","EQ","NEQ","ASSIGN","SEMI","COMMA","LPAREN","RPAREN","LMBRACKET","RMBRACKET","LBBRACKET","RBBRACKET","LCOMMENT","RCOMMENT","NUM","ID","ERROR","ENDFILE"};cla
14、ssScanner:定义scanner.cpp中函数Øscanner.cpp文件函数说明voidScanner::scan():设置输出结果界面以及设置各种输出状态。if(scanSuccess==false)cout<<"词法分析出错!"<15、的类型DFAStateScanner::charType(charc)//返回字符的类型typ