川大编译原理课程设计报告(共80页)

上传人:M****1 文档编号:513687219 上传时间:2023-06-24 格式:DOC 页数:81 大小:1.25MB
返回 下载 相关 举报
川大编译原理课程设计报告(共80页)_第1页
第1页 / 共81页
川大编译原理课程设计报告(共80页)_第2页
第2页 / 共81页
川大编译原理课程设计报告(共80页)_第3页
第3页 / 共81页
川大编译原理课程设计报告(共80页)_第4页
第4页 / 共81页
川大编译原理课程设计报告(共80页)_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《川大编译原理课程设计报告(共80页)》由会员分享,可在线阅读,更多相关《川大编译原理课程设计报告(共80页)(81页珍藏版)》请在金锄头文库上搜索。

1、精选优质文档-倾情为你奉上编译原理课程设计报告课题名称: C-Minus词法扫描器及语法分析器实现 提交文档学生姓名: 提交文档学生学号: 同组 成 员 名 单: 无 指导 教 师 姓 名: 金 军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2014年 6月 20日目录 1 课程设计目标结合各章节的构造编译程序的基本理论,用C或C+语言,实现一个 C-Minus 小编译程序(包括词法分析,语法分析等重要子程序)。本编译器包括以下两个模块:(1) 设计词法分析器:利用手工实现方法实现,设计各类别单词的状态转换图,并为不同类别的单词设计种别码。将词法分析器设计成供语法分析器调用

2、的子程序。功能包括:l 将不翻译的注释等符号先滤掉,转换成一个没有注释的程序 l 能够分离并收集程序中字符串的各个单词,并保存与单词记号相关的信息;(2)语法分析利用学习过递归向下的分析方法等,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。2 分析与设计2.1 程序结构本节主要分析程序的代码结构和代码工程文件的划分。(程序由两个类组成: Scanner类和Parser类,分别为词法分析和语法分析类。工程分为四个文件:scanner.h、scanner.cpp、parser.h、p

3、arser.cpp,分别对应Scanner类和Parser类的声明和实现文件)。本程序采用C+语言以面向对象的思想编写,程序分为两部分:词法分析(Scanner)和语法分析(Parser),分别将两个处理阶段封装成Scanner类和Parser类,两个类各司其职,分别完成词法分析和语法分析的任务。Scanner类主要的工作是过滤注释、词法分析获取Token。Parser类的主要工作是根据Scanner类词法分析之后的Token进行语法分析,生成语法树,最后并输出语法树。在处理过程中,Scanner类的对象作为Parser类的一个成员变量,供Parser调用。本程序myCompiler包含四个文

4、件,其具体功能如下:词法分析scanner.h:与词法分析相关的类(Scanner类)的声明scanner.cpp:词法分析阶段类(Scanner类)的实现语法分析parser.h:与语法分析相关的类(Parser类)的声明parser.cpp:语法分析阶段类(Parser类)的实现2.2 程序流程在程序中,Scanner类的对象(scanner)作为Parser类中的一个成员变量,配合Parser类进行语法分析。它们的关系是这样的:Parser类的一个成员变量scanner首先对源程序删除注释,然后进行词法分析获取所有Token,并将获取的Token存储在scanner对象的tokenLis

5、t(vector类型)中。然后Parser类的语法分析程序就根据tokenList中的Token进行语法分析,生成语法树,最后打印语法树。在这流程之间如果出现分析错误,怎输出相应的错误信息。本程序的流程图如下图: 3 词法分析3.1 代码结构分析词法分析阶段的代码被封装成一个类Scanner,scanner.h中主要是Scanner类的声明代码,scanner.cpp中主要是Scanner类的实现代码。Scanner类的代码结构和主要的成员变量和函数如下 图所示: l Scanner调用getSourseStringFromFile(string s),从文件中获取待分析的源代码l Scann

6、er调用deleteComments(),将注释过滤掉,如果注释出错,则不进行词法分析l Scanner调用scan(),进行词法分析,将分析得到的所有Token保存在Scanner类的成员变量tokenList中,以备语法阶段调用,并将Token输出到文件Token.txt中l Scanner调用getTokenAt(int) 根据下标从tokenList数组中获取Token以上为Scanner类对外提供的公共函数:getSourseStringFromFile(string s)(从文件中获取待分析的源代码)、deleteComments()(过滤注释)、scan()(词法分析主程序)、g

7、etTokenAt(int)(获取数组中Token)。这四个函数构成了词法分析的骨架,在Scanner类中还有其他成员变量和函数,主要作为这四个函数处理过程的中间步骤,为这四个函数服务。此外,其他函数和成员变量的作用和含义如下:public:bool scanSuccess;/词法分析是否成功的标志string sourseString;/获取源代码的字符串Scanner();private:string printSpace(const int i);DFAState charType(char);/根据字母返回字符的DFA状态类型void backToLastChar();/回到上一个字符

8、char getNextChar();/获取到下一个字符TokenType getTokenType(string s);/根据字符串返回Token类型void printToken();/将词法分析好的Token输出到文件Token.txt中int charIndex; /配合getNextChar(),指定要取的字符位置string str;/在分析过程中保存Token对应的串bool commentStartFlag;/标注注释开始的标志int lineCount;/对行号计数,每次获取到/n就自增vector tokenList;/保存的Token序列3.2 Token定义3.2.1

9、Token的定义和类型Token定义:/定义的Token结构体,包括类型、对应的串、所在代码的行号struct TokenTokenType tokenType;string tokenString;int lineNo;Token类型(TokenType):程序中,将Token的类型分为31种,分别对应于else、if、int、return、void、while、+、-、*、/、=、=、!=、=、;、,、(、)、/*、*/、num、id、错误、文件结束:/定义的Token的类型(31种),分别对应于else、if、int、return、void、while、+、-、*、/、=、=、!=、=、

10、;、,、(、)、/*、*/、num、id、错误、结束typedef enumELSE = 1,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 TokenType;3.2.2 Token的种别码TokenType的种别码如下表所示,共31种:单词符号种别码Value单词符号种别码Value

11、elseELSE1=ASSIGN17ifIF2;SEMI18intINT3,COMMA19returnRETURN4(LPAREN20voidVOID5)RPAREN21whileWHILE6LMBRACKET22+PLUS7RMBRACKET23-MINUS8LBBRACKET24*TIMES9RBBRACKET25/OVER10/*LCOMMENT26LT11*/RCOMMENT27GT13idID29=GEQ14错误ERROR30=EQ15结束ENDFILE31!=NEQ163.3 DAF分析由于词法分析程序分为两个步骤处理:删除注释和词法分析获取Token。所以对应有两个DFA,程序分

12、别根据这两个DFA进行编写,现根据DFA分析两程序deleteComments()和scan()如下:3.3.1 删除注释DFADFA描述:删除注释的DFA如下所示,一共分为5个状态,在开始状态1时,如果输入的字符为/,则进入状态2,此时有可能进入注释状态,如果在状态2时,输入的字符为*,则进入注释状态,状态将转到3,如果在状态3时,输入的字符为*,则有可能结束注释状态,此时状态将转到状态4,如果在状态4时输入的字符为/,则注释状态结束,状态转移到结束状态。对应的DFA的代码分析:删除注释的功能通过Scanner 类的成员函数deleteComments()实现,功能是将源代码中的注释过滤掉,

13、将其余代码输出到pureCodeFile.txt文件中。deleteComments()函数按照上面的DFA编写,在函数中,state变量表示状态,共分为5个状态:l 在状态1时,如果输入的字符为/,则进入状态2,否则仍处在状态1,且输出输入的字符l 在状态2时,(此时可能进入注释状态),如果输入的字符为*,则进入注释状态,状态将转到3,否则跳转到状态1,并输出/和输入的字符l 在状态3时,(此时可能结束注释状态),如果输入的字符为*,此时状态将转到状态4,否则继续在状态3l 在状态4时,如果输入的字符为/,则注释状态结束,状态转移到结束状态相应的DFA代码:代码如下所示:void Scanner:deleteComments()cout 开始删除注释. endl;ofstream fout_Sourse(pureCodeFile.txt);int state = 1;char ch;while (s

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号