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的反馈作用。

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

  1. [性能测试]LR常见问题整理

    1.LR 脚本为空的解决方法:        1.去掉ie设置中的第三方支持取消掉 2.在系统属性-高级-性能-数据执行保护中,添加loadrunner安装目录中的vugen.exe文件. 有可能是由 ...

  2. 编译原理学习笔记(二十六)~习题:构造基于LR(0)、LR(1)项目的识别活前缀的DFA

    题目 文法: S–>Aa | bAc | dc | bda A–>d 通过构造基于LR(0).LR(1)项目的识别活前缀的DFA,判断上面文法 是否是SLR(1)文法?? 是否是LALR( ...

  3. LR(0),SLR(1),LR(1),LALR(1)的区别

    参考文章 参考文章 LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法.自下而上:从给定的句子规约到文法的开始符号.用的是归约. 种文法分析过程基本有三大步:写出自动机(即 LR( ...

  4. 【NLP】语法、文法、句法、词法概念的区别

    语法.文法.句法.词法概念的区别: 语法与文法表示同一概念,不同角度诠释而言. 句法,描述句子的结构,词之间的依赖关系. 词法,研究词自身的结构与性质.

  5. 自然语言处理(一)——文法(形式语言)基本概念

    一.基本概念 1.字符串:假定 Σ 是字符的有限集合,它的每一个元素称之为字符.由 Σ 中字符相连而成的有限序列被称之为Σ上的字符串. 这是教材对于字符串的定义,通俗地理解,字符串就是一连串的字符.不 ...

  6. 上下文无关文法和正则文法_什么是上下文无关文法?

    上下文无关文法和正则文法 Have you ever noticed that, when you are writing code in a text editor like VS code, it ...

  7. 【编译原理学习笔记】1:符号和符号串,文法和语言,文法的类型

    符号和符号串 字母表(符号集):元素的非空有穷集合. 符号:字母表中的元素. 符号串:由字母表中的符号组成的任何有穷序列. 头:如符号串z=xy中的x. 尾:如符号串z=xy中的y. 固有头:符号串的 ...

  8. 编译原理基本定义(文法、算符文法、算符优先文法、算符优先关系表、算符优先分析过程)

    文法 文法和语言分为4类. 0型文法:最大类,包含1.2.3型文法. 1型文法:对0型文法来说,所有的产生式的右边的字符长度都要大于左边的字符长度. 2型文法:所有的产生式左边都只有一个字符. 3型文 ...

  9. 编译原理学习笔记:CFG的分析树(句型的短语、二义性文法、二义性文法的判定)

    1 CFG的分析树 2 分析树是推导的图形化表示 3 (句型的)短语 4 二义性文法 5 二义性文法的判定

  10. 【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较...

    [知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 [知识点整理]Oracle中NOLOGGING.APPEND.AR ...

最新文章

  1. 解决AS gradle下载同步卡慢的问题
  2. python手机版怎么运行项目或脚本-把Python脚本放到手机上定时运行
  3. sqlserver2000内存突破4g_酷比魔方iPlay30评测:10.5英寸大屏,支持4G全网通
  4. mysql-bin.000001文件的来源及处理方法
  5. 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译
  6. MTK:NICODE与ASCII码使用
  7. python入门代码大全-初学python有哪些可以临摹的小段练习代码素材?
  8. Awvs 12.x安装及使用教程超详细(包括录制脚本)
  9. protel99se进阶视频教程(手把手教你画51单片机开发板)
  10. Qt通过域名获取IP地址
  11. 怎样用ipad使用python_如何用iPad运行Python代码?
  12. 很好听的曲子《红枣树》,歌词写的很好,摘抄一下
  13. 酒香不怕巷子深,有心人才找得到的京都茶寮
  14. c++11中的declval和decltype
  15. [转]GotW#63 狂乱的代码
  16. 国内专业垂直搜索引擎汇总
  17. synchronized同步机制——如果你愿意一层一层剥开我的心
  18. JAVA使用OUTLOOK发送邮件[451 5.7.3 STARTTLS is required to send mail]
  19. Lua与C语言的互相调用
  20. java中分割字符串总结 - 超级无敌详细版本。不仅要熟悉各种方法还要做到灵活运用。

热门文章

  1. 让ChatGPT介绍一下ChatGPT
  2. 1/n之和——调和级数
  3. 29岁女子征婚火了:父母开厂有两套房 介绍费给2万
  4. javascript异步编程系列【八】--Jscex版火拼俄罗斯
  5. AVI格式转换问题采用mediacoder和图片转换成AVI的makeavi软件
  6. 关于MPU9250的六轴DMP和九轴MPL
  7. 按照eslint 规则一键修复
  8. 第一章--数据库系统基本概念(一)
  9. 电商项目实战第三节: CSS3+HTML5+JS 设计案例【考拉海购网站】之【分类导航栏】
  10. 【读点论文】DeepFace: Closing the Gap to Human-Level Performance in Face Verification。深度学习开始对人脸下手