编译原理-语法分析(自底向上)
文章目录
- 核心问题
- 概念
- 句柄
- LR(k) 与LR文法
- 自底向上分析概述
- LR(0) 项目自动机
- LR(0) 项
- 增广
- 构造自动机--项集,项集闭包,项集投影
- 内核项 与 非内核项
- 构造自动机--GOTO函数
- 移入规约冲突
- SLR
- LR(1)
- LALR(1)
- LALR分析器与LR分析器
- 子问题
- 构造自动机--完整算法,实例
- 计算展望符集
- LR(1)项目自动机的构造
- LALR(1)项目自动机的构造
- 消除LR文法二义性
- 语法错误的处理
自顶向下解决该使用哪条产生式进行推导的问题
自底向上解决什么时候该移入,什么时候该规约的问题
核心问题
- 什么时候移入,什么时候规约
通过action表执行相应的移入规约动作
- 如何解决移入规约冲突
通过向前看一个字符,这个字符可以是非终结符的follow集,也可以是产生式的展望集
- LR(0),SLR(1),LR(1),LALR(1)的关系
见 概念->LALR分析器与LR分析器
概念
句柄
“句柄”: “正确的待规约对象”,即它能保证被归约后一定还保持着最右句型
- 短语,简单短语
- 一个短语,满足:被规约后,整个句子仍然保持最右句型。2.一个句型简单短语可能有多个,称最左简单短语为句柄。
- rm: 最右推导
- 规范句型(最右句型):通过最右推导或最左规约得到的句型
- 规范前缀:一个规范句型的前缀,且前缀后面不包括非终结符,如:
- 规范活前缀
就是在栈中可能出现的前缀。
满足:
如:
活前缀又分两种类型:归态活前缀、非归态(移入)活前缀
LR(k) 与LR文法
LR(k)
- L 表示最左扫描,R表示反向构造出最右推导,k 表示最多向前看 k 个符号
LR文法:
- 某一CFG能够构造一张分析表,使得表中每一元素至多只有一种 明确动作,则称改文法为LR文法
- 并非所有CFG都是LR文法,但对于多数程序设计语言,一般 都可以用LR文法描述;和LL(1)相比,LR分析适应的文法范围要 广一些
不同的LR方法对CFG的要求不一样, 能够分析的CFG多少也不一 样, L R ( 0 ) ⊆ S L R ( 1 ) ⊆ L A L R ( 1 ) ⊆ L R ( 1 ) LR(0) \subseteq SLR(1) \subseteq LALR(1) \subseteq LR(1) LR(0)⊆SLR(1)⊆LALR(1)⊆LR(1)
LR(0)文法
已知LR0 是CFG G的LR(0)自动机 。如果LR0的任意一个状态都不存在冲突(归约-归约冲突、移入-归约 冲突), 则G称为LR(0)文法;
自底向上分析概述
例:
LR(0) 项目自动机
LR(0) 项
增广
当规约到S‘ 时结束
构造自动机–项集,项集闭包,项集投影
内核项 与 非内核项
构造自动机–GOTO函数
移入规约冲突
SLR
向前看一个输入符号来选择分析动作
对于可规约项目 B ⟶ β ⋅ B\longrightarrow \beta\cdot B⟶β⋅ 如果 a ∉ f o l l o w ( B ) a\notin follow(B) a∈/follow(B), 那么当读头是a时,不应该规约此项目。由此可解决一些 S-R 和 RR 冲突
如果能将LR(0)自动机中的所有冲突消除掉,则该文法称为SLR(1) 文法 , 否则称为非SLR(1)文法。
LR(1)
SLR中在向前看的时候,只考虑了非终结符的follow,而没有根据具体的产生式分析。
LR(1)做出了如下改进
- 给每个LR(0)项目添加展望信息,即添加句柄之后可能跟的终结符, 因为这些终结符确实是规范句型中跟在句柄之后的
- 不要看Follow集,而是要看展望符(First集)
且投影操作对展望符集没有影响。
如果对于任意一个状态s和任意的一个终极符a, A1(s,a)只有一个唯 一的动作, 则文法G称为LR(1) 文法
LALR(1)
LR(1)为消除冲突,引入太多的状态; 有些状态含有完全相同的LR(0)项目部分,只有展望符部分是不同 的;
- LR(1)项目的心:如果( A ⟶ α ⋅ β A\longrightarrow \alpha \cdot \beta A⟶α⋅β, ss) 是一个LR(1)项目,则其中的 LR(0)项目部分称为它的心;
- LR(1)自动机状态的心:一个状态所含有的所有LR(1)项目的心;
- 同心状态:如果两个LR(1)状态具有相同的心,则称这两个状态为 同心状态
合并文法G的LR(1)自动机中的同心状态,得到的自动机称为 LALR(1)自动机;
若这个得到的LALR(1)自动机没有冲突,则称文法G是LALR(1)文 法。
构造LALR(1)自动机两种思路:
- 先构造LR(1), 再合并(不现实)
- 能用LR(0)自动机构造LALR(1)自动机
LALR(1)与LR(1),LR(0)
- G的LALR(1)项目跟LR(1)项目形式相同;
- LALR(1)自动机中每个状态S中各个项目的展望符集是把LR(1)自 动机中所有和S同心的状态的对应项目的展望符集合合并后得到的;
- 如果每个LALR(1)的状态都用该状态的心(LR(0)项目)替换,则 LALR(1)自动机和它的LR(0)自动机相同;
- G的LALR(1) 自动机的状态数同LR(0)自动机的状态数相同;
LALR分析器与LR分析器
分析能力
- 如果是正确的输入串
- LALR和LR分析器执行完全相同的移入和归约动作序列,只是栈中的状态名字 有所不同
- 如果是错误的输入串
- 则LALR分析器可能会比LR分析器晚一点报错,定位一样,能力一样
- LALR分析器不会在LR分析器报错后再移入任何符号,但是可能会继续执行一 些归约
状态数:
- 对LR(1)项集规范族中所谓的同心项集进行合并,从而使得分析表既保持了 LR(1)项中向前看符号的信息,又使状态数减少到与SLR分析表的一样多
- LR(1) > LALR(1) = SLR(1) = LR(0)
展望符的确定:
- LR(0)没有展望符;
- SLR(1)取follow集;
- LR(1)取不同位置的follow集
- LALR(1)取同心项的展望符的并集;
分析能力: LR(1) LALR(1) SLR(1) LR(0)
子问题
构造自动机–完整算法,实例
- 注意goto表和action表的区别:在使用自动机的时候,实际只用到了action表,goto表在分析action表的规约动作的时候会用到。
计算展望符集
LR(1)项目自动机的构造
LALR(1)项目自动机的构造
通过LR(0)构造
- step1:构造LR(0)
- step2:计算展望符集
消除LR文法二义性
二义性文法都不是LR的
- 之前消除通过改造文法消除二义性,还可以通过改造LR分析表来消除二义性
例:
E ⟶ E + E ∣ E ∗ E ∣ ( E ) ∣ i d E\longrightarrow E+E|E*E|(E)|id E⟶E+E∣E∗E∣(E)∣id
设定优先级如下:*的优先级大于+,且+是左结合的,则有
- 下一个符号为+时,我们应该将E+E归约为E
- 下一个符号为*时,我们应该移入*,期待移入下一个符号
语法错误的处理
编译原理-语法分析(自底向上)相关推荐
- 编译原理语法分析之LR分析
要求: (1)根据给定文法,先对文法进行解析,构造识别活前缀的DFA并输出: (2)根据DFA构造LR分析表并输出: (3)分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (4) ...
- 编译原理:语法分析实验(LR分析法)
语法分析实验 一.实验目的 根据LR分析法的原理,对指定文法构造识别活前缀的DFA,做出相应的LR分析表,并编程实现相应的语法分析程序.或根据预测分析法的原理,对指定文法构造预测分析表,并编程实现相应 ...
- 编译原理 --- 语法分析概念,自上而下分析面临的问题以及如何消除左递归问题
第一部分 --- 语法分析基本概念 1.上面这个箭头 --> 符号表示的意思是P被 α 定义 A是一个非终止符,γ是一个和α,β属于同一个集合的元素 1.一个双箭头符号表示的是直接推出,而一个双 ...
- 编译原理 | 语法分析(LL(1)分析法/算符优先分析法OPG)学习笔记及例子详解
语法分析(自顶向下 / 自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析 ...
- 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器
05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...
- 编译原理 语法分析树和二义性文法
语法分析树是用来描述语法中句子结构的一种树,它能够动态表示一个句子推导的过程. 我们来看一个例子:由左边的文法规则可知,这是一个实现加法减法和乘法的算术表达式.从开始符号E开始,逐步推导,E => ...
- 编译原理——语法分析(1)文法的形式定义与四种文法类型的区分
文法的形式定义 1.处理文法的语法分析器大体上可以分为三种类型:通用的,自顶向下的和自顶向上的. 2.文法:一种用于描述程序设计语言语法的表示方法--"上下文无关文法",简称&qu ...
- 编译原理——语法分析程序的设计
实验目的 通过设计.编制.调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法. 实验内容 设计一个文法的预测分析程序,判断特定 ...
- 编译原理——语法分析(递归下降)
1 实验目的 理解和掌握算术表达式的文法构造,熟悉常用的语法分析方法. 2 实验内容 根据Sample语言的语法规则判定输入的一串单词能否构成一个正确的算术表达式. 3 实验方案 3.1方案描述 ...
最新文章
- LeetCode: Longest Consecutive Sequence
- usaco Cow Pedigrees
- win7/8SVN必备的4个服务
- Java 利用接口实现回调
- QT学习:Qt对Office的基本读写
- OpenCV在相机或图像中检测QR码的实例(附完整代码)
- 金融资讯数据服务平台建设实践
- excel原来是门编程语言-使用公式拼接字符串
- g++ linux 编译开栈_linux下使用g++编译cpp工程
- 计算机集成项目经理 培训,计算机信息系统集成项目经理培训总结.doc
- 利用深度学习识别番茄早期植株中的塔图绝对菌
- android沉浸状态栏工具,Android 状态栏工具——一行代码实现状态栏...
- 《东周列国志》第七十六回 楚昭王弃郢西奔 伍子胥掘墓鞭尸
- OpenAI Gym 关于CartPole的模拟退火解法
- phyton环境添加与工作空间设置
- Arduino与Proteus仿真实例-MAX7219驱动8位7段数码管仿真
- 04. 基本数据类型 - list,tuple
- 2017春季实习生面试经历+找实习攻略
- ECB(实体边界控制)模式
- delphi控件切图界面闪烁_8、控件系列之_加载占位图+页面指示器
热门文章
- DSP6455的cmd文件
- freebsd环境变量设置
- mysql导入sql文件异常
- C#读取照片EXIF中的日期时间(家庭相片管理工具之一)
- 微信退款异步通知获得的req_infoAES加密和解密方法以及常见的问题
- 微信小程序Vue+uniapp社区居民生活事务系统python小区物业报修缴费系统java
- 计算机网络简历技能填写,计算机网络专业个人技能范文
- (问题解决)(自制脚本)Ubuntu20.04 键盘会突然失灵、键盘延迟突然很大怎么办
- ThinkPHP通过cURL的调用接口数据
- android英语学习app实战,Android高端的翻译APP,英语学习APP制作