第7章 自下而上的LR(K)分析方法
编译原理课件 语法分析_自下而上__LR分析思想_可归前缀和活前缀

识别文法所有活前缀的
DFA
小结
识别文法所有活前缀的DFA LR分析表 LR分析
7.2.1 可归前缀和活前缀
归约 移进 归约 移进 移进 归约 移进 归约 接受
A→b
A→Ab
B→d S→aAcBe
A
B
#abbcde# 的规范归约过程
a b b c d e
定义
• 活前缀: 规范句型的一个前缀, 这种前缀不包含 句柄之后的任何符号. • 可归前缀: 包含句柄的活前缀.
LR 分析思想
规范归约过程中可能出现在栈中的符号串 活前缀
• LR 分析思想: 构造一个DFA, 识别 规范归约过程中出现在栈中的符号串
活前缀
G:S→aAcBe A→b A→Ab B→d [1] [2] [3] [4]
S 0 a
1
*
b
3
A 4 b 5 c e B 6 8 9 d 2 7
步 符号栈 骤 活前缀 1 # 2 #a
3
4 5
剩余 动作 输入串 abbcde# 移进 bbcde# 移进
G: S→ aAcBe A→ b | Ab B→ d 1.栈里的文法符号与剩 余符号串一起构成了 规范句型 2.栈里的文法符号串 • 规范句型的前缀 • 不包含句柄之后的任 何符号 S A源自67 89
10 11
#ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
bcde# bcde# cde# cde# de# e# e# # #
第七章LR分析法

识别活前缀的DFA
拓广文法G[S]: 句子abbcde的可归前缀:
S’ → S[0]
S[0]
S → aAcBe[1] ab[1]
A → b[2]
aAb[3]
A → Ab[3]
aAcd[4]
B → d[4]
aAcBe[1]
识别活前缀及可归前缀的有限自动机
0S 2a
a 5
a 9
14 a
1*
b
3
4
6 A7b
第7章 LR分析法
LR分析法
自底向上分析法的关键是如何在分析过程中 确定句柄
LR分析法给出一种能根据当前栈中的符号 串进行分析的方法,即:向右查看输入串的 K个符号就可以唯一确定分析器的动作是移 进还是归约;用哪个产生式归约。
因而也就能唯一地确定句柄 R 最右推导
规范推导 规范句型 规范归约
LR分析算法
then begin pop || 令当前栈顶状态为S’ push GOTO[S’,A]和A(进栈)
end else if ACTION[s,a]=acc
then return (成功) else error end.重复
7.2 LR(0)分析
例 G[S]: S aAcBe A b A Ab B d
⇔aAcBe[1]
用(1)规约,前部aAcBe[1]
⇔S
这些前部符号串为归约时在栈里的符号串, 规范句型的这种前部称为可归前缀。
可归前缀和子前缀
分析上述每个前部的前缀,对应分别为:
ab[2]
,a,ab
aAb[3] ,a,aA,aAb
aAcd[4] ,a,aA,aAc,aAcd
aAcBe[1] ,a,aA,aAc,aAcB,aAcBe
自下而上的LR(k)分析方法

LR(0)分析表的构造 7.2 LR(0)分析表的构造
文法共有15个LR(0) 项目,表示在对这个文法 的句子进行分析的时候可能出现的15种状态, 但是其中一些状态是等价的。 等价项目识别的活前缀是相同的,可以由他们组 成的项目集作为将要构造的DFA的一个状态。
7.2 LR(0)分析表的构造
CLOSURE(I)函数 CLOSURE(I)函数——求与I相关的所有LR(0)项目的等 函数 价项目 I中的每一项目都属于它 若A→α·Bβ属于CLOSURE(I)且B→γ是文法中的一个产 生式,则关于产生式B的任何形如B→·γ的项目也属 于它 重复上述步骤,直到它不再增大为止 利用闭包算法可以把LR(0)项目分为几个等价 类
LR分析器的工作过程
总控程序在分析的每一步, 总控程序在分析的每一步,都是按照 栈顶状态q和当前输入符号a 查阅LR 栈顶状态q和当前输入符号a,查阅LR 分析表,并执行其中ACTION[q,a]和 分析表,并执行其中ACTION[q,a]和 ACTION[q GOTO部分规定的操作。 GOTO部分规定的操作。 部分规定的操作
x1
S1 S2
x2
… xi
xn
X1,X2…Xn为文法字汇 表中的全部文法符号
GOTO[Si,X]规定了 当前状态为Si,栈顶 为文法符号X时,转 移到的下一个状态.
Goto [sm,xi]
Sm sn
LR分析器的工作过程
LR分析器的一个构形由两部分构成:栈中符号串 和尚待扫描的输入串 (S0X1S1X2S2…XmSm,aiai+1…an$) 分析器的工作过程就是从一种构形到另一种构形 的转换过程. (S0,a1a2…an$)为初始构形 (S0AZ,$),其中A是文法开始号,ACTION[Z,$]= 接 收 分析器的下一次移动是由栈顶状态Sm和当前输入 符号ai去查看ACTION表并执行ACTION[Sm,ai]规定 的动作并根据GOTO[Sm,ai]表去确定栈顶状态
第07章、LR分析法

10
三、 LR分析器
1. LR分析器的组成 由3部分组成:总控程序、分析表、分析栈。 2. LR分析器的构造 (1) 构造识别文法活前缀的确定有限自动机 (2) 根据该自动机构造相应的分析表(ACTION表、GOTO表)
圆点不在产生式右部最左边的项目称为核,唯一的 例外是S’ → • S。因此用GO(I,X)转换函数得到的J为 转向后状态所含项目集的核。 使用闭包函数(CLOSURE)和转换函数(GO (I,X)) 构造文法G’的LR(0)的项目集规范族,步骤如下: (1) 置项目S’→ • S为初态集的核,然后对核求闭包 CLOSURE({S’→ • S})得到初态的项目集; (2) 对初态集或其它所构造的项目集应用转换函数GO (I,X)= CLOSURE(J)求出新状态J的项目集; (3) 重复(2)直到不出现新的项目集为止。
28
例:文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
a S2 ACTION c e b d # acc S5 r2 r3 r4 r1 S4 S6 r2 r3 r4 r1 3 r2 S8 r3 r4 r1 r2 r3 r4 r1 GOTO S A B 1
是否推导出abbcde?
每次归约句型的 前部分依次为: ab[2] aAb[3] aAcd[4] aAcBe[1]
9
二、LR分析要解决的问题
• LR分析需要构造识别活前缀的有穷自动机
可以把文法的终结符和非终结符都看成有 穷自动机的输入符号,每次把一个符号进 栈看成已识别过了该符号,同时状态进行 转换,当识别到可归前缀时,相当于在栈 中形成句柄,认为达到了识别句柄的终态。
实验5---语法分析器(自下而上):LR(1)分析法

实验5---语法分析器(自下而上):LR(1)分析法一、实验目的构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。
二、实验内容程序输入/输出示例(以下仅供参考):对下列文法,用LR(1)分析法对任意输入的符号串进行分析:(1)E->E+T(2)E->E—T(3)T->T*F(4)T->T/F(5)F-> (E)(6)F->i输出的格式如下:(1)LR(1)分析程序,编制人:姓名,学号,班级(2)输入一个以#结束的符号串(包括+—*/()i#):在此位置输入符号串(3)输出过程如下:3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。
同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照。
三、实验方法1.实验采用C++程序语言进行设计,文法写入程序中,用户可以自定义输入语句;2.实验开发工具为DEV C++。
四、实验步骤1.定义LR(1)分析法实验设计思想及算法①若ACTION[sm , ai] = s则将s移进状态栈,并把输入符号加入符号栈,则三元式变成为:(s0s1…sm s , #X1X2…Xm ai , ai+1…an#);②若ACTION[sm , ai] = rj则将第j个产生式A->β进行归约。
此时三元式变为(s0s1…sm-r s , #X1X2…Xm-rA , aiai+1…an#);③若ACTION[sm , ai]为“接收”,则三元式不再变化,变化过程终止,宣布分析成功;④若ACTION[sm , ai]为“报错”,则三元式的变化过程终止,报告错误。
2.定义语法构造的代码,与主代码分离,写为头文件LR.h。
3.编写主程序利用上文描述算法实现本实验要求。
五、实验结果1. 实验文法为程序既定的文法,写在头文件LR.h中,运行程序,用户可以自由输入测试语句。
LR分析法

10
LR驱动程序算法流程
开始 •0入状态栈; •‘#’入符号栈; •ip指向w#的第一个符号 ; •令S是状态栈栈顶; •a是ip指向的符号;
a入符号栈; 状态j入状态栈; 使ip指向下一个符号;
初始 化
直到(ip指向输入 串的尾部# AND 符 号栈栈顶为S);
执行ACTION[s,a]
移 入
8
-移进Shift:
表示:ACTION[i,a]=Sj 动作:状态j和输入符号a分别入符号 栈和状态栈,输入串向前进一字符。
-归约reduce:
表示:ACTION[i,a]=rk 其中: k表示第k个产生式。 动作:设第k个产生式右部长度为m, 左边非终结符为A,距状态栈栈顶m个 位置的状态为p。 1、从符号栈和状态栈中分别弹出 m个符号; 2、非终结符A入符号栈; 3、GOTO[p,A]=q 入状态栈。
2
(1)LR(K)分析法定义
LR(k)分析法意义 - “L”是指从左至右扫描输入符号串, - “R”是指构造一个最右推导的逆过程, - “k”是指为了作出分析决定而向前看的输入符 号的个数。
3
(2)LR分析法的特点
LR分析器(程序)基本上可以识别所有上下文无关文
法写的编程语言结构,分析能力强且适用范围广
16
活前缀和句柄的关系:
约定:β为该句型的句柄,对应产生式为A→β, β= β1β2 1. 活前缀不含有句柄的任何符号,此时期望 A→β的右部所推出的符号串。 2.活前缀只含句柄的一部分符号,表明 A→β1β2的右部子串β1已出现在栈顶,期待 从输入串中看到β2推出的符号。 3.活前缀已含有句柄的全部符号,表明产生式 A→β的 右部β已出现在栈顶。 如:右句型aAbcde的活前缀ε,a,aA,aAb 其中: ε,a不含有句柄的任何符号; aA只含句柄的一部分符号; aAb含有句柄的全部符号。
LR分析法汇总

分 析
编 译 原 理
LR
对于--个文法,如果能构造一张分析表,使得它的每个 入口均是唯一确定的,则把这个文法称为LR文法。对于 一个LR文法,当分析器对输入串进行自左至右扫描时, 一旦句柄呈现于栈顶,就能及时对它实行归约。 一个LR分析器有时需要“展望”和实际检查未来 的k个输入符号才能决定应采取什么样的“移进一归约” 决策。一般而言, 一个文法如果能用一个每步顶多向前 检查K个输入符号的LR分析器进行分析,则这个文法就 称为LR(k)文法。 对于一个文法,如果它的任何"移进一归约"分析器都 存在尽管栈的内容和符号都已了解,但无法确定是“移 进”还是“归约”;或者,无法从几种可能的规约中确 定其一的情形,那么这个文法就是非LR(1)的。
(2)归约:指用某一产生式A 进行归约。假若 的 长度为 ,归约的动作是去掉栈顶的个项,然后把(Sm ,A)的下一状态和文法符号A推进栈。归约动作不改变 现行输入符号。执行归约的动作意味着呈现于栈顶的符号 串是一个相对于A的句柄。
(3)接受:宣布分析成功,停止分析器的工作。
(4)报错:报告发现源程序含有错误,调用出错处理程 序。
分 析
一、LR(k)分析法
L :从左到右扫描输入符号,
R :最右推导对应的最左归约,
k :超前读入k个符号,用以确定归约所用的规则。
编
LR分析法在自左至右扫描输入串时就能发现其中 译 的任何错误.并能准确地指出出错地点。 原 大多数用上下文无关文法描述的程序语言都可用 理 LR分析器予以识别。 LR 主要缺点是,用手工构造分析程序则工作量相当 分 大。因此,必须求助于自动产生这种分析程序的产 析 生器。 首页 结束
首页 结束
分 析
第7章 LR分 析 法

编译原理
• • • • •
一般而言,假定LR(0)规范族的一个 项目集I中含有m个移进项目: A1→α·a1β1 , A2→α·a2β2 , … , Am→α·amβm 同时含有n个归约项目: B1→α·, B2→α·, …, Bn→α· 如果集合{a1,…,am}、 FOLLOW(B1)、…、FOLLOW(Bn)两两不相交 (包括不得有两个FOLLOW集含有“#”),则隐 含在I中的动作冲突可通过检查现行输入符号a 属于上述n+1个集合中的哪个集合而获得解决,
• [解答]
将文法G[S]拓广为文法G'[S']: G'[S']: (0) S'→S (1) S→BB (2) B→aB (3) B→b
编译原理
列出LR(0)的所有项目: 1.S‘→·S 6. B→·aB 2.S'→S· 7.B→a·B 3.S→·BB 8.B→aB· 4.S→B·B 9.B→·b 5. S→BB· 10.B→b·
编译原理
分类: 移进项目: A→ α.aδ,将a 移入符号栈 . 将 待约项目:A→ α.Bδ,需将待分析串归约成 . 需将待分析串归约成 需将待分析串归约成B 归约项目:A→α. 句柄已形成,可以归约 句柄已形成 可以归约 接受项目: 接受项目 S’ →α.
编译原理
(2)LR(0)项目集规范族的构造 2 LR(0
编译原理
每一项ACTION[s, a]所规定的动作是以下四种情况之一: (1) 移进:使(s, a)的下一状态s' =GOTO[s, a]和输入符号a进栈, 下一输入符号变成现行输入符号。 (2) 归约:指用某一产生式A→β进行归约。假若β 的长度为γ, γ A s' 则归约的动作是去掉栈顶的γ个项,A进符号栈,满足s' =GOTO[s, a] 的状态S'进栈。 (3) 接受:宣布分析成功,停止分析器的工作。 (4) 报错:报告发现源程序含有错误,调用出错处理程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 1 2 3 4 5 6 7 8 9 10 11
i S5
+ S6 R2 R4
*
( S4
)
# 1
ACCE PT
E 2
T 3
F
S7 R4 S4 R6 S4 S4
R2 R4 R6
R2 R4 8 R6 9 3 10 2 3
S5 R6 S5 S5 S6 R1 R3 R5 S7 R3 R5
S 11 R1 R3 R5
状态转换
• GOTO表中的元素GOTO[Sm, Xi]是一个状态,表示当 GOTO表中的元素 表中的元素GOTO[S 是一个状态, 前状态S 面临输入符号X 时需转移的下一个状态。 前状态Sm面临输入符号Xi时需转移的下一个状态。
总控程序
• 总控程序是LR分析的实现算法。描述如下: 总控程序是LR分析的实现算法 描述如下: 分析的实现算法。 1) 初始化 , 将初始状态 S0 及输入符号串的左界 初始化, 将初始状态S 推入分析栈; 符#推入分析栈; 2) 从输入串中读入当前的输入符号 ai , 根据当 从输入串中读入当前的输入符号a 前 状 态 栈 栈 顶 状 态 Sm 与 输 入 符 号 ai 查 ACTION表 ACTION表: 完成移进动作; 若ACTION[Sm, ai]=‘Sj’,完成移进动作; 以文法的第j 若ACTION[Sm, ai]=‘rj’,以文法的第j条规 则完成归约动作; 则完成归约动作; ]=‘acc’, 分析成功, 若 ACTION[Sm, ai]=‘acc’ , 分析成功 , 结 束; ]=‘error’,出错处理。 若ACTION[Sm, ai]=‘error’,出错处理。 3) 重复2)直到出错或接受为止。 重复2 直到出错或接受为止。
(s0x1s1x2s2…xmsmais,ai+1…an #)
• ACTION[Sm, ai]=‘Sj’表示当前栈顶状态为Sm,输入符号为ai, 表示当前栈顶状态为S 输入符号为a 应将输入符号a 移进分析栈的符号栈栈顶,同时将S 应将输入符号 ai 移进分析栈的符号栈栈顶 , 同时将 Sj移进分 析栈的状态栈栈顶。 析栈的状态栈栈顶。
ACTION[S1, a1] ACTION[S1, a2] ACTION[S2, a1] ACTION[S2, a2]
分析动作
• ACTION表中的元素 ACTION 表中的元素 ACTION[Sm, ai] 表中的元素ACTION[S 是一个动作,表示当前状态S 是一个动作,表示当前状态Sm面临输 入符号a 时所完成的分析动作。 入符号 ai 时所完成的分析动作 。 分析 动作可分四类: 动作可分四类: 移进s 移进s 归约A 归约A β 接受 出错
再以(S ,A)查GOTO表 再以(Sm-r,A)查GOTO表,若GOTO[Sm-r, A]=Sk, 压入状态栈。 把Sk压入状态栈。
接受
• 此时ACTION[Sm, ai]=‘acc’。分析动作接 此时ACTION[S ]=‘acc’。 受表示当前输入的符号串分析成功, 受表示当前输入的符号串分析成功,终 止分析器工作。 止分析器工作。
LR分析法的概念 LR分析法的概念
• LR(K)分析法的含义 LR(K)分析法的含义 L—自左向右扫描输入串(源程序) 左向右扫描输入串(源程序) R—分析过程构成最右推导的逆序 K— 每 次根据当前的输入符号最多向前 ( 右 ) 查 次根据当前的输入符号最多向前( 看 K个符号就可以唯一地确定下一步动作是移 进还是归约以及用哪条规则进行归约, 进还是归约以及用哪条规则进行归约,因而也 能唯一地确定句柄
接受时分析栈的格局
a1a2…ai… an# 输入串
S1 S0
Z #
例
• 设有文法G[S′]: 设有文法G[S′ S′→S ′→S S→(S)S S→ε 根据给定的分析表,对输入串()进行 进行LR 根据给定的分析表,对输入串()进行LR 分析。 分析。
步骤 0 1 2 3 4 5
状态栈 符号栈 输入串 ACTION GOTO 0 02 023 0234 02345 01 # #( #(S #(S) #(S)S #S ()# )# )# # # # S2 r3 S4 r3 r2 acc 5 1 3
GOTO表 GOTO表
文法符号 状态
Vn
F 3 i 5
ACTION表 ACTION表
+ 6 7 * ( 4
Vt
)
0(S0) 1(S1) 2(S2) 3(S3) 4(S4) 5(S5) 6(S6) 7(S7) 8(S8) 9(S9) 10(S10) 11(S11)
E 1
T 2
8
2 9
3 3 10
5 5 5 6
S4 R6 S4 S4 S11 R1 R3 R5 R1 R3 R5 R6
8
2
3 3 10
9
文法G[E] 文法G[E] :(1)E::=E+T (2)E::=T (3)T ::=T*F (4)T::=F (5)F::=(E) (6)F::=i
LR分析表说明 LR分析表说明
• • • • 和当前输入符号a rj 按第j个产生式归约 按第j acc 接受 出错标志, 空格 出错标志,报错
GOTO表 GOTO表
• GOTO表的结构如下: GOTO表的结构如下: 表的结构如下
非终结符 状态 S1 S2 … Sn X1 X2 … … … … … Xm GOTO[S1, Xm] GOTO[S2, Xm] … GOTO[Sn, Xm]
GOTO[S1, X1] GOTO[S1, X2] GOTO[S2, X1] GOTO[S2, X2] GOTO[Sn, X1] GOTO[Sn, X2] … …
第7章 自下面上的LR(K)分析方法 自下面上的LR 分析方法 LR(K)
7.1 LR(k)文法和LR(k)分析器 LR(k)文法和LR(k)分析器 文法和LR 7.2 LR(0)分析表的构造 LR(0)分析表的构造 SLR分析表的构造 7.3 SLR分析表的构造 7.4 规范LR(1)分析表的构造 规范LR(1 LALR分析表的构造 7.5 LALR分析表的构造 7.6 无二义性规的使用
LR分析器组成: LR分析器组成: 分析器组成 • 分析表 a1a2…an# 输入串(源程序) • 总控程序 Sm xm • 下推分析栈
输出分 析结果 总控程序 分析表 ACTION GOTO S m-1 x m-1 分 析 S2 x2 栈 S1 x1 S0 # … …
分析栈
• 符号栈 符号栈内存放分析过程中移进或归约的符号。 符号栈内存放分析过程中移进或归约的符号。 • 状态栈 状态栈存放的是状态( 标记) 状态S 状态栈存放的是状态 ( 标记 ) , 状态 Si 概括了栈 中位于S 下面的全部信息, 中位于 Si下面的全部信息 , 也就是记录分析过 程从开始的某一归约阶段的整个分析历史或预 测扫描可能遇到的分析符号。分析开始时, 测扫描可能遇到的分析符号。分析开始时,分 析栈压入初始状态S 和输入符号# 析栈压入初始状态 S0 和输入符号 # , 分析器处 初始状态S 于 初始状态 S0 。 S0 刻画了当前栈内仅有一个符 号 # 的事实并预示将扫描的输入字符应刚好是 可作为句子首符号的那些符号。 可作为句子首符号的那些符号。 LR分析器的每一动作都能由栈顶状态和当前 LR 分析器的每一动作都能由栈顶状态和当前 输入符号串所唯一确定. 输入符号串所唯一确定.
例2
例:文法G[E] 文法G[E] (1)E::=E+T (2)E::=T (3)T ::=T*F (4)T::=F (5)F::=(E) (6)F::=i 分析表如下页, 其LR分析表如下页,分析输入串 分析表如下页 分析输入串i*i+i
20
ACTION表 ACTION表
文法符号 状态
GOTO表 GOTO表
LR分析的特点: LR分析的特点: 分析的特点
是规范归约 适用范围广,适用于大多数上下文无关文法 适用范围广,适用于大多数上下文无关文法 描述的语言 分析速度快, 分析速度快,能准确定位错误 缺点:LR分析器的构造工作量大 缺点:LR分析器的构造工作量大
LR分析器的逻辑结构 LR分析器的逻辑结构
1) 2) 3) 4)
移进
LR分析器的一个构形由两部分组成 栈中符号串和尚待 分析器的一个构形由两部分组成:栈中符号串和尚待 分析器的一个构形由两部分组成 扫描输入串 (s0x1s1x2s2…xmsm,aiai+1…an #) • 若ACTION[Sm, ai]=‘Sj’。分析动作为移进时,表示句柄尚未 分析动作为移进时, 在分析栈的栈顶形成,正期待继续移进符号,以形成句柄。 在分析栈的栈顶形成,正期待继续移进符号,以形成句柄。 进入构形: 进入构形:
β(‘rj’)。其中rj表示按 ’)。其中r
文法的第j条规则(产生式)进行归约。设第j条规则为: 文法的第j条规则(产生式)进行归约。设第j条规则为:
(s0x1s1x2s2…xm-rsm-rAs,ai+1…an #)
输入串 a1a2…ai… an# A x m-r x2 x1 #
S m-r S2 S1 S0
4 4 4 11 7 若移入: 若移入:i为状态 若规约: 若规约:i为产生式编号
23
状态
文法G[E] 文法G[E] :(1)E::=E+T (2)E::=T (3)T ::=T*F (4)T::=F (5)F::=(E) (6)F::=i
文法G[E] 文法G[E] (1)E::=E+T (2)E::=T (3)T ::=T*F (4)T::=F (5)F::=(E) (6)F::=i 分析过程 : i*i+i 步骤 1 2 3 4 5 6 7
分析表
• 动作表(ACTION) 动作表(ACTION) • 状态转换表(GOTO) 状态转换表(GOTO)