编译原理——SLR(1)语法分析器(C/C++代码实现)

0 实验目的

设计、编制、实现并调试SLR(1)语法分析器,加深对语法分析的理解。

1 实验要求

根据编译原理理论课中学习的算术表达式文法以及该文法的LR分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)输出产生式序列形式的分析结果。

2 实验内容

实现LR语法分析器,执行过程举例:分析id+id*id,根据PPT上的预测分析表,输入id+id*id#,分析出栈和输出的内容。
文法:
E’->E
E->E+T
E->T
T->T*F
T->F
F->(E)
F->id

3 实验思路

1.首先,我定义了7个函数,分别为:最重要的SLRScanner()函数(进行SLR文法分析);statestack()函数(输出状态栈);signstack()函数(输出符号栈);print()函数(剩余字符串输出);Action()函数(用于分析和输出动作说明);xfind()函数(用于查找预测分析遍行变量);yfind()函数(用于查找预测分析表列变量)。紧接着,定义了字符串二维数组,用于储存预测分析表,还定义了二维字符数组,用于存储拓广文法;定义了两个栈,符号栈以及状态栈。
2.本次实验程序中最重要的就是SLRScanner()函数,接下来,对此进行简要分析:开始,通过以字符串此时的分析位置与字符串整体为判断条件进行循环,令标志变量flag等于0(做最开始的移进操作),并不断更新行变量与列变量,方便接下来查表,然后将0,#分别压入状态栈和符号栈。接着通过xfind和yfind函数进行查找并给行变量与列变量赋值,将对应预测分析表内的数据进行判断:如果等于0.不符合文法,返回。如果不是,就将对应的符号和状态分别压入符号栈与状态栈,同时,输出剩余字符串和对应的动作说明。如果等于‘s’,给flag赋值0,否则等于1。如果flag等于1,就进行规约(对SR(1)与对应的拓广文法分别比较并同时,对符号栈、状态栈、剩余字符串以及动作说明进行操作,还有输出相应的产生式。)如果flag等于2做goto后的移进操作,再与预测分析表进行比对,SR等于0,证明查表结果错误;SR等于acc,程序结束,并输出该字符串符合文法。
3.其他函数也比较重要,在SLR文法分析函数中都进行了调用,通过对栈的操作,实现了符号和状态的输出,极大的化简了程序;Action函数帮助输出动作说明;而xfind和yfind帮助查找预测分析表,都有着不可或缺的作用。

4 实验代码

5 实验结果

6 实验总结

这个实验要求不尽相同,需要改一下,可以与我私信讨论。

7 实验程序以及实验报告下载链接

编译原理实验:包括实验一词法分析器,实验二进制分析,实验三语法分析器,实验四SLR语法分析器等其中含有实验报告,实验代码等等-C++文档类资源-CSDN文库

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月14日
下一篇 2023年12月14日

相关推荐