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文法分析,当输入符号为 = 号的时候是可以进行归约的,但是从我们初始的文法可以看到,输入语句中最多只有一个 = 号,而I10
、I12
、I13
状态都要经过I2
和I6
这两步得到,很明显在进行 = 号的归约之前,就已经存在一个 = 号,因此这里如果遇到 = 号进行归约肯定是错误的。
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的反馈作用。
静繇: 你好up,想问一下有没有这个网络后期相关的研究文章,我查找了一下没有找到。
CSDN-Ada助手: 你好,CSDN 开始提供 #论文阅读# 的列表服务了。请看:https://blog.csdn.net/nav/advanced-technology/paper-reading?utm_source=csdn_ai_ada_blog_reply 。如果你有更多需求,请来这里 https://gitcode.net/csdn/csdn-tags/-/issues/34?utm_source=csdn_ai_ada_blog_reply 给我们提。
Kwan的解忧杂货铺@新空间代码工作室: 博主的文章总是内容丰富,讲解得非常清晰,每次都是一次启发,你的博客如同一本知识宝典,每次阅读都充实了我的思维,期待博主下次更新。真的很感谢你的贡献。
CSDN-Ada助手: 你好,CSDN 开始提供 #论文阅读# 的列表服务了。请看:https://blog.csdn.net/nav/advanced-technology/paper-reading?utm_source=csdn_ai_ada_blog_reply 。如果你有更多需求,请来这里 https://gitcode.net/csdn/csdn-tags/-/issues/34?utm_source=csdn_ai_ada_blog_reply 给我们提。
CSDN-Ada助手: 你好,CSDN 开始提供 #论文阅读# 的列表服务了。请看:https://blog.csdn.net/nav/advanced-technology/paper-reading?utm_source=csdn_ai_ada_blog_reply 。如果你有更多需求,请来这里 https://gitcode.net/csdn/csdn-tags/-/issues/34?utm_source=csdn_ai_ada_blog_reply 给我们提。