【编译原理实验】|递归下降语法分析设计原理与实现技术

实验总览

第二次实验是递归下降语法分析设计原理与实现技术,这个实验和第一次一样,相对来说比较容易

专题 1_词法分析程序设计原理与实现技术
专题 2_递归下降语法分析设计原理与实现技术
专题 3_LL(1)语法分析设计原理与实现技术
专题 4_算符优先语法分析设计原理与实现技术
专题 5_基于 SLR(1)分析法的语法制导翻译及中间代码生成程序设计原理与实现技术
专题 6_编译器前端实现(专题 1+专题 5)

本次程序介绍

在专题二中我没有特别去写First、Follow集的构造。我把这部分构造在专题三中(以及后续专题)实现了。

实现递归下降分析法的功能。词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。

递归下降分析法的前提是改造文法:

消除二义性、消除左递归、提取左因子,判断是否为 LL(1)文法。

这个实验规定了单词种类表,如下:

单词符号 种别码
1
2
+ 3
- 4
* 5
/ 6
i 7
# 8

详细实现

文件介绍

本次实验对实验1稍作修改,改为了面向对象程序设计,组合模式将词法分析器组合在递归下降分析器中,提高了后面代码的可复用性。可以看到目录结构如下,其中LexicalAnalysis是词法分析器,RDP是递归下降语法分析器,code.txt是原始代码,RDP.txt是词法分析生成的中间代码。

主要数据结构描述

以下数据结构将词法分析的结果从RDP.txt中提取保存出来。

由于是递归下降分析,所以也不需要其他的数据结构来辅助了。

程序流程图

image-20220626121017642

函数介绍

该程序严格按照每条产生式编写即可,子函数的流程图如PPT上所示的一样。在这里不在缀图了。

程序测试

本程序的测试代码存在可执行文件同目录下的code.txt中。本程序中输入串每个符号与符号之间需要空格分隔。测试结果中把函数的递归顺序倒序输出了用来观察。若错误则会输出RDP Error。

测试用例1(正确)

测试结果1

测试用例2

image-20220626121144948

测试结果2