编译原理学习笔记(九)~SLR分析

前言

        在上一篇博客:LR(0)分析的最后,简要的说明了一下LR(0)分析在构建分析表时候会发生的一些冲突。那么有什么方法可以避免这种语法冲突呢?
        SLR分析就是对LR(0)分析产生冲突的一种解决办法。S:simple,简单的。SLR原是SLR(1),意思是在解决LR(0)冲突的时候,我们需要向后多看一个字符,又因为k=1的时候,可以省略不写,所以就简写为SLR.

SLR分析

        那么具体是怎么解决LR(0)中的冲突呢?
首先我们举一个含有冲突的LR(0)分析,如下:
在这里插入图片描述
从上图可以看出,I2和I9存在移进/归约冲突
对于这个冲突,我们可以给出如下的解决方法:

  1. 求出E、T的FOLLOW集
  2. 若下一个输入符号属于E的FOLLOW集,那么就归约为E
  3. 反之则采用移进

详解:
在这里插入图片描述
        从FOLLOW集中可以看出,对于I2,当下一个输入符号为 * 的时候, 该 * 不属于E的FOLLOW集合,所以采用移进
对于该题SLR分析构造的分析表如下:
在这里插入图片描述
重点
下面给对于任意LR(0)分析存在冲突的SLR算法
在这里插入图片描述
        海轰的理解:对于一个LR(0)分析存在冲突,我们可以在这个状态(比如例题中的I2)的时候多往后面多看一个字符,对于 该状态中的那种归约项目(参考上图),我们需要分析下一个输入字符是否在其式子左边那个字符中的FOLLOW集中。如果在,对于输入该字符就采用归约。对于那种移进项目,分析下一个输入字符是否属于圆点后面的那个符号(比如上图中的a1 a2 a3… 就是圆点后面的那个符号),如果属于,就移进
        总结一下就是,在LR(0)分析的基础之上,再对有语法冲突的状态进行进一步的分析【就是进一步区分到底是移进 还是归约】。这个进一步的分析其实就是看下一个输入字符。利用标准算法进行匹配即可。

SLR 分析表构造算法

在这里插入图片描述

SLR文法

定义:如果给定文法的SLR分析表中不存在有冲突的动作,那么该文法称为SLR文法

SLR分析存在的冲突

        SLR分析并不可以解决所有的LR(0)分析,可能采用SLR分析后还是会存在语法冲突。如下图:
在这里插入图片描述
        对于状态I2,当我们采用SLR分析:当下一个输入符号为 = 的时候,因为 = 属于 R 的FOLLOW集,所以采用归约操作;但是我们又发现, = 又是S–>L . =R 中圆点后的一个字符,按照规则应该采用移进操作
        从上面这个例子我们可以看出,SLR依然是可能存在语法冲突的。 那么怎么解决呢?为此引入了LR(1)分析

  • 48
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
SLR(1)是一种语法分析器,用于解析上下文无关文法。下面是一个简单的SLR(1)实验: 1. 首先,需要定义上下文无关文法。例如,考虑以下文法: ``` S -> E E -> E + T | T T -> T * F | F F -> ( E ) | id ``` 2. 接下来,需要构造文法的SLR(1)分析表。这个表将会告诉分析器在哪里进行移进(shift)和规约(reduce)操作。可以通过以下步骤构造分析表: a. 计算每个非终结符的FIRST集和FOLLOW集。 b. 对于每个产生式,找出它的FOLLOW集,并将它添加到该产生式的FOLLOW集中。 c. 对于每个非终结符A和每个终结符a,找出A可以推导出的所有产生式,并将它们添加到分析表中的[A, a]项中。如果这些产生式是形如A -> α的,那么将移进项Sj添加到[A, a]项中,其中j是在项Sj中第一个符号是a的那个状态。 d. 对于每个非终结符A和每个终结符a,找出A的FOLLOW集中的所有符号,并将它们添加到分析表中的[A, a]项中。如果A是文法的开始符号,那么将接受项acc添加到[A, $]项中。 3. 最后,使用分析表进行语法分析。首先,将输入符号串转换为一个词法单元序列。接下来,使用一个栈来跟踪分析过程。将栈初始化为只包含状态0。然后,重复以下步骤: a. 从输入中读取下一个符号。 b. 在分析表中查找当前状态和下一个符号的项。 c. 如果该项是移进项,将下一个符号压入栈中,并转移到新状态。如果该项是规约项,将产生式右侧的符号弹出栈,并使用产生式左侧的符号替换它们。然后,再次在分析表中查找当前状态和新符号的项,并将新项推入栈中。 d. 如果分析表中没有与当前状态和下一个符号匹配的项,则报告语法错误。 e. 如果下一个符号是结束符号$,并且栈中只剩下一个状态,那么分析成功。 以上是一个简单的SLR(1)实验的步骤。在实际应用中,可能需要更复杂的文法和更复杂的分析表构造算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海轰Pro

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值