编译原理学习笔记(九)~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)分析