1、哈尔滨工业大学(威海)计算机学院编译原理实验报告姓名 院系 计算机学院 学号 任课教师 指导教师 闫健恩实验地点 宋健二楼机房 实验时间实验名称 实验二 LR 语法分析技术同组人 无预习报告(对实验主要内容的认识) 得分(1)给出主要数据结构:分析栈、符号表、语法分析树;(2)将扫描器作为一个子程序,每次调用返回一个 TOKEN;(3)程序界面:表达式输入、语法分析树的表示结果(文件或者图形方式);实验内容(问题,思路,程序,结果) 得分(1)开发环境:vs2010(2)输入:在运行打开的软件下(win32 格式),输入相应的代码(即要进行词法分析的字符串)(3)输出:在输入字符串后,按回车键
2、后,既可以得到相应的词法分析的结果(4)在相应的运行程序的文件夹中生成一个 txt 文件,用来存储生成的 Token链表(5)系统功能:1、词法分析:将输入的字符串进行单词级别的分析并且生成且输出 Token 表2、语法生成器:可以将语法生成相应的状态,在这个实验中共有语法如下:3、CLOSURE 生成4、LR 项集族的生成6、 Goto 表的生成7、 Scaner 词法分析器将 Token 表输出8、语法分析器对 Token 表的分析,得出结果(2) 开发平台(操作系统、设计语言):1、操作系统:windows 72、设计语言:c+3、编译器:vs2010(3) 设计方案;1) 主数据流图;
3、开始读取构造的文法(grammar.txt)构造 item.txt 集族构造 action 表,写入文档进行语法的匹配(自底向上 RL(1))匹配时出现错误?查找 action 表继续进行匹配如果代码分析还未完成,继续结束YN2) 主要数据结构:符号表、TOKEN 串表等。/符号表class symTableprivate:char* symName;char* symStyle;int symLength;public: symTable *next;public:symTable();symTable(char* sysName,char* sysStyle,int sysLength);
4、symTable(symTable char* getName();char* getStyle();int getLength();void symAdd(symTable* symFirst);void print();char G3030; /use a matrix to store grammar G/存放 文法,用来分析作为输入int length30; /length use to store each formulas lengthint number = 0;bool tempofinput150; /buffer of input/输入?char str_vn30; /pu
5、t all vn into itint size_vn = 0; char str_vt150; /put all vt into itint size_vt = 0;bool first_vn30150;char buffer50;/用来存放生成 CLOSURE(I)时需要的 first_set 也用来读入用户的输入串_ int bsize = 0;struct thriint beg;int nex;char ch;thri trans200;int size_trans = 0;/定义项目集的形式 struct projint formula_numb;int part;char exp
6、c;/*项目集*/proj items200200;int Ccount = 0;int size_item200;/*状态转换表*/struct actionchar ch;int nxt_sta;action action_table200200;int size_act_table200;ifstream G_ifile;ifstream input_ifile;ofstream items_ofile;ofstream act_ofile;(4) 具体设计过程(包括主控程序、各个功能模块的具体实现)。1、主控程序简介:主控制流程主要包括下面的几部分:(1) 词法分析器的子函数修改(2)
7、 对于输入 grammar,输出集族(3) 输入集族,可以构造出相应的 action 表(4) 根据得到的 action 表生成相应的语法分析策略2、对于词法的分析简介:主要实现和在实验一中的功能相同,只是将现在的实现包装到一个函数里面,这样就是为了对代码进行重复的快捷的利用,只是需要将得到的程序代码作为输入,词法分析函数就会自动的生成相应的 token 表和相应的符号表。3、对于 item 生成简介:自己通过分析课本上的实验伪代码,以及 yacc 文法代码生成工具的研究,编写相依的 item 集族的生成工具,生成的 I 状态共有 105 中,具体的实现以及生成的状态在文档中(见于:item.
8、txt)4、对于 action 生成(action+goto)简介:通过生成的 item 表,构建一个 action 生成工具就可以得到相应的 action 表格,这个表格可以进行重复的利用(只要写到函数中即可,不需要每次都进行读入内存,然后在进行生成)5、语法分析分析根据 LR 的自底向上的方法进行语句与文法(在 action 中描述)进行匹配,若匹配成功,这该语句正确,分析下一条语句,否者错误提示输出。实验结论 得分本次试验我学习到了一下内容:(1)编写了一个文法分析器,参照 yacc 可以输入文法(按照相应的格式),然后生成一个 item 项用来存放规范 LR(0)项集族。输入的相应的格式在实验内容中已经给出。(相应的生成的 item 表格在上文中已经给出,并且在工程的文档中也有给处)(2)编写了一个 Action 表以及 Goto 表的生成程序(一个程序生成两个表格归并成为一个),并且放到相应的 txt 中,可以适用于任何其他想要使用这个文法的语法分析器。(相应的生成的 Action 表格在上文中已经给出,并且在工程的文档中也有给处)(3)综合了第一个实验的词法分析器,并且修正了词法分析器中一些鲁棒性不是很好的地方。(4)所有函数的算法思想以及实现方案,都可以在相应的源码的注释处找到。教师评价 总分 实际得分