【编译原理实验】|基于 SLR(1)分析法的语法制导翻译及中间代码生成程序设计原理与实现技术
实验总览
第五次实验是基于 SLR(1)分析法的语法制导翻译及中间代码生成程序设计原理与实现技术,这次实验的主要难点SLR(1)分析表构造与语义制导翻译,这次实验相对是最难的一次实验。
专题 1_词法分析程序设计原理与实现技术
专题 2_递归下降语法分析设计原理与实现技术
专题 3 LL(1)语法分析设计原理与实现技术
专题 4_算符优先语法分析设计原理与实现技术
专题 5_基于 SLR(1)分析法的语法制导翻译及中间代码生成程序设计原理与实现技术
专题 6 编译器前端实现(专题 1+专题 5)
本次程序介绍
实验项目
完成以下描述赋值语句 SLR(1)文法语法制导生成中间代码四元式的过程。
G[S]:S→V=E
E→E+T∣E-T∣T
T→T*F∣T/F∣F
F→(E)∣i
V→i
设计要求
(1)构造文法的 SLR(1)分析表,设计语法制导翻译过程,给出每一产生式
对应的语义动作;
(2)设计中间代码四元式的结构;
(3)输入串应是词法分析的输出二元式序列,即某赋值语句“专题1”的输出结果,输出为赋值语句的四元式序列中间文件;
(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。任务分析:重点解决SLR(1)分析表构造,赋值语句文法的改写和语义动作的添加。
详细实现
文件目录结构
可以看到目录结构如下,其中LexicalAnalysis是词法分析器,SLR1是SLR1语法分析器,code.txt是原始代码,LA.txt是词法分析生成的中间代码。GS.txt是文法文件。
原始代码code.txt仍旧是以空格分隔字符如下。
文法的存储如下。是两行一个产生式,第一行是产生式的右部,第二行是产生式的左部。
数据结构描述
LaCode数据结构将词法分析的结果从LA.txt中提取保存出来。
GsMap存储文法
FirstSet和LastSet存储First集和Last集。
FirstSet2是按产生式分割的First集。
StackAnalyse是OG分析栈。
table是SLR1分析表(GOTO和Action)。
程序生成的中间数据
读取到的待检测串、文法和Vt、Vn集。
生成的First集和Last集。ImproveFirst是按产生式划分的First集。
闭包操作产生有效项目规范族
生成Action Goto表
函数介绍
SLR(1)文法是在LR(0)的基础上对于移进归约冲突和归约归约向前看一个符号来处理,造表过程和LR(0)基本一样,先(得到拓广文法)列出所有项目,从开始符号开始,用closure将项目集划分,填写ACTION表和GOTO表。而语法制导生成四元式在SLR(1)分析过程中进行。
通过GetClosure函数CLOSURE(I)构造规范集组。
getTable函数,构造 SLR语法分析表,其构造方法原理如课本上教的一样:
analyse函数,SLR1分析函数,设立一个三个栈,其中一个状态栈,一个符号栈,一个是用于存放四元式变量的栈,当规约出现V→i时将i压入栈,当出现A→V=E,E→E+T∣E-T,T→T*F∣T/F这几条规则时,newTemp函数产生新的变量,将其根据语义规则生成四元式,然后将对应栈中变量弹出,将新的变量压入栈。
程序测试
本程序的测试代码存在可执行文件同目录下的code.txt中。本程序中输入串每个符号与符号之间需要空格分隔。测试结果中打印函数的SLR1语法分析过程。若错误则会输出Error。
测试用例1(正确)
测试结果1
测试用例2(错误)
测试结果2
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!