【编译原理实验】|LL(1)语法分析设计原理与实现技术
实验总览
第三次实验是LL(1)语法分析设计原理与实现技术,这次实验的主要难点在First、Follow集的构造,而且由于我最初并未按照单个产生式去构造First集,导致比较麻烦。
专题 1_词法分析程序设计原理与实现技术
专题 2_递归下降语法分析设计原理与实现技术
专题 3 LL(1)语法分析设计原理与实现技术
专题 4_算符优先语法分析设计原理与实现技术
专题 5_基于 SLR(1)分析法的语法制导翻译及中间代码生成程序设计原理与实现技术
专题 6 编译器前端实现(专题 1+专题 5)
本次程序介绍
[实验项目] 实现 LL(1)分析中控制程序(表驱动程序);完成以下描述赋值语句的 LL(1) 文法的 LL(1)分析过程。
G[S]:S→V=E
E→TE′
E′→ATE′|ε
T→FT′
T′→MFT′|ε
F→ (E)|i
A→+|-
M→*|/
V→i
[设计说明] 终结符号 i 为用户定义的简单变量,即标识符的定义。
**[设计要求]**(1)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的 输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果;( 2)LL(1)分析过程 应能发现输入串出错;( 3)设计两个测试用例(尽可能完备,正确和出错),并给出测试结 果;( 4)考虑根据 LL(1)文法编写程序构造 LL(1)分析表,并添加到你的 LL(1)分析程序 中。 【也要考虑First集、Follow集的构造与LL1分析表的构造】
[任务分析] 重点 LL(1)分析方法和 LL(1)分析器的实现。
-提供了文件输入方式,且输入的内容为二元式序列;
-能够对输入的字符串做出正确的LL(1)分析判断,并给出判断结果,判断结果输出到文件,也显示在屏幕;
-能发现输入串中的错误,包含非法字符,输入不匹配等;
-能够处理一些可预见性的错误,如文件不存在,输入非法等。
[单词符号表]
单词符号 | 种别码 |
---|---|
( | 1 |
) | 2 |
+ | 3 |
- | 4 |
* | 5 |
/ | 6 |
i | 7 |
# | 8 |
详细实现
文件描述
本次实验采用面向对象的程序设计,沿用之前的LA类(词法分析)。可以看到目录结构如下,其中LexicalAnalysis是词法分析器LA类的实现,LL1是LL(1)语法分析LL1类的实现,code.txt是原始代码,LA.txt是词法分析生成的中间代码,GS.txt是储存的文法。
原始代码code.txt仍旧是以空格分隔字符如下。
文法的存储如下。是两行一个产生式,第一行是产生式的右部,第二行是产生式的左部。
数据结构描述
LaCodeVector数据结构将词法分析的结果从LA.txt中提取保存出来。
GsMap存储文法
FirstSet和FollowSet存储First集和Follow集。
FirstSet2存储按产生式构成的First集(这个是由于前期设计失误用来弥补的措施)
StackAnalyse是LL1分析栈。
程序结构描述
生成的中间数据
读取的待检测串、Gs文法、Vn、Vt集。
生成的First集和按产生式划分的First集。
生成的Follow集
生成的LL1分析表。
测试
本程序的测试代码存在可执行文件同目录下的code.txt中。本程序中输入串每个符号与符号之间需要空格分隔。结果中会分别展示几种中间数据以及LL1分析过程与结果。若错误则会输出Error。(几种集合和表格的截图上面有,下面就不多余附了)
测试用例1(正确)
测试结果1
测试用例2
测试结果2
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!