自底向上分析之LR分析法

说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。

基本概念

1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导),是自底向上分析方法的高度概括和集中。

2. LR(k)文法确定的分析器适用于一大类上下文无关文法的语法分析,基本上包括了所有无二义性的上下文无关文法的集合,包括了前面讨论的LL(k)和算符优先文法。

3. 优缺点

  • 适合文法类足够大,适用于所有上下文无关文法
  • 分析效率高
  • 报错及时
  • 可以自动生成
  • 但手工实现工作量大

4. LR分析器的组成:状态栈、分析表、控制程序。

  • 状态栈:放置分析器状态和文法符号;
  • 分析表:由两个矩阵组成,其功能是指示分析器的动作,是移进还是规约,根据不同的文法类要采用不同的构造方法。
  • 控制程序:执行分析表所规定的动作,对栈进行操作。

不同的LR分析器区别在于分析表的构造方法,状态栈和控制程序都是一样的。

5. 不同文法类层次结构

下面我们讲讨论LR(0)、SLR(1)、LR(1)、LALR(1)。

  • LR(0):
  • SLR(1):简单LR方法,最容易实现,功能最弱,适应文法范围较小,大师具有较高的实用价值;
  • LR(1):规范的LR方法,功能最强,适应的文法范围最大,但实现的代价最高,故使用价值不大。
  • LALR(1):向前看的LR方法,适用文法范围介于上述两者之间,可用于大多数程序设计语言,用途最广。

注:三种方法对应三种分析表构造方法,三种分析表分别对应三类文法。一个SLR文法必定是LALR文法和LR文法。

LR分析器

1. LR分析器为一个输入串逆向构造了一个最右推导。通过考虑现有符号串(句型)以及向前看未处理的前k个字符就能识别出句柄(最左简单短语),成该文法为LR(k)文法。

2. 活前缀

规范句型:通过规范规约得到的句型。

规范句型前缀:将输入串的剩余部分与其连结起来就构成了规范句型。对于复返句型 \(αβt\),\(αβ\)即是一个前缀。

活前缀:对于句型 \(αβt\), \(β\) 表示句柄,如果 \(αβ = u1 u2 … ur\),那么符号串u1 u2 …ui (1≤i≤r)即是句型 \(αβt\) 的活前缀。

举个例子:

3. 分析表:两个矩阵,状态转移表(GOTO表)和分析动作表(ACTION表)。

GOTO表:行为分析器的状态,列为文法符号(Vn+Vt)。GOTO[Si-1, xi] = Si,表示当前栈顶状态 Si-1 遇到新的栈顶符号 xi 要转移到新的栈顶状态 Si。可以看出,GOTO表定义了一个以文法符号集为字母表的有穷自动机,该自动机识别文法所有规范句型的活前缀。

ACTION表:ACTION[ Si , a ] =分析动作。分析动作有四种:移进、规约、接受。出错。

两个表可以融合,方便查表。

4. 控制程序:根据栈顶状态和现行输入符号,查分析动作表(ACTION表),执行由分析表所规定的操作;并根据GOTO表设置新的栈顶状态(即实现状态转移)。

5. 分析过程:每次规约总是规约当前句型的句柄,是规范规约!分析的每一步栈内符号串均是规范句型的活前缀,且与输入串的剩余部分构成规范句型。

构造LR分析表

1. 方法:根据文法构造识别规范句型活前缀的有穷自动机 DFA。再由由DFA构造LR分析表。

DFA定义五元式:M = ( S, V, GOTO, S0, Z )

S:有穷状态集

V:文法字汇表(Vn+Vt)

GOTO:状态转移表对应的转移函数

S0:初始状态

Z:终态集,在这里除了S0以外其余状态都是终态。

2. DFA中的有穷状态集S在此,S = LR(0)项目集规范族

项目集规范族:每个元素为项目组成的集合。

项目:在文法G的产生式右部某处加点的产生式,如对于产生式 \(A→XY\),有项目

\(A→.XY\) 、\(A→X.Y\) 、\(A→XY.\) 三个项目。特别的,对于 \(A→ε\),存在唯一项目 \(A→.\)。

LR(0)分析法

1. 求解单个的项目集,对应DFA中的单个元素。

闭包运算,如果I是文法G的项目集,那么closure(I)由一下两条规则求得:

  • 初始时,将I的每个项目放入closure(I)中;
  • 如果 \(A→α.Bβ\)在closure(I)中,且存在产生式 \(B→γ\),则将 \(B→.γ\) 加入closure(I)中。

2. goto函数:goto(I,X)中I是项目集,X是文法符号,goto(I,X)定义为所有形如 \([A→αX.β]\)项目集的闭包,前提是 \([A→α.Xβ]\) 在I中。

即有goto(I,X)= closure(J),右部分仍是项目集。直观地说,这一步之后,找到了DFA中从状态 \(I\) 经过 \(X\) 弧转移到状态 closure(J)。

SLR(1)

LR(1)

LALR(1)

本节内容太多了,考完再写了,对不起~

引用说明

- 邵老师课堂PDF
- 《编译原理级编译程序构造》

编译原理(六)自底向上分析之LR分析法的更多相关文章

  1. 【编译原理】自底向上分析方法——LR文法分析方法的总结

    LR(0).SLR(1).LR(1).LALR(1) de 若干方面的区别 目录 推导过程 分析能力 本质区别 文法对比 可以适当利用物理意义对二义性文法进行冲突处理 推导过程 LR(0)的基础上才有 ...

  2. 《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集

    <编译原理>-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集 上一篇:编译原理-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 本 ...

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

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

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

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

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

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

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

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

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

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

  8. 编译原理 LR分析(主要是LR(0)分析)

    一.LR分析的基本原理 1.LR分析的基本思想 LR方法的基本思想就是,在规范归约的过程中,一方面要记住已移进和归约出的整个字符串,也就是说要记住历史:一方面能够根据所用的产生式的推测未来可能碰到的输 ...

  9. 编译原理-第四章 语法分析-4.7 规范的LR分析

    规范的LR分析 一.规范LR(l)项 二.规范LR(l)项集族 1.构建项目集 2.例 三.规范LR(1)语法分析表 1.构造 2.例1 3.例2 四.LALR语法分析表 1.重要性 2.特点 3.构 ...

随机推荐

  1. 配置yum源方法,以及失效时的处理

    正常方法如下: step1: 备份原CentOS-Base.repo 文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...

  2. PHP半年了,已经可以独立支撑项目,几点心得记录

    从去年12开始零基础学习PHP,到现在可以独立支撑项目,感谢PHP的强大,成熟.入门容易,记录几点心得: 1.思维比什么都重要,方法要靠实践证明: 2.多写.多试,不要怕遇到坑,每一个坑都是你前进路上 ...

  3. CSS 如何让Table的里面TD全有边框 而Table的右左边框没有

    比如这样一个CSS.td3{font-size: 14px;color: #FFFFFF;background-color: #000000;BORDER-RIGHT: #f6f6f6 1px sol ...

  4. Java设计模式(4)——单例模式

    转载:http://wiki.jikexueyuan.com/project/java-design-pattern/singleton-pattern.html 单例模式根据实例化对象时机的不同分为 ...

  5. Path Creation and Path Painting

    [Path Creation and Path Painting] Path creation and path painting are separate tasks. First you crea ...

  6. python decimal和fractions模块

    1.简介 默认,浮点数学缺乏精确性 decimal 模块提供了一个 Decimal 数据类型用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于金融应用和其它需要精确十进制表达的场合, ...

  7. 企业搜索引擎开发之连接器connector(二十七)

    ChangeQueue类实现ChangeSource接口,声明了拉取下一条Change对象的方法 * A source of {@link Change} objects. * * @since 2. ...

  8. linux下的文本操作之 文本查找——grep

    摘要:你有没有这样的应用场景:调试一个程序,出现debug的提示信息,现在你需要定位是哪个文件包含了这个debug信息,也就是说,你需要在一个目录下的多个文件(可能包含子目录)中查找某个字符串的位置: ...

  9. Jquery 自定义插件写法(示例)

    (function ($) { $.SmsHelper = $.SmsHelper || {}; $.extend($.SmsHelper, { //插件具体实现代码 yzmnum: 60, Ajax ...

  10. 关于如何参与到开源项目中《How To Succeed In Open Source ( In Ways You Haven't Considered Yet )》

    转自:http://gaslight.co/blog/how-to-succeed-in-open-source-in-ways-you-havent-considered-yet It’s Easy ...