【编译原理】自底向上分析方法——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 ...
随机推荐
- jq全选、全不选、反选、单删、批量删除
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- laravel报错 : No application encryption key has been specified.
创建了新的laravel项目后, 运行提示:No application encryption key has been specified 解决方法: 这个是由于没有配置好 APP_KEY 在终端上 ...
- nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
问题场景 服务器重启后,重启nginx时报错nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: N ...
- Linux环境下安装Maven
最近在搞虚拟机,记录下虚拟机内Maven环境的搭建流程 一.选择合适的版本(由于Maven运行需要依赖于JDK,所以安装之前需要保证当前虚拟机下已经安装并配置好JDK环境,安装流程参见) https: ...
- java反射获取类的成员函数,成员变量,构造函数
package com.imooc.reflect;import javax.sound.midi.Soundbank;import java.lang.reflect.Constructor;imp ...
- NET经典书籍必读
C#与.NET框架,入门 + 进阶 + 精通,外加并发编程实例,10本C#图书,一本都不能少. 1.<Learning hard C#学习笔记> 作者:李志 书号:978-7-115-3 ...
- 获取ajax动态加载的多个a标签中的 点击的那个a标签对应的值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 6月16日 Django作业 文件解压缩统计行数
作业要求: 前端页面注意: 自己写的: from django.shortcuts import render, HttpResponse import zipfile import re # Cre ...
- python监控cpu 内存实现邮件微信报警
# qianxiao996精心制作 #博客地址:https://blog.csdn.net/qq_36374896 import psutil, time,smtplib,socket import ...
- jpg, jpeg和png区别?
jpg是jpeg的缩写, 二者一致 PNG就是为取代GIF而生的, 无损压缩, 占用内存多 jpg牺牲图片质量, 有损, 占用内存小 PNG格式可编辑.如图片中有字体等,可利用PS再 ...