【编译原理实验】|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