一、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. 去掉小程序textarea上的完成按钮栏

    小程序textarea上会自动多一个完成按钮,如下图所示,如果是mpVue,在textarea添加     :show-confirm-bar="false"     即可.  

  2. 报错** is not accessible due to restriction on required library

    报错: Description Resource Path Location TypeAccess restriction: The type Map<String,Object> is ...

  3. 支付宝移动支付之IOSApp调用支付宝钱包

    近期客户提出要开发一个IOS上的app作为訪问他们站点的途径之中的一个.为什么说之中的一个呢.因为眼下PC和Mobile这两个站眼下都已经上线了. 所以问题就简单了,我们仅仅须要把mobile站UI改 ...

  4. SQL 约束(Constraints)

    SQL 约束(Constraints) SQL 约束(Constraints) SQL 约束用于规定表中的数据规则. 如果存在违反约束的数据行为,行为会被约束终止. 约束可以在创建表时规定(通过 CR ...

  5. Object.getOwnPropertyNames()

    1.Object.getOwnPropertyNames(),遍历实例属性(包括不可枚举),返回属性名组成的数组 var arr = ["a", "b", &q ...

  6. 工作总结 使用html模板发邮件 前面空一大块

    HTML邮件的本质其实是发送了一个html页面.邮件的空白必然是页面的空白,所以你要找到你发送邮件的html模板所在,然后去掉空白即可,如果这是一个公共文件,需要注意你往往用的只是你的部分,很大程度还 ...

  7. 【转载】TCP,IP,HTTP,SOCKET区别和联系

    网络由下往上分为:        对应 物理层-- 数据链路层-- 网络层--                       IP协议 传输层--                       TCP协议 ...

  8. Android中View窗口getWidth和getMeasuredWidth的差别

    今天在研究自己定义listview的下拉刷新的效果.想移植到项目需求中,再看自己定义源代码时发现了一个问题就是getWidth和getMeasuredWidth两个方法有什么差别,求教万能的百度,经调 ...

  9. Codeforces 768 E. Game of Stones 博弈DP

    E. Game of Stones   Sam has been teaching Jon the Game of Stones to sharpen his mind and help him de ...

  10. 强大的DataGrid组件[7]_自定义DataGrid——Silverlight学习笔记[15]

    基本知识讲解 1)两种状态 DataGrid的单元格的状态有两类,即编辑状态和非编辑状态. 在实际开发中,如果一个单元格所在的列不设为只读的话(即要求可读写),那么这个单元格就存在这两种状态.按需要, ...