590 likes | 736 Vues
第 7 章 LR 分析. Z aBDc aBdc abdc Z aBDc abDc abdc. . . . . . . r. r. r. l. l. l. 7.1 LR 分析概述. LR(K) 的含义 : L 表示从左到右扫描输入串, R 表示最左规约 ( 即最右推导的逆过程 ) , K 表示向右查看输入串符号的个数。当 K=1 时,能满足当前绝大多数高级语言编译程序的需要,所以着重介绍 LR(0) , SLR(1) , LR(1) , LALR(1) 方法。. LR分析. 特征 :
E N D
Z aBDcaBdcabdc Z aBDc abDc abdc r r r l l l 7.1 LR分析概述
LR(K)的含义: L表示从左到右扫描输入串,R表示最左规约(即最右推导的逆过程),K表示向右查看输入串符号的个数。当K=1时,能满足当前绝大多数高级语言编译程序的需要,所以着重介绍LR(0),SLR(1),LR(1),LALR(1)方法。
LR分析 特征: .规范的 .符号栈中的符号是规范句型的前缀,且不含句柄以后的任何符号(活前缀) .分析决策依据――栈顶状态和现行输入符号.?识别活前缀的 DFA. 四种技术 LR(0) SLR(1) LR(1) LALR(1)
7.2 LR(0)分析 LR(0)文法 能力最弱,理论上最重要 存在FA 识别活前缀 识别活前缀的DFA如何构造 (LR(0)项目集规范族的构造) LR(0)分析表的构造
* r 定义如果有Z α β(Z为开始符),且β为终极符串(或空)。称α是规范前缀。若α是含有句柄的规范前缀,且每个句柄是α的后端,称α是可归规范前缀。
规范前缀 后缀 mAB cde mABc de mABcd e mABcde - 例子:SmABcde 若其中Abc是句柄,根据定义有mABc是可归规范前缀。
定理 设α1Aα2为可归前缀,A∈VN,A→u为一产生式,则α1u也为可归前缀。 例: G[Z]: Z→abAd A→c 若abAd是可归前缀,根据此定理abc也是可归前缀。 例: G(S): S→aAc [1] A→Abb [2] A→b [3]
0 a b A b b [3] 2 [2] 1 3 c [1] 可归前缀图 a A c S: [1] A b b A: [2] b [3] 子自动机 生成过程:
a A c 0 1 2 [1] b A b 3 4 [2] b [3] 0 a b A b b [3] 2,3 [2] 1 4 c [1]
自动机直观法 构造可归前缀图方法 形式化方法 形式化方法,设B→X1X2…Xn[P]是产生式P,则称形如X1X2…XiXi+1…Xn[P]的侯选式为LR(0)项目(简称项目)。(圆点可在X1之前,也可在Xn之后)。
定义 • 称形如X1X2…Xn●[P]的项目为归约项目。移进项目:除此外其它形式。 • 设I为项目集,则定义 Close(I)=I∪{.u[P]|A→u[P]∈G,α●Aβ[1]∈Close(I)}且称Close(I)为I的闭包集。 • 设I为项目集,则GO(I,X)=CLOSE(IX) 其中IX={αX.β[P]|α.Xβ[P]∈I}
构造LR(0)项目集规范族 LR(0)项目集规范族(构成识别一个文法的活前缀的DFA的状态的全体) 。 LR(0)项目或配置(item or configuration). ---在右端某一位置有圆点的G的产生式 A xyz A.xyz Ax.yz Axy.z Axyz. 如:S→aAd S→.aAd S→a .Ad S→aA .d S→aAd .
例子:U→XYZ,求项目 U→XYZ U→XYZ U→XYZ U→XYZ 移进项目 归约项目
x 可归前缀图的构造算法 1.先产生初始项目集I1=Close({.α[P] |Z→α[P]∈G,Z为初始符})。 2.若I是新项目集,则对每X∈(VN∪VT),产生项目集GO(I,X)。若两项目集完全相同,则作为一项目集。 3.重复2至不产生新项目集为止。 4.图的结点由上述项目集组成,且若GO(Ii,X)=Ij,则有Ii Ij。
a A c b 例: G(S): S→aAc [1] A→bB[2]|ba[3] B→dB[4]|c [5] 0:.aAc [1] 1:a.Ac[1] .bB[2] .ba[3] 1:a.Ac[1] .bB[2] .ba[3] 1:a.Ac[1] .bB[2] .ba[3] 2:aA.c[1] aAc.[1]
d e B B a e d 3:b.B[2] b.a[3] .dB[4] .e[5] 3:b.B[2] b.a[3] .dB[4] .e[5] 3:b.B[2] b.a[3] .dB[4] .e[5] 3:b.B[2] b.a[3] .dB[4] .e[5] 3:b.B[2] b.a[3] .dB[4] .e[5] bB.[2] ba.[3] e.[5] 4:d.B[4] .dB[4] .e[5] 4:d.B[4] .dB[4] .e[5] 4:d.B[4] .dB[4] .e[5] 4:d.B[4] .dB[4] .e[5] dB.[4]
例: A→a.S B→D. A→aS. B→D. 移进、归约冲突 归约、归约冲突 定义 • 二义性结点:可归前缀图的一个结点包含多个归约项目或同时包含移进项目和归约项目。
例子:A→aBc B→a B→ab • LR(0)文法:文法的可归前缀图不包含二义性结点(可用于判是否LR(0)文法)。 LR分析法的分析栈由两个栈组成:状态栈、符号栈。
LR分析法的步骤: 格局为(0 1…i,#X0X1…Xi,ajaj+1…an#) 状态栈 符号栈 输入流 1.若ACTION[i,aj]=sk,则有(0 1…K, #X0X1…Xi,ajaj+1……an#)。 2.若ACTION[i,aj]=rp,则先把符号栈归约Ap(P产生式的左部),从状态栈删除 np(为侯选式的长度)个状态(后端),再压入=Goto[i-np,Ap]有(0…i-np, #X0…XiAp,ajaj+1…an#)。
3.若ACTION[i,aj]=ok,则成功。 4.若ACTION[i,aj]=en,则失败。 分析法的动作: Sj—s表示“移进”,j表压入编号 rj—r表示“归约”,j表产生式号 ok—表示分析成功 ej—e表示"错误",j表错误编号
例:G(E): E→aA|bB A→cA|d B→cB|d 1.用形式化方法作可归前缀图。 2.求LR(0)矩阵。 3.写出输入串bccd的LR(0)分析过程。
解:拓展文法的新文法如下: G(S): S→E [0] E→aA[1] E→bB[2] A→cA[3] A→d [4] B→cB[5] B→d [6] 解:可归前缀图
E A d a d b c c A 0:S→.E E→.bB E→.aA 0:S→.E E→.bB E→.aA 0:S→.E E→.bB E→.aA 0:S→.E E→.bB E→.aA 1:S→E. 6:E→aA. 10:A→d. 2:E→a.A A→.d A→.cA 2:E→a.A A→.d A→.cA 2:E→a.A A→.d A→.cA 2:E→a.A A→.d A→.cA 4:A→c.A A→.d A→.cA 4:A→c.A A→.d A→.cA 4:A→c.A A→.d A→.cA 4:A→c.A A→.d A→.cA 8:A→cA.
c c d B B d 5:B→c.B B→.cB B→.d 5:B→c.B B→.cB B→.d 5:B→c.B B→.cB B→.d 5:B→c.B B→.cB B→.d 3:E→b.B B→.d B→.cB 3:E→b.B B→.d B→.cB 3:E→b.B B→.d B→.cB 3:E→b.B B→.d B→.cB 9:B→cB. 7:E→bB. 11:B→d. 解:LR(0)矩阵 s表示状态 r表示归约
状态 Action Goto a b c d # E A B 0 S2 S3 1 1 Acc 2 S4 S10 6 3 S5 S11 7 4 S4 S10 8 5 S5 S11 9 6 r1 r1 r1 r1 r1 7 r2 r2 r2 r2 r2 8 r3 r3 r3 r3 r3 9 r5 r5 r5 r5 r5 10 r4 r4 r4 r4 r4 11 r6 r6 r6 r6 r6
动画演示 第5步:d,(11)出栈,B进栈;5对B查表得9。
步骤 状态栈 符号栈 输入串 Action GOTO 1 0 # bccd# S3 2 03 #b ccd# S5 3 035 #bc cd# S5 4 0355 #bcc d# S11 5 0355(11) #bccd # r6 5 0355 #bccB # r6 9 6 03559 #bccB # r5 6 035 #bcB # r5 9 解:串bccd的LR(0)分析过程
步骤 状态栈 符号栈 输入串 Action GOTO 1 0 # bccd# S3 2 03 #b ccd# S5 3 035 #bc cd# S5 4 0355 #bcc d# S11 5 0355(11) #bccd # r6 9 6 03559 #bccB # r5 9 7 0359 #bcB # r5 7 8 037 #bB # r2 1 9 01 #E # acc
Input# 栈 S1 Xm 总控程序 output … S1 … X1 ACTION GOTO 产生式表 S0 # LR分析表 状态 文法符号 LR分析器模型
例 G[S]为: S a A c B e A b A Ab B d 1)构造识别活前缀的DFA 2)构造它的LR(0)分析表。 3)分别给出对输入符号串abbcde和 Abbce的LR(0)分析步骤。
G[S]拓广为: • S’ S • S a A c B e • A b • A Ab • B d G[L]= ab+cde I4 :A b • I6 :A A b • b b I2 :S a • A c B e A •b A • Ab I1 :S’ S • A I3 :S a A •c B e A A •b S a c I0 : S’ • S S •a A c B e B I5 :S a A c • B e B •d I7 :S a A c B •e e d I9 :S a A c B e • I8 :B d •
对输入串abbcde#的分析过程 Stepstates. Syms. The rest of inputaction goto 1 0 # abbcde# s2 2 02 #a bbcde# s4 3 024 #ab bcde# r2 3 4 023 #aA bcde# s6 5 0236 #aAb cde# r3 3 6 023 #aA cde# s5 7 0235 #aAc de# s8 8 02358 #aAcd e# r4 7 9 02357 #aAcB e# s9 10 023579 #aAcBe # r1 1 11 01 #S # acc
对输入串abbce#的分析过程 Stepstates. Syms. The rest of inputaction goto 1 0 # abbce# s2 2 02 #a bbce# s4 3 024 #ab bce# r2 3 4 023 #aA bce# s6 5 0236 #aAb ce# r3 3 6 023 #aA ce# s5 7 0235 #aAc e# 出错 说明abbce#不是例6.1 文法 G[S]的句子
7.3 SLR(1)分析 SLR(1)方法:是只在LR(0)可归前缀图的二义性状态下向前看一符。 当有I={x→●b A→r● B→●} FOLLOW(A)∩FOLLOW(B)=, FOLLOW(A)∩b=; FOLLOW(B)∩b= 则称该冲突可以解决。 满足上述条件则可利用SLR(1)方法
例子:S→Aa.bBc A→d. B→e. 设:FOLLOW(A)=a,FOLLOW(B)=c 所以:FOLLOW(A)∩FOLLOW(B)=, FOLLOW(A)∩b=; FOLLOW(B)∩b= 所以本文法是SLR(1)文法。
现举实型变量说明文法为例: <实型变量说明>→real<标识符表> <标识符表>→<标识符表>,i <标识符表>→i 将该文法缩写后并拓广为G’如下: 1.S’→S 2.S→rD 3.D→D,i 4.D→i 得图如下:
冲突 , i D S r i 3:S→rD. D→D.,i 5:D→D,.i 1:S’→S. 6:D→D,i. 2:S→r.D D→.D,i D→.i 0:S’→.S S→.rD 4:D→i.
状态 Action Goto r , i # S D 0 S2 1 1 Acc 2 S4 3 3 r1 r1,S5 r1 r1 4 r3 r3 r3 r3 5 S6 6 r2 r2 r2 r2 实数说明文法的LR(0)分析表如下:
解释冲突: S→rD● D→D●,i 为归约项 为移进项 follow(S)=follow(S’)={#} follow(S)∩{,}={#}∩{,}=φ 满足上述条件则可利用SLR(1)方法。转化情况如下:
状态 Action Goto r , i # S D 0 S2 1 1 Acc 2 S4 3 3 S5 r1 4 r3 r3 r3 r3 5 S6 6 r2 r2 r2 r2 实数说明文法的SLR(1)分析表如下:
7.4 LR(1)分析 LR(1)项目( 配置)的一般形式 [ A . , a ] 意味着处在栈顶是的相应状态,期望相应在栈顶的状态,然后只有当跟在后的token是终结符a时进行归约 。a 称作该项目( 配置) 的向前搜索符(lookahead ) 向前搜索符(lookahead )只对圆点在最后的项目起作用 A –> •, a .意味着处在栈中是 的相应状态,但只有当下一个输入符是a时才能进行归约. a 要么是一个终结符,要么是输入结束标记# 有多个向前搜索符,比如a,b,c时,可写作A –> u•, a/b/c
LR(1)项目:即为二元组[α,a],其中α是LR(0)项目,a∈VT∪{#}。LR(1)项目:即为二元组[α,a],其中α是LR(0)项目,a∈VT∪{#}。 定义3.17设I为LR(1)项目集,则定义 Close(I)=I∪{[.β[p],b]| B→β[p]∈G, [α.Bω[e],a]∈Close(I), b∈first(ωa)} 称Close(I)为I的闭包。
GO(I,X)=Close(IX) 其中IX={[αX.β[p],b]|[α.Xβ[p],b]∈I}
例子:若文法G’[S’]为: S’→S[0] S→BB[1] B→aB[2] B→b[3] 则其转换图和分析表如下:
I0:S’→●S,# S→●BB,# B→●aB,a|b B→●b,a|b S I1:S’→S●,# b a I4:B→b●,a|b I8:B→aB●,a|b B b a . I3:B→a●B,a|b B→●aB,a|b B→●b,a|b B
B I2:S→B●B,# B→●aB,# B→●b# I5:S→BB●,# a a I6:B→a●B,# B→●aB,# B→●b,# b b B I7:B→b●,# I9:B→aB●,#
状态 ACTION GOTO a b # S B 0 S3 S4 1 2 1 acc 2 S6 S7 5 3 S3 S4 8 4 r3 r3 5 r1 6 S6 S7 9 7 r3 8 r2 r2 9 r2
LR(1)比SLR(1)能力强 例 设有文法G[S’] (0) S`→S (1)S→L=R (2)S→R (3)L→ *R (4)L→id (5)R→L 改文法不能用SLR(1)技术解决,但能用LR(1)