资源描述:
《编译原理课程设计--c-编译器词法分析与语法分析的实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、编译原理课程设计报告课题名称:C-编译器词法分析与语法分析的实现提交文档学生姓名:黄臻旸提交文档学生学号:1043041227同组成员名单:无指导教师姓名:金军指导教师评阅成绩:指导教师评阅意见:..提交报告时间:2013年6月5日编译原理课程设计报告11、课程设计目标32、分析与设计32.1、说明所用的方法:32.2、系统总图:32.2.1、scanner部分:32.2.2、parse部分:52.2.3、代码设计说明73、程序代码实现103.1、获取输入部分(在main.c中):103.2、词法分析部
2、分(在scan.c中):103.3、语法分析部分(在parse.c中):153.4、输出与结点的建立(在util.c中)293.5、TokenType、treeNode与结点类型的声明(在globals.h中)344、测试结果365、总结365.1、收获365.2、不足361、课程设计目标本次实验,本C-编译器主要设计并且实现了C-编译器的词法分析功能与语法分析功能。2、分析与设计2.1、说明所用的方法:各部分的实现方法(scanner:手工实现、Lex;parser:递归下降、LL(1)、LR(0)、
3、SLR(1)、LR(1)、LALR(1)、Yacc),所用编程语言实现内容所用的实验方法所用编程语言scanner手工实现C语言parse递归下降C语言2.2、系统总图:2.2.1、scanner部分:2.2.1.1、实验原理:扫描程序的任务是从源代码中读取字符并形成由编译器的以后部分(通常是分析程序)处理的逻辑单元。由扫描程序生成的逻辑单元称作记号(token),将字符组合成记号与在一个英语句子中将字母将字母构成单词并确定单次的含义很相像。在此程序中,我将记号分成了以下类型:typedefenum{/
4、/按照书上附录B程序布局,放在globals.h中ENDFILE,ERROR,IF,ELSE,INT,RETURN,VOID,WHILE,ID,NUM,ASSIGN,PLUS,MINUS,TIMES,OVER,LT,LET,BT,BET,EQ,NEQ,//=+-*/<<=>>===!=LPAREN_1,RPAREN_1,SEMI,COM,LPAREN_2,RPAREN_2,LPAREN_3,RPAREN_3,LIN,RIN//{};,[]()/*}TokenType;其中,关键字有:else、if、in
5、t、return、void、while;专用符号有:+、-、*、/、<、<=、>、>=、==、~=、=、;、,、(、)、[、]、{、}、/*、*/其他标记是ID、NUM,通过下列正则表达式定义:ID=letterletter*NUM=digitdigit*letter=a
6、..
7、z
8、A
9、..
10、Zdigit=0
11、..
12、9小写大写字母是有区别的。空格由空白、换行符和制表符组成。空格通常被忽略,除了他必须分开ID、NUM关键字。注释常用通常的C语言符号/*...*/围起来。注释可以放在任何空白出现的位置(即注
13、释不能放在标记内)上,且可以超过一行。注释不能嵌套。2.2.1.2、实验方法:我通过对scanner部分原理的了解,确定了他的NFA,再将NFA转化成DFA,并且将状态数最小化。最后根据我所得的DFA与课后TINY的示例程序编写scanner.c。最后所得的DFA:2.2.1.3、编程方法:编程采用C语言。初始状态设置为START,当需要得到下一个token时,取得此token的第一个字符,并且按照DFA与对此字符的类型的分析,转换状态。重复此步骤,直到DONE为止,输出token类型。此中难点在于对于
14、注释的分析,因此我将判断注释分成几个步骤。当字符为“/”时,状态转换为INASSIGN_1(自创的)再判断下一个字符,如果为“*”则是注释,如果是其他的则字符停滞与当前字符(ungetNextChar()),并且输出“/”。在开始时一直未注意停滞与当前字符,因此总是读不出“/v*”中的“v”,在调试多次后才得以解决。2.2.2、parse部分:2.2.2.1、实验原理:C-语言的各个语法规则:1.program→declaration-list2.declaration-list→declaration
15、-listdeclaration
16、declaration3.declaration→var-declaration
17、fun-declaration4.var-declaration→type-specifierID;
18、type-specifierID[NUM];5.type-specifier→int
19、void6.fun-declaration→type-specifierID(params)compound-stmt(在课后解释中comp