编译原理课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告
( 2021--2022年度第一学期)
名称:编译技术课程设计题目:算符优先分析法研究院系:
班级:
学号:
学生姓名:
指导教师:
设计周数:一周
成绩:
日期:2021年12 月31日
1 课程设计的目的和要求
1.1 课程设计的目的
本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。

设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术。

1.2 课程设计的要求
1. 文法使用产生式来定义;
2. 分别给出每一个非终结符的FIRSTVT和LASTVT集。

3. 画出算符优先关系表;
4. 判定给定的文法是否是算符优先文法;
5. 给定符号串判定是否是文法中的句子,分析过程用分析表格的方式打印出来。

2 系统描述
举例如下:
本次实验使用Visual Studio 2019软件,利用只规定终结符之间的优先关系的自底向上移进-规约法实现对算符优先分析法的研究,输出非终结符的FIRSTVT和LASTVT集,算符优先关系表和对句子的分析表格,均在DOS窗口显示。

2.1 文法的描述
G[S]: S->#E#;
E->E+T|T;
F-P!F|P;
T->T*F|F;
P->(E)|i
2.2 属性文法的描述
表2-1 条件语句及其语义规则
3 概要设计
3.1 概要设计(体现系统的设计思路和主要功能)
主要步骤包括:
用户自己输入文法,实质上是算数表达式的计算。

构建每个非终结符的FirstVT()和LastVT()集。

构建优先关系符号表。

构建词法分析的程序。

编写主函数,用户输入文法对语句利用算符优先文法进行判别。

算法的主体思想:用栈存储已经看到的输入符号,用优先关系指导移动归约语法分析器的动作,如果栈顶的终结符和下一个输入符之间的优先关系是<或=,则语法分析器移动,表示还没有发现句柄的右端,如果是>关系,就调用归约。

3.2 开发环境
实验采用C++程序语言进行设计
开发工具为Visual Studio 2019
4 详细设计
4.1 系统的类图
图4-1 文法类图
4.2 主要算法的流程图
图4-2 求非终结符的FIRSTVT 和LASTVT 集流程图
求LASTVT 集的过程与此类似,但符号串的扫描顺序是从后开始
若产生式右部第一个字符为非终结符 则直接将其加入first 集中
else first[x].insert(str[0]);
寻找该非终结符 的first 集 dfs(y);
将该非终结符的first 集也加进去
for (; it != first[y].end(); it++)
first[x].insert(*it);
if (isupper(str[0]))
若产生式右部第一个字符为非终结符 string& left = VN_set[x].left;
string&str = VN_set[x].right[i];
产生产生式左部非终结符的FIRSTVT 集
图4-3 构造算符优先关系表流程图
图4-4 对输入串进行算符优先分析流程图
4.3 数据分析与定义
char relation[MAX][MAX]; //算符优先关系表
vector<char> VT;
vector<WF> VN_set; //类型为文法的数组VN_set
map<string, int> VN_dic; //map映射,一条产生式对应的第几条的序号set<char> first[MAX]; //FIRSTVT集
set<char> last[MAX]; //LASTVT集
4.4 系统界面设计
用户输入文法个数和每条产生式的内容后,输出结果格式如下:
分为:产生式、FIRSTVT集、;LASTVT集、算符优先关系表和分析过程
图4-5 系统输出界面概况
5 测试方法和测试结果5.1 测试用例1
输入如程序5-1所示。

6
S->#E#
P->i
F->P
T->F
E->T
E->E+T
程序5-1 测试用例1
图5-1 测试用例1输出结果
5.1 测试用例2
输入如程序5-2所示。

8
P->#S#
S->D
D->D(T)
D->H
H->a
H->(S)
T->T+S
T->S
程序5-2 测试用例2
图5-2 测试用例2的输出结果
结论和展望
结论
本次实验做的比较简单,基本上满足了实验的基本要求,文法由用户自行定义输入,输出非终结符的FIRSTVT和LASTVT集、终结符之间的优先关系表和对所给符号串的分析判断过程。

特点是基本实现了递归,可以实现对文法中非终结符关系<、>、=的判断,移进和规约的判断,不足之处是通过测试,并不是所有对符号串的分析过程都是正确的,对于稍长一些的符号串会出现问题,可能是出现了数组越界或野指针等内存管理方面的问题,还需要进一步修改和优化。

展望
本次实验的不足还有很多,同时对于复杂的符号串也无法进行完全正确的处理。

且没有图形可视化的界面,分析的符号串是在主函数中写入的,用户在程序运行时直接输入暂时还没有实现,等以后水平提升了以后,应该会进一步完善。

算法较为简单,但编程实现却并不容易。

它提示着我们在学习好理论基础的同时,也要注重实践。

收获:通过本次实验,我收获了很多东西。

首先对编译有了进一步的深刻理解,对递归的思想有了很深的认识,同时对于语法分析的原理和过程都有了进一步的巩固,做这个课程设计也让我学到了很多新东西,如并查集这一巧妙的工具,对于C++的编程水平也起到了锻炼的作用,巩固了平时所学的知识,真正做到了学以致用,对于各种结构体的运用也有了深刻的认识。

学习编译技术课程的体会和对本门课程的评价
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法,在计算机本科教学中占有十分重要的地位。

该课程理论性与实践性都很强,我们在学习是普遍感到内容非常抽象,不易理解,内容多且繁琐,难以完整、全面地掌握编译原理的有关知识,更不用说灵活运用编译原理知识从事相关设计或应用于其他领域。

虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对我们提供了系统而有效的训练,有利于提高软件人员的素质和能力。

在我们学习编译原理以前﹐都认为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高。

而在后来的学习中,我们逐渐认识到计算机专业的学生,除了要会编写程序语言之外,还应该了解它是如何被计算机所识别,这才是真正并且透彻地学习软件。

另外,编译器中每一个模块的编写,都能对我们的编程能力的提高有很大帮助。

在今后若从事软件工程,这门课程也能够对编写程序有所帮助。

参考文献
[1]王生原,董渊,张素琴,吕映芝,蒋维杜等编著.编译原理(第3版)[M].北京:清华大学出版社,1998,103-121.
[2]郑阿奇,丁有和,苏丹,郑进,周怡君等编著. Visual C++实用教程(第5版)[M].北京:电子工业出版社,2000,74-123.
11。

相关文档
最新文档