LR文法整理【LR文法的概念、LR(0)、SLR、LR(1)、LALR】(下)

LR(1)分析法

在Follow集合中的符号,只是进行归约的必要条件,而非充分条件。
在这里插入图片描述
出错原因:从下图的分析树中可以看到,R在不同的位置进行归约,后继符号是不一样的,简单的说,在特定位置中,A的后继符集合只是FOLLOW(A)的子集,这也就应证了上面说的,仅仅满足存在于FOLLOW集中,这是一个必要不充分条件,因此不能笼统的通过Follow集合进行判断,需要更加细化判断条件。
在这里插入图片描述

概念

学习了LR(0)和SLR之后,LR(1)项目的定义理解相对容易了很多。学习LR(1)主要需要知道展望符的概念和作用。

对于移入项目和待约项目,展望符a没有任何作用。
在这里插入图片描述

笔记回顾

这里补充两点

1、对于一个项目,并不是 · 在中间就是待约项目,比如 b · bBB这个是移进项目;

2、待约项目是没有等价项目的。

在这里插入图片描述

LR(1)等价项目

大体上和LR(0)是一样的,主要是多了对于展望符的推导。
如果β = ε ,则b = a;
如果β ≠ ε ,则b = FIRST(β),注意是FIRST(β)而不是FIRST(B)
在这里插入图片描述

LR(1)自动机转换图的构造

还是通过例子来进行解析,下图是LR(1)自动机的转换图。
在这里插入图片描述
在这里插入图片描述
I0进行分析:

项目1是通过用来进行增广的产生式0)得到的,其结束符号只能是$,因此1的展望符为$,这个项目为待约项目。因此根据文法中S的两个产生式1)和2),写出两个等价项目2和3,由于项目1中S后面是空串,因此2和3直接继承1的展望符$。

项目2也是一个待约项目,因此根据L的产生式3)和4)可以得到其等价项目4和5。由于L后面的符号是 = 号,因此4和5的展望符为 = 号。

项目3也是一个待约项目,根据R的产生式5)可以得到它的等价项目6,由于R后面是一个空串,因此项目6直接继承项目3的展望符$。

项目4和项目5都是移进项目。

项目6是待约项目,同理可以得到其等价项目7和8,同理7和8也继承6的展望符$。

项目7和8都是移进项目。

至此,I0的项目集闭包成功找到。

在这里插入图片描述

LR(1)自动机分析表的构造

根据转换图,可以构造出LR(1)自动机的分析表。

对于移入项目和待约项目的处理方法与LR(0)是一样的,对于归约项目,则有特定的后继符号要求才能进行归约。
在这里插入图片描述

归约条件比较

就拿I2来进行说明

LR(0)分析表:对于任何一个输入符号,都可以执行归约动作。

SLR分析表:对于Follow®集中的任何一个符号,都可以执行归约动作。

LR(1)分析表:只有当下一个输入符号为$的时候,才可以执行归约动作。
在这里插入图片描述

错误预见解析

下面由红色虚线框住的状态,如果根据SLR文法分析,当输入符号为 = 号的时候是可以进行归约的,但是从我们初始的文法可以看到,输入语句中最多只有一个 = 号,而I10I12I13状态都要经过I2I6这两步得到,很明显在进行 = 号的归约之前,就已经存在一个 = 号,因此这里如果遇到 = 号进行归约肯定是错误的。
在这里插入图片描述

SLR和LR(1)自动机转换图比较

通过对比,可以很明显的看出来,LR(1)的状态跟多,这是因为LR(1)分析法细化了输入信息,将状态进行了分裂。
在这里插入图片描述
概念补充

如果除展望符外,两个LR(1)项目集是相同的,则称这两个LR(1)项目集是同心

如果LR(1)分析表中没有语法分析动作冲突,那么给定的文法就称为LR(1)文法。

LALR分析法

LR(1)状态太多了,为了使LR(1)技术实用化,需要尽可能减少其状态数,而同心项目集合就是切入点。

不冲突,指的是都是将L归约为R,而不是归约为不同的非终结符。

观察下图,根据上面分析, 8 和10可以进行状态合并。4和11、5和12、7和13也是可以合并的同心项目集。

没有动作冲突的状态进行合并,可以大大减少自动机状态数,这样空间可以大大的节省。
在这里插入图片描述
在这里插入图片描述

合并同心项目集

在这里插入图片描述

LALR自动机

在这里插入图片描述
同心,所以合并的其实是对应项的展望符集合,展望符只在归约的时候起作用,在移入的时候是不起作用的,因此只要在合并前,各个同心项目集本身不存在移入/归约冲突,那么合并后肯定也是不存在移入/归约冲突的。
在这里插入图片描述

LALR(1)的特点

在这里插入图片描述
在这里插入图片描述

补充:直接从LR(0)转为LALR

比较值得注意的一点是,在同一个状态中,等价项目的产生不是通过继承得到的展望符,需要给上一级项目反馈。也就是说,如果产生的新项目的展望符是自生的,需要把这个新的展望符也添加到上一级项目的展望符中。比如下面状态②中,项目2对项目1的反馈作用。
在这里插入图片描述

  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值