LR(0)、SLR(1)、LR(1)、LALR(1) de 若干方面的区别

推导过程

LR(0)的基础上才有SLR(1) SLR分析方法只用在分析表上,DFA与LR(0)相同
LR(1)的基础上才有LALR(1) LR(1)的DFA合并同心项才能为LALR(1)

分析能力

LR(1)>LALR(1)>SLR(1)>LR(0)
分析能力指的是分析方法对于文法的甄别能力,也就是可以理解成文法包括的范围,LR(1)范围最大,比如,是SLR(1)文法的文法也一定是LR(1)文法

本质区别

四个文法,区别都只在一点,LR分析表中ACTION表中的归约动作的差别:
先做一个假设,有文法G,其中:

文法的第二条产生式是 (2) A->a  (之后的r2表示按照第二条产生式进行归约)
终结符集合是 { a,b,c,$ }
FOLLOW(A) = { b,c }
有状态 I5: A->a·
(LR(1)时 有状态 I5: A->a·,b )
(LALR(1)时 有状态 I5: A->a·,b 和同心项 I10: A->a·,$ 合并为 I5: A->a·,b|$ )
  • LR(0) 状态有归约状态,整个状态都会进行该归约动作
    即LR分析表中的状态5所在的那一整行全填 r2
状态 a b c $
5 r2 r2 r2 r2
  • SLR(1) 状态中针对FOLLOW集中有的终结符号会进行该归约动作
    即LR分析表中的状态5所在的那一行中对应的FOLLOW(A)中有的终结符填写r2
状态 a b c $
5 r2 r2
  • LR(1) 状态中针对展望符对应的总结符号进行该归约动作(一般为FOLLOW集的真子集)
    即LR分析表中的状态5所在的那一行中只对展望符b填写归约动作r2
状态 a b c $
5 r2
  • LALR(1) 状态中也是针对展望符对应的总结符号进行该归约动作(一般为FOLLOW集的真子集)
    即LR分析表中的状态5所在的那一行中只对展望符b和$填写归约动作r2
状态 a b c $
5 r2 r2

文法对比

  • SLR(1)对于LR(0) 排除不合理的归约,使用FOLLOW集解决移入-归约、归约-归约冲突。如果FOLLOW(A)与FIRST(B)存在交集,且A,B属于同一个项目集,则SLR无法解决该冲突。
  • LR(1)对于SLR(1) SLR(1)无法解决的冲突使用LR(1)分析法可以解决。使用展望符,每个展望符是FOLLOW集的子集(一般为真子集)。
  • LALR(1)对于LR(1) LALR(1)就是在LR(1)的基础上合并同心项集(具有相同核心的项集,也就是项集的第一分量也叫做核心项),与之同时可能会引出新的冲突且只能为归约-归约冲突(原因是合并同心项本质上只是将展望符合并了,对原本的移入动作并没有影响,所以只能是归约-归约冲突)。另外一个毛病是LALR(1)会将LR(1)的报错延后,会多进行若干次归约,直到碰到移入动作才能检测出错误。
  • 另外,LR(0)、SLR(1)、LALR(1)的状态数都是一样的,但是LR(1)的状态数会多非常多,比如C语言的文法,LR(0)分析时只有几百个状态,而LR(1)分析会出现几千个状态,所以实际开发中使用LR(1)是不合理的,因而才出现LALR(1)分析方法。

可以适当利用物理意义对二义性文法进行冲突处理

有时候二义性文法相较于无二义性文法来说,少了很多非终结符,这样进行LR(0)分析时也会方便很多,减少很多状态,

如图,左为有优先级的LR分析的树、中为二义性文法的LR分析的树、右为LL分析的树
可以看出,二义性文法的LR分析比有优先级的LR、LL分析方法都简洁高效,因而,在某些时候,权衡性能和效益、确保正确使用文法的情况下,可以适当的使用LR(0)对二义性文法进行分析。

二义性文法

(1)E->E + E
(2)E->E * E
(3)E->(E)
(4)E-> id

在一下两个状态中

I7
E→ E + E·
E→ E· + E
E→ E·*E I8
E→ E * E·
E→ E· + E
E→ E·*E

使用SLR分析方法构造SLR分析表:FOLLOW(E) = { +,,),id,$}
对于状态7:
当输入符号是 ‘+’ 时,状态7出现移入-规约冲突,因为+可以移入,同时+属于FOLLOW(E),可以进行归约动作r1
此时,根据物理意义,即加法的左结合律,a+b+c可以先a+b进行计算,所以此时不会进行移入操作,而是只进行归约操作。
当输入符号是 ‘ * ’ 时,状态7出现移入-规约冲突,因为
可以移入,同时属于FOLLOW(E),可以进行归约动作r2
此时,根据物理意义,即乘法的优先级,a+b
c需要先对b*c进行计算,所以此时不会进行归约操作,而是只进行移入操作。
故而状态7的冲突得到解决。
状态8同理,可自行尝试。

一直学,你只是个学生,但只需自创一招,你便是宗师

【编译原理】自底向上分析方法——LR文法分析方法的总结的更多相关文章

  1. 编译原理 算法3.8 LR分析 c++11实现

    LR分析简介 LR分析是应用最广泛的一类分析方法,它是实用的编译器功能中最强的分析器,其特点是: 1,采用最一般的无回溯移进-规约方法. 2,可分析的文法是LL文法的真超集. 3,能够及时发现错误,及 ...

  2. 编译原理--02 自顶向下、自底向上的LR分析复习(清华大学出版社第3版)

    前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 第4章 自顶向下的语法分析方法 确 ...

  3. 【编译原理】c++实现自下而上语法分析器

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  4. [Vue源码]一起来学Vue模板编译原理(一)-Template生成AST

    本文我们一起通过学习Vue模板编译原理(一)-Template生成AST来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫持和发布订阅 一起来学Vu ...

  5. 编译原理(六)自底向上分析之LR分析法

    自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...

  6. 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析

    <编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...

  7. 编译原理实验之SLR1文法分析

    ---内容开始--- 这是一份编译原理实验报告,分析表是手动造的,可以作为借鉴. 基于  SLR(1) 分析法的语法制导翻译及中间代码生成程序设计原理与实现1 .理论传授语法制导的基本概念,目标代码结 ...

  8. 编译原理根据项目集规范族构造LR(0)分析表

    转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...

  9. 编译原理LL1文法分析树(绘图过程)算法实现

    import hjzgg.analysistable.AnalysisTable; import hjzgg.first.First; import hjzgg.follow.Follow; impo ...

随机推荐

  1. 微信请求tp5框架数据 及渲染数据至页面

    tp模型数据: namespace app\xcx\model; use think\Model; class XcxModel extends Model { //链接数据库表名 protected ...

  2. 1列表展示的SQL,改为:只查询出vip会员,展示在页面上(10分)

    模型代码: //会员 public static function member(){ return self::where('status',1)->select(); } 控制器代码: // ...

  3. MySQL主从复制介绍:使用场景、原理和实践

    MySQL主从复制介绍:使用场景.原理和实践 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借 ...

  4. js开发文档生成工具jsdoc安装使用

    1.全局安装jsdoc,需要先安装node环境哦~ npm install -g jsdoc 2.在项目根目录新建文件conf.json,内容如下: { "tags": { &qu ...

  5. How Do Vision Transformers Work?[2202.06709] - 论文研读系列(2) 个人笔记

    [论文简析]How Do Vision Transformers Work?[2202.06709] 论文题目:How Do Vision Transformers Work? 论文地址:http:/ ...

  6. 关于DP动规

    今天学了动规,简单记录一下自己理解了的:(要不俺就忘了) 首先,啥是DP??? 动态规划,其实就是组合子问题的解来解决整个问题的解,由于每个子问题他只判断一次,所以不会重复计算,那就很牛啊!!! 专业 ...

  7. 4月11日 python学习总结 对象与类

    1.类的定义 #类的定义 class 类名: 属性='xxx' def __init__(self): self.name='enon' self.age=18 def other_func: pas ...

  8. sqlmap的使用手册

    0x01. Sqlmap支持的数据库 SQLMap支持的数据库: MySQL Oracle PostgreSQL Microsoft SQL Server Microsoft Access IBM D ...

  9. 入门级的Makefile制作dynamic lib

    代码文件结构: . ├── dynamiclib_add.c ├── dynamiclib_mul.c ├── dynamiclibs.h ├── libs └── Makefile 1 direct ...

  10. 【编程教室】Python绘制冬奥吉祥物“冰墩墩”

    大家好,欢迎来到 Crossin的编程教室 ! 这两天,随着北京冬奥会的开幕,吉祥物"冰墩墩"可是火出了圈,多少人排长队都买不到.据说甚至有人把价格炒到了几千元. 就连昨天的&qu ...