2016级《编译原理课程设计》总结报告(组)
_2019_年_5_月_25_日
报告正文(请用小四号宋体填写,自行组织章节和段落)
目录
第一部分实验成果统计表 (1)
第二部分实验简介 (2)
第三部分词法分析 (3)
第四部分语法分析 (6)
LL(1)语法分析 (7)
LR语法分析 (10)
第五部分程序测试 (22)
第一部分实验成果统计表
见首页
第二部分实验简介
实验目的
分组(每组最多3人)完成对SNL语言的以下两个程序:词法分析程序,语法分析程序(方法不限)。
察并锻炼学生的团队协作能力,代码编写能力,加深同学对编译原理中SNL编译系统的理解,帮助同学理解整个编译原理的机制
实验内容
本实验中实现了SNL编译系统中的词法分析、语法分析。
其中语法分析包括LL(1)分析方法和LR分析方法
词法分析,以源程序为输入,生成单词的内部表示TOKEN序列。
语法分析,以TOKEN序列为输入进行语法分析,并生成整个源程序的语法分析树。
在SNL编译程序中,采用了两种语法分析方法实现:LL(1)和LR,前者为自顶向下的,后者为自底向上的。
两种语法分析的结果是一样的。
实验步骤
编译系统的总体分析(算法分析,数据结构设计,优化)→代码实现,分工进行词法分析,语法分析部分→代码测试→结果反馈,修正→系统界面优化设计
作符栈和操作数栈。
LL(1)语法分析的主要函数有:doGrammar()、Grammar()、findRuleIndex()、getVariables()、getStartVariable()、computeFirstSets()、computeFollowSet()、getRuledByLeftVariable()、getTerminals()、getFirstSets()、getFallowSets()等等doGrammar()函数是最主要的函数。
它利用LL(1)分析表和符号栈进行语法分析,并处理终极符不匹配和文件提前结束错误。
函数处理完成后,得到整个语法树。
Grammar()函数主要进行Rule格式转换。
自底向上语法分析
LR(0)分析方法实现过程
结构如下
LR(0)
--->LR0Item
误情况
(由于篇幅原因这里仅以删除冒泡排序倒数第二行endwh为例):
(1)词法分析:
(2)LL(1)语法分析:
(3)LR(0)语法分析:
(4)LALR(1)语法分析
结论(请用小四号宋体填写)
还记得第一次编译系统实验的时候,我们在得知要设计一个SNL编译器时,有很多迷茫。
理论课上确实有涉及到设计的内容,然而我们都没有真正实践过,完全不知道从何下手。
但主要任务还是清晰的,词法分析和语法分析。
考虑到时间不足,我们决定先明确每周分工,具体实施的时候就不用担心最后赶工的情况发生了。
大致是第一周—编译系统的总体分析(算法分析,数据结构设计,算法优化)。
第二周—代码实现,分工进行词法分析,语法分析部分。
第三周—代码测试,结果反馈,系统界面优化设计,实验报告撰写。
进展有条不紊,每个人都被分到了相应的任务,在具体实现时保持沟通,分工协作,推动工作开展。
编程的过程中我们小组的成员密切配合,积极讨论,共同探讨不同模块的耦合关系以及接口实现,遵循基本的软件开发过程:设计、编码、集成和测试。
整个编程过程锻炼了我们的学习和调试程序的能力,同时对于一些不完善的细节通过我们自己的努力进行重新编程和纠错,最终完成了程序的相关功能。
并达到了更高要求,完成了自底向上的语法分析,并且对界面进行的细致的优化,使其更显美观,这也是我们有别于其他组的优势所在。
这大学三年也接触了不少项目,因此在进行这个项目的时候大家都有些胜券在握的感觉,然而实际过程中还是遇到了不少的麻烦,所幸我们都努力一一克服了。
这也提醒我们对待每个项目都要拿出100%的专注度,要享受完成项目的过程,乐在其中才是学习的意义。
我也相信这一次的编译原理课程设计,不仅仅是帮助我们对编译器有了更深的了解,更多的是让我们在自己的科研道路上又看到了一个新的方向,朝着更广阔的未来前进。