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

image-20220626130541522

程序生成的中间数据

读取到的待检测串、文法和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