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

本文详细描述了一个使用C语言编写的SLR(1)语法分析器的实现过程,该分析器接受算术表达式作为输入,基于文法和预测分析表进行分析。实验涉及定义多个辅助函数,如SLRScanner()、statestack()和signstack(),并通过状态栈和符号栈来处理输入,输出分析结果。实验结果显示了分析过程和结果,验证了文法的正确性。
摘要由CSDN通过智能技术生成

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文库

  • 24
    点赞
  • 158
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小航同学吖

制作不易,动动你的小手

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值