编译原理——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文库

  • 20
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
SLR(1)语法分析器是一种自下而上的语法分析器,它使用了LR(0)项目集家族和FIRST/FOLLOW集合,进行语法分析。SLR(1)语法分析器的原理如下: 1. 构造LR(0)项目集家族:首先,需要根据文法G的所有产生式构造出LR(0)项目集家族,包括起始符号S的增广文法G'的所有产生式。每个项目集Ii由LR(0)项目组成,其中每个项目都有形如A→α·β的形式,表示在某个产生式的某个位置上,将会选择beta作为下一步的推导。 2. 计算FIRST集:对于文法G的每个非终结符号A,计算FIRST(A),即终结符号集合{a|A=>*aβ},其中=>*表示A能够推导出β。 3. 计算FOLLOW集:对于每个非终结符号A,计算FOLLOW(A),即终结符号集合{a|S=>*αAaβ},其中α和β是文法符号串。 4. 构造LR(0)自动机:基于LR(0)项目集家族和FIRST/FOLLOW集合,构造出LR(0)自动机。其中,每个状态代表一个LR(0)项目集,每个转换代表一个文法符号。 5. 构造SLR(1)表:在LR(0)自动机的基础上,通过计算每个状态的ACTION和GOTO函数,得到SLR(1)分析表。ACTION函数用于处理终结符号,GOTO函数用于处理非终结符号。ACTION[i,a]表示在状态i和读入符号a的情况下,执行的动作,可以是移进、规约或者接受。GOTO[i,A]表示在状态i和读入非终结符号A的情况下,转移到的状态。 6. 进行语法分析:使用SLR(1)分析表,根据输入符号串进行语法分析,具体流程为:从状态0开始,每次读取一个输入符号,根据分析表执行移进或者规约操作,直到接受或者出现错误。 SLR(1)语法分析器的优点是简单易懂,缺点是不能处理所有文法,只能处理SLR(1)文法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小航同学吖

制作不易,动动你的小手

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

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

打赏作者

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

抵扣说明:

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

余额充值