【编译原理实验】|算符优先语法分析设计原理与实现技术

实验总览

第四次实验是算符优先语法分析设计原理与实现技术,这次实验的主要难点在FirstVt、FollowVt集的构造,这次实验相对第三次较为简单。集合的构造我都是选择规范方法去构造的。

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

本次程序介绍

[实验项目]

实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。

G[E]:E→E+T∣E-T∣T

T→T*F∣T/F∣F

F→(E)∣i

[实验说明]

终结符号i 为用户定义的简单变量,即标识符的定义。

[设计要求]

(1)构造该算符优先文法的优先关系矩阵或优先函数;

(2)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果。

(3)算符优先分析过程应能发现输入串出错。

(4)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果;

(5)考虑编写程序根据算符优先文法构造算符优先关系矩阵,并添加到你的算符优先分析程序中。

能够有效识别以下算符优先文法

E → E+T | E-T | T

T → T*F | T/F | F

F → (E) | i

所描述算术表达式.

详细实现

文件目录结构

可以看到目录结构如下,其中LexicalAnalysis是词法分析器,OG是算符优先语法分析器,code.txt是原始代码,LA.txt是词法分析生成的中间代码。

原始代码code.txt仍旧是以空格分隔字符如下。

文法的存储如下。是两行一个产生式,第一行是产生式的右部,第二行是产生式的左部。

主要数据结构描述

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

GsMap存储文法

FirstVtSet和LastVtSet存储FirstVt集和LastVt集。

StackAnalyse是OG分析栈。

OgTable是算符优先分析表。具体的为map的key是一个pair,里面存纵横行的符号,map的值0为= 1为> 2为< 3为空(即error)。

生成中间数据描述

读取到的待检测串、文法和Vt、Vn集。

生成的FirstVt集和LastVt集

生成的算符优先分析表

函数介绍

程序测试

本程序的测试代码存在可执行文件同目录下的code.txt中。本程序中输入串每个符号与符号之间需要空格分隔。测试结果中打印函数的算符优先分析过程。若错误则会输出Error。

测试用例1(正确)

测试结果1

测试用例2(错误)

测试结果2