【编译原理】自底向上分析方法——LR文法分析方法的总结
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+bc需要先对b*c进行计算,所以此时不会进行归约操作,而是只进行移入操作。
故而状态7的冲突得到解决。
状态8同理,可自行尝试。
一直学,你只是个学生,但只需自创一招,你便是宗师
【编译原理】自底向上分析方法——LR文法分析方法的总结的更多相关文章
- 编译原理 算法3.8 LR分析 c++11实现
LR分析简介 LR分析是应用最广泛的一类分析方法,它是实用的编译器功能中最强的分析器,其特点是: 1,采用最一般的无回溯移进-规约方法. 2,可分析的文法是LL文法的真超集. 3,能够及时发现错误,及 ...
- 编译原理--02 自顶向下、自底向上的LR分析复习(清华大学出版社第3版)
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 第4章 自顶向下的语法分析方法 确 ...
- 【编译原理】c++实现自下而上语法分析器
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- [Vue源码]一起来学Vue模板编译原理(一)-Template生成AST
本文我们一起通过学习Vue模板编译原理(一)-Template生成AST来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫持和发布订阅 一起来学Vu ...
- 编译原理(六)自底向上分析之LR分析法
自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...
- 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析
<编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...
- 编译原理实验之SLR1文法分析
---内容开始--- 这是一份编译原理实验报告,分析表是手动造的,可以作为借鉴. 基于 SLR(1) 分析法的语法制导翻译及中间代码生成程序设计原理与实现1 .理论传授语法制导的基本概念,目标代码结 ...
- 编译原理根据项目集规范族构造LR(0)分析表
转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...
- 编译原理LL1文法分析树(绘图过程)算法实现
import hjzgg.analysistable.AnalysisTable; import hjzgg.first.First; import hjzgg.follow.Follow; impo ...
随机推荐
- laravel 实现详情分页
选择合适的PHP框架及前端框架布局页面(10分) 首先展示出分类列表,每个分类下只显示3条信息,无需分页 (30分) 在列表页 点击文章标题进入详细页面,对应的文章点击量+1(30分) 在详细页面点击 ...
- Spring系列25:Spring AOP 切点详解
本文内容 Spring 10种切点表达式详解 切点的组合使用 公共切点的定义 声明切点@Poincut @Poincut 的使用格式如下: @Poincut("PCD") // 切 ...
- SQL基础语法_张三
1.1 建库表语法 1.2 字段数据类型 大致可以分为三类:数值.日期/时间和字符串 (字符)类型. 2. 增删查改 3. 关联查询 4. 子查询
- Play商店显示需要进行身份认证。您需要登录自己的Google帐户
前段时间把一加6系统从H2OS换到OxygenOS,Play商店死活不能登录,网络配置等问题已经排除,重装Google全家桶也没有解决问题,最后找到原因. 解决办法:在应用列表中找到Google Pl ...
- 高并发之 API 接口,分布式,防刷限流,如何做?
在开发分布式高并发系统时有三把利器用来保护系统:缓存.降级.限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解 ...
- Linux系统配置(系统优化)
镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 前言 系统安装完成后,需要基于系统做出一些调整来让系统使用起来更加顺手,可以根据个人喜好对linux进行调整,还有一些是linux的必要设置 一 ...
- kubernetes关于证书配置得问题总结
总结证书配置 1.证书首先分为两种配置方式, 1) 一种是在集群中配置 2) 一种是在上游负载均衡中配置. 1)https证书在集群中配置,并域名直接解析到集群的ingress-nginx-contr ...
- EasyExcel完成excel文件的导入导出
简介 常见的Excel分析框架有Apache poi 和EasyExcel, poi在另一篇已经介绍过了,详情可以看[https://www.cnblogs.com/jasmine-e/p/16064 ...
- vue的seo问题?
seo关系到网站排名, vue搭建spa做前后端分离不好做seo, 可通过其他方法解决: SSR服务端渲染: 将同一个组件渲染为服务器端的 HTML 字符串.利于seo且更快. vue-meta-in ...
- 什么是 zuul路由网关?
(1)Zuul 包含了对请求的路由和过滤两个最主要的功能:其中 责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负 请求的处理过程进行干预,是实现请求校验.服务聚合等功 ...