一、LR分析的基本原理

1、LR分析的基本思想

LR方法的基本思想就是,在规范归约的过程中,一方面要记住已移进和归约出的整个字符串,也就是说要记住历史;一方面能够根据所用的产生式的推测未来可能碰到的输入符号,也就是说能够对未来进行展望。这样,当一串貌似句柄的字符串出现在分析栈的顶部时,我们希望能够根据历史和展望以及现实的输入符号这三部分的材料,决定出现在栈顶的这一串符号是否就是我们要找的句柄。

2、LR分析器的构成

采用下推自动机这种数据模型。包括以下几个部分:

    1.输入带

    2.分析栈:包括状态栈和文法符号栈两部分。(s0,#)为分析开始前预先放在栈里的初始状态和句子括号。

    3.LR 分析表:包括动作表和状态转移表两张表。

3、LR分析表是LR分析器的核心部分

一张LR分析表包括两部分:动作表(ACTION)和状态转换表(GOTO)。它们都是二维数组。ACTION[s,a]规定了当状态s面临输入符号a时应采取什么动作(移进、归约、接受和报错),而GOTO[s,X]规定了当状态s面对文法符号X(终结符或非终结符)时的下一状态是什么。

显然, GOTO[s,X]定义了一个以文法符号为字母表的DFA。

不同的 LR 分析法构造LR分析表的方法都不同,由此产生了不同的LR分析法。

4、LR分析算法

置ip指向输入串w的第一个符号

  令Si为栈顶状态

  a是ip指向的符号(当前输入符号)

  BEGIN(重复开始)

  IFACTION[Si,a]=SjTHEN

BEGIN

PUSH j,a (进栈)

          ip前进(指向下一输入符号)

       END

  ELSEIFACTION[Si,a]=rj(若第j条产生式为A→β)
THEN

          BEGIN

          pop|β| 项

          若当前栈顶状态为Sk

          pushGOTO[Sk,A] 和A(进栈)

    END

  ELSEIFACTION[Si,a]=acc THEN


    return (成功)

  ELSE error

  END. (重复结束)

二、LR(0)分析器

1、可归前缀与规范句型的活前缀

文法G[S]
(1) S → aAcBe[1]

(2) A → b[2]

(3) A →
Ab[3]

(4) B → d[4]

S ÞaAcBe[1]

 
ÞaAcd[4]e[1]

 
ÞaAb[3]cd[4]e[1]         


 
Þab[2]b[3]cd[4]e[1]

每次归约句型的前部分依次为:

ab[2]

aAb[3]

aAcd[4]

aAcBe[1]

规范句型的这种前部分符号串称为可归前缀

我们把形成可归前缀之前包括可归前缀在内的所有规范句型的前缀都称为活前缀

(活前缀就是可归前缀的前缀)如下:

e,a,ab

 e ,a,aA,aAb

 e ,a,aA,aAc,aAcd

 e ,a,aA,aAc,aAcB,aAcBe

三、LR分析

(一)LR分析构造识别活前缀的有穷自动机

项目(item):在每个产生式的右部适当位置添加一个圆点构成项目。

根据圆点所在的位置和圆点后是终结符还是非终结符把项目分为以下几种:

移进项目,形如 A→a•ab

待约项目,形如 A→a•Bb

归约项目,形如 A→a•

接受项目,形如S’ →S•

根据圆点所在的位置和圆点后是终结符还是非终结符把项目分为以下几种:

移进项目,形如 A →a . ab

    待约项目,形如 A→a . Bb

    归约项目,形如 A→a .

    接受项目,形如 S’→S.

把文法的所有产生式的项目都引出,每个项目都为NFA的一个状态。其中

文法的第一个产生式的第一个项目为文法的初态

文法的接受项目为文法的句子识别态

文法的每一个产生式的归约项目为文法的句柄识别态

构造步骤:

项目圆点的左部表示分析过程的某个时刻用该产生式归约时句柄已识别的部分,圆点右部表示待识别的部分。

构造识别活前缀的NFA:

1、把文法的所有产生式的项目都引出,每个项目都为NFA的一个状态

2、确定、确定状态之间的转换关系

  *若项目i为
...Xi-1•
Xi...Xn

  项目j为
...Xi-1
Xi •Xi+1...Xn

  则从状态i到状态j连一条标记为Xi的箭弧

  *若i为X→g•Ad,k为A→•b,则从状态i画标  记为
e的箭弧到状态k

(二)将非确定的有限自动机转换成确定的有穷自动机

方法一:(采用子集构造法)

方法二:通过构造文法G的LR(0)的项目集规范族来直接构造识别活前缀的DFA

LR(0)项目集规范族的构造

构成识别一个文法活前缀的DFA项目集(状态)的全体称为这个文法的LR(0)项目集规范族

)通过闭包函数(CLOSURE)来求DFA一个状态的项目集,找出所有的等价的项目。

如果I是文法G’的一个项目集,定义和构造I的闭包CLOSURE(I)如下:
a)I的项目都在CLOSURE(I)中
b)若A→a•
Bb属于CLOSURE(I),则每一形如B→•
g的项目也属于CLOSURE(I)

c)重复b)直到CLOSURE(I)不再扩大

(2)定义转换函数如下:
GOTO(I,X)=CLOSURE(J)

其中:I为包含某一项目集的状态,X为一文法符号

 J={任何形如A→aX •b的项目|A→a•X b属于I}

圆点不在产生式右部最左边的项目称为核,唯一的例外是S’ →
• S。因此用GOTO(I,X)转换函数得到的J为转向后状态所含项目集的核

使用闭包函数(CLOSURE)和转向函数(GOTO(I,X))构造文法G’的LR(0)的项目集规范族,步骤如下:

a)置项目S’→ •S为初态集的核,然后对核求闭包CLOSURE({S’→
•S})得到初态的项目集
b)对初态集或其它所构造的项目集应用转换函数GOTO(I,X)=CLOSURE(J)求出新状态J的项目集
c)重复b)直到不出现新的项目集为止

编译原理 LR分析(主要是LR(0)分析)的更多相关文章

  1. 《编译原理》构造与正规式 (0|1)*01 等价的 DFA - 例题解析

    <编译原理>构造与正规式 (0|1)*01 等价的 DFA - 例题解析 解题步骤: NFA 状态转换图 子集法 DFA 的状态转换矩阵 DFA 的状态转图 解: 已给正规式:(0|1)* ...

  2. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  3. 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解

    语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...

  4. 【编译原理】LL1文法语法分析器

    上篇文章[编译原理]语法分析--自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去. 说明: 这个语法分析器是利用LL1分析方法实现的. 预测分析表和终结符以及非终结符都是针对一个特定文法 ...

  5. Atitit.编译原理与概论

    Atitit.编译原理与概论 编译原理 词法分析 Ast构建,语法分析 语意分析 6 数据结构  1. ▪ 记号 2. ▪ 语法树 3. ▪ 符号表 4. ▪ 常数表 5. ▪ 中间代码 1. ▪ 临 ...

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

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

  7. 编译原理LR(0)项目集规范族的构造详解

    转载于https://blog.csdn.net/johan_joe_king/article/details/79051993#comments 学编译原理的时候,感觉什么LL(1).LR(0).S ...

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

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

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

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

随机推荐

  1. 【c++】动态内存

    静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量.注意:const常量在定义时必须初始化 栈区:在执行函数时,函数内局部变量的存储单 ...

  2. hdu 4950 Monster(数学题,多校8)

    题目链接:pid=4950http://acm.hdu.edu.cn/showproblem.php?pid=4950">http://acm.hdu.edu.cn/showprobl ...

  3. poj 2585 Window Pains 暴力枚举排列

    题意: 在4*4的格子中有9个窗体,窗体会覆盖它之下的窗体,问是否存在一个窗体放置的顺序使得最后的结果与输入同样. 分析: 在数据规模较小且不须要剪枝的情况下能够暴力(思路清晰代码简单),暴力一般分为 ...

  4. Spring中注解

    @Autowired :spring注解 @Resource :J2EE注解 @Transactional(rollbackFor=Exception.class):指定回滚 @RequestMapp ...

  5. Linq To Entities中的动态排序

    换了工作有一个月了,一样的工作.一样的代码.一样的体力活仍就…… Linq To Entityes 也是不新玩意了,近半年来也一直与之打交道,但一直也没对其深究过.今天新加的功能要对所有列支持排序,这 ...

  6. 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证

    [数据删除及执行原生sql语句] delete()  返回受影响的记录条数 $goods -> delete(30);   删除主键值等于30的记录信息 $goods -> delete( ...

  7. The uWSGI project aims at developing a full stack for building hosting services.

    https://github.com/unbit/uwsgi-docs/blob/master/index.rst

  8. ABAP ALV F4帮助

    ALV F4帮助, 选值保存到ALV. TYPE-POOLS:slis. CLASS lcl_event_receiver DEFINITION DEFERRED. DATA: gt_fcat TYP ...

  9. 设计模式-(17)策略模式 (swift版)

    一,概念: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化. 二,使用场景 1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时: ...

  10. Ubuntu上配置Eclipse:安装CDT【转】

    本文转载自:http://www.linuxdiyf.com/linux/23519.html 在最新的 Ubuntu Kylin 16.04 中安装了eclipse,在纠结了很久的网络问题之后,开始 ...