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

举报
海轰Pro 发表于 2021/08/05 23:18:01 2021/08/05
【摘要】 前言         在上一篇博客:LR(0)分析的最后,简要的说明了一下LR(0)分析在构建分析表时候会发生的一些冲突。那么有什么方法可以避免这种语法冲突呢?         SLR分析就是对LR(0)分析产...

前言

        在上一篇博客: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)分析

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/105596980

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。