【编译原理实验】|算符优先语法分析设计原理与实现技术
实验总览
第四次实验是算符优先语法分析设计原理与实现技术,这次实验的主要难点在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
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!