1、 编译原理课程设计报告 计算机学院 计科x班 xxx 094304xxxx编译原理课程设计报告课题名称: C-词法扫描器及语法分析器实现 提交文档学生姓名: XXX 提交文档学生学号: 0943041XXX 同组 成 员 名 单: 无 指导 教 师 姓 名: 张 兵 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2012年 6月 2日目录1 课程设计目标32 分析与设计42.1 程序结构42.2 程序流程53 词法分析63.1 代码结构分析63.2 Token定义73.2.1 Token的定义和类型73.2.2 Token的种别码73.3 DAF分析83.3.1 删除注释DFA
2、83.3.2 词法分析DFA104 语法分析144.1 代码结构分析144.2 节点定义154.2.1 节点定义和类型154.2.2 各类型节点的描述164.3 递归向下语法分析164.3.1 C-文法164.3.2 递归向下分析过程175 测试结果345.1 流程345.2 词法分析结果345.3 词法分析出错385.4 语法分析结果395.5 语法分析出错416 总结426.1 词法分析编写过程426.2 语法分析编写过程436.3 成果和收获437 附录447.1 scanner.h源文件447.2 scanner.cpp源文件457.3 parser.h源文件557.4 parser.
3、cpp源文件561 课程设计目标学生在学习编译原理课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C+语言描述及上机调试,实现一个 C-Minus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。 要求:(1)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:a. 具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;b. 能够拼出语言中的各个单词;c. 返回(种别码
4、, 属性值)。(2)语法分析要求用学习过的自底向上或自顶向下的分析方法等,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。2 分析与设计2.1 程序结构本节主要分析程序的代码结构和代码工程文件的划分。(程序由两个类组成: Scanner类和Parser类,分别为词法分析和语法分析类。工程分为四个文件:scanner.h、scanner.cpp、parser.h、parser.cpp,分别对应Scanner类和Parser类的声明和实现文件)。本程序采用C+语言以面向对象的思想编写,
5、程序分为两部分:词法分析(Scanner)和语法分析(Parser),分别将两个处理阶段封装成Scanner类和Parser类,两个类各司其职,分别完成词法分析和语法分析的任务。Scanner类主要的工作是过滤注释、词法分析获取Token。Parser类的主要工作是根据Scanner类词法分析之后的Token进行语法分析,生成语法树,最后并输出语法树。在处理过程中,Scanner类的对象作为Parser类的一个成员变量,配合Parser类进行语法分析。工程文件总体上是按照两个类的格局分为四个文件,分别是两个类的声明文件和实现文件。四个文件分别为scanner.h和scanner.cpp以及pa
6、rser.h和parser.cpp,他们分别是Scanner类声明文件、Scanner类实现文件、Parser类声明文件、Parser类实现文件。词法分析scanner.h:与词法分析相关的类(Scanner类)的声明scanner.cpp:词法分析阶段类(Scanner类)的实现语法分析parser.h:与语法分析相关的类(Parser类)的声明parser.cpp:语法分析阶段类(Parser类)的实现2.2 程序流程在程序中,Scanner类的对象(scanner)作为Parser类中的一个成员变量,配合Parser类进行语法分析。它们的关系是这样的:Parser类的一个成员变量scan
7、ner首先对源程序删除注释,然后进行词法分析获取所有Token,并将获取的Token存储在scanner对象的tokenList(vector类型)中。然后Parser类的语法分析程序就根据tokenList中的Token进行语法分析,生成语法树,最后打印语法树。同时,这也是程序的流程。整体程序流程图开始删除注释出错词法分析TF结束语法分析出错出错输出出错信息TFFT从文件获取源代码3 词法分析3.1 代码结构分析词法分析阶段的代码被封装成一个类Scanner,scanner.h中主要是Scanner类的声明代码,scanner.cpp中主要是Scanner类的实现代码。Scanner类对外提
8、供的函数主要有:getSourseStringFromFile(string s)(从文件中获取待分析的源代码)、deleteComments()(过滤注释)、scan()(词法分析主程序)。词法分析的过程主要是:l Scanner调用getSourseStringFromFile(string s),从文件中获取待分析的源代码l Scanner调用deleteComments(),将注释过滤掉,如果注释出错,则不进行词法分析l Scanner调用scan(),进行词法分析,将分析得到的所有Token保存在Scanner类的成员变量tokenList中,以备语法阶段调用,并将Token输出到文
9、件Token.txt中以上三个函数构成了词法分析的骨架,在Scanner类中还有其他成员变量和函数,主要作为这三个函数处理过程的中间步骤,为这三个函数服务。Scanner类的代码结构和主要的成员变量和函数如下图所示:其他函数和成员变量的作用和含义:l void backToLastChar():在词法分析过程中,回退一个字符l DFAState charType(char):返回字符的类型(按状态分),如white space返回START,0-9返回NUMl char getNextChar():获取到下一个字符l Token getTokenAt(int):根据下标从tokenList数组
10、中获取词法分析后所保存的Token(供语法分析阶段调用)l void printToken():将词法分析好的Token输出到文件Token.txt中l TokenType returnTokenType(string s):根据字符串返回对应的31种Token类型,如字符串int将返回INT, var将返回IDl int charIndex:配合getNextChar()和backToLastChar()使用(分别自增和自减1),用以指示当前待分析的char在源代码中的位置l bool commentFlag:标注注释开始的标志,为true时表示正在注释体内,即源代码进入/*之后且*/之前的
11、状态l int lineCount:对行号计数,表示当前词法分析在源代码的行位置(每次获取到的char为/n就自增1)l bool scanSuccess:词法分析是否成功的标志l string sourseString:获取源代码的字符串l string str:在分析过程中保存Token对应的串l vector tokenList:保存Token序列3.2 Token定义3.2.1 Token的定义和类型Token定义:/定义的Token结构体,包括类型、对应的串、所在代码的行号struct TokenTokenType tokenType;string tokenString;int l
12、ineNo;Token类型(TokenType):程序中,将Token的类型分为31种,分别对应于else、if、int、return、void、while、+、-、*、/、=、=、!=、=、;、,、(、)、/*、*/、num、id、错误、文件结束,TokenType的定义和种别码分别如下所示:/定义的Token的类型(31种),分别对应于else、if、int、return、void、while、+、-、*、/、=、=、!=、=、;、,、(、)、/*、*/、num、id、错误、结束typedef enumELSE = 1,IF,INT,RETURN,VOID,WHILE,PLUS,MINUS
13、,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LMBRACKET, RMBRACKET,LBBRACKET,RBBRACKET,LCOMMENT,RCOMMENT,NUM,ID,ERROR,ENDFILE TokenType;3.2.2 Token的种别码TokenType的种别码如下表所示,共31种单词符号种别码Value单词符号种别码ValueelseELSE1=ASSIGN17ifIF2;SEMI18intINT3,COMMA19returnRETURN4(LPAREN20voidVOID5)RPAREN21whileWHILE6LMBRACKET22+PLUS7RMBRACKET23-MINUS8LBBRACKET24*TIMES9RBBRACKET25/OVER10/*LCOMMENT26LT11*/RCOMMENT27GT13idID29=GEQ14错误ERROR30=EQ15结束ENDFILE31!=NEQ163.3 DAF分析由于词法分析程序分为两个步骤处理:删除注释和词法分析获取T
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1