第 7 章 lr 分析

59
7 7 LR LR 第第 第第

Upload: wirt

Post on 19-Mar-2016

75 views

Category:

Documents


3 download

DESCRIPTION

第 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分析. 特征 : - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 7 章   LR 分析

第第 77 章 章 LRLR 分析分析

Page 2: 第 7 章   LR 分析

7.1 LR 分析概述Z aBDc aBdc abdcZ aBDc abDc abdc

r r rlll

Page 3: 第 7 章   LR 分析

LR(K) 的含义 : L 表示从左到右扫描输入串, R 表示最左规约 ( 即最右推导的逆过程 ) , K 表示向右查看输入串符号的个数。当 K=1 时,能满足当前绝大多数高级语言编译程序的需要,所以着重介绍 LR(0) , SLR(1) , LR(1) ,LALR(1) 方法。

Page 4: 第 7 章   LR 分析

LR分析特征 :.规范的.符号栈中的符号是规范句型的前缀,且不含句柄以后的任何符号 ( 活前缀 ).分析决策依据―― 栈顶状态和现行输入符号.?识别活前缀的 DFA.四种技术

LR(0) SLR(1) LR(1) LALR(1)

Page 5: 第 7 章   LR 分析

LR(0) 文法 能力最弱,理论上最重要存在 FA 识别活前缀识别活前缀的 DFA 如何构造( LR(0) 项目集规范族的构造)LR(0) 分析表的构造

7.2 LR ( 0)分析

Page 6: 第 7 章   LR 分析

定义 如果有 Z α β(Z 为开始符 ),且 β为终极符串 (或空 )。称 α是规范前缀。若α是含有句柄的规范前缀 ,且每个句柄是α的后端,称α是可归规范前缀。

r*

Page 7: 第 7 章   LR 分析

例子: SmABcde

-mABcde emABcd demABc cdemAB 后缀规范前缀

若其中 Abc 是句柄,根据定义有 mABc 是可归规范前缀。

Page 8: 第 7 章   LR 分析

定理 设 α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]

Page 9: 第 7 章   LR 分析

[1]

b

cAa

[3]

bbA [2]

S:

A:

子自动机

1 2 3 [2]

0

[3]c

abbAb

[1] 可归前缀图生成过程:

Page 10: 第 7 章   LR 分析

1 2,3 4 [2]

0

[3]c

abbAb

[1]

[1]b

cAa

[3]

bA [2]b

3 4

1 20

Page 11: 第 7 章   LR 分析

构造可归前缀图方法 自动机直观法形式化方法

形式化方法 ,设 B→X1X2…Xn[P] 是产生式 P,则称形如 X1X2…XiXi+1…Xn[P]的侯选式为 LR(0) 项目 (简称项目 )。(圆点可在 X1 之前 ,也可在 Xn 之后 )。

Page 12: 第 7 章   LR 分析

定义称形如 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}

Page 13: 第 7 章   LR 分析

构造 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 .

Page 14: 第 7 章   LR 分析

例子: U→XYZ ,求项目 U→XYZ U→XYZ U→XYZ U→XYZ 移进项目归约项目

Page 15: 第 7 章   LR 分析

可归前缀图的构造算法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 。 x

Page 16: 第 7 章   LR 分析

例 : G(S): S→aAc [1] A→bB[2]|ba[3] B→dB[4]|c [5] 0:.aAc [1]

a1:a.Ac[1] .bB[2] .ba[3]

A 2:aA.c[1]1:a.Ac[1] .bB[2] .ba[3]

c aAc.[1]

b

1:a.Ac[1] .bB[2] .ba[3]

Page 17: 第 7 章   LR 分析

3:b.B[2] b.a[3] .dB[4] .e[5]

B bB.[2]3:b.B[2] b.a[3] .dB[4] .e[5]

a ba.[3]

3:b.B[2] b.a[3] .dB[4] .e[5] e e.[5]

3:b.B[2] b.a[3] .dB[4] .e[5]

d

4:d.B[4] .dB[4] .e[5]

3:b.B[2] b.a[3] .dB[4] .e[5]

B dB.[4]

4:d.B[4] .dB[4] .e[5]

e4:d.B[4] .dB[4] .e[5]

d 4:d.B[4] .dB[4] .e[5]

Page 18: 第 7 章   LR 分析

定义 二义性结点:可归前缀图的一个结点包含多个归约项目或同时包含移进项目和归约项目。

A→a.SB→D.移进、归约冲突

A→aS.B→D.归约、归约冲突

例:

Page 19: 第 7 章   LR 分析

LR(0) 文法:文法的可归前缀图不包含二义性结点 (可用于判是否 LR(0) 文法 )。 LR 分析法的分析栈由两个栈组成:状态栈、符号栈。

例子: A→aBc B→a B→ab

Page 20: 第 7 章   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#) 。

Page 21: 第 7 章   LR 分析

3. 若 ACTION[i,aj]=ok, 则成功。 4. 若 ACTION[i,aj]=en, 则失败。 分析法的动作 :

Sj—s表示“移进” ,j表压入编号rj—r表示“归约” ,j表产生式号 ok—表示分析成功ej—e表示 "错误 ",j 表错误编号

Page 22: 第 7 章   LR 分析

例: G(E): E→aA|bB A→cA|d B→cB|d1. 用形式化方法作可归前缀图。2.求 LR(0) 矩阵。3. 写出输入串 bccd 的 LR(0) 分析过程。

Page 23: 第 7 章   LR 分析

解:可归前缀图

G(S): S→E [0] E→aA[1] E→bB[2] A→cA[3] A→d [4] B→cB[5] B→d [6]

解:拓展文法的新文法如下:

Page 24: 第 7 章   LR 分析

0:S→.E E→.bB E→.aAE 1:S→E.0:S→.E E→.bB E→.aA

a 2:E→a.A A→.d A→.cA

0:S→.E E→.bB E→.aA A 6:E→aA.

2:E→a.A A→.d A→.cA

d 10:A→d.2:E→a.A A→.d A→.cA c 4:A→c.A A→.d A→.cA2:E→a.A A→.d A→.cA

d4:A→c.A A→.d A→.cAc

4:A→c.A A→.d A→.cAA 8:A→cA.

4:A→c.A A→.d A→.cAb

0:S→.E E→.bB E→.aA

Page 25: 第 7 章   LR 分析

3:E→b.B B→.d B→.cBB

7:E→bB.

3:E→b.B B→.d B→.cBd

11:B→d.

3:E→b.B B→.d B→.cBc 5:B→c.B B→.cB B→.d

3:E→b.B B→.d B→.cBd

5:B→c.B B→.cB B→.dc5:B→c.B B→.cB B→.d

B

9:B→cB.

5:B→c.B B→.cB B→.d

解: LR(0) 矩阵 s 表示状态 r 表示归约

Page 26: 第 7 章   LR 分析

r4r4r4r4r410r6r6r6r6r611

r5r5r5r5r59r3r3r3r3r38r2r2r2r2r27r1r1r1r1r16

9S11S558S10S44

7S11S536S10S42

Acc11S3S20

BAE#dcbaGotoAction状态

Page 27: 第 7 章   LR 分析

第 5步: d, (11) 出栈, B进栈;5对 B查表得 9。动画演示动画演示

Page 28: 第 7 章   LR 分析

S11d##bcc03554S5cd##bc0353S5ccd##b032S3bccd##01

GOTO Action 输入串 符号栈 状态栈 步骤

r6##bccd0355(11)59r6##bccB03555

r5##bccB0355969r5##bcB0356

解:串 bccd 的 LR(0) 分析过程

Page 29: 第 7 章   LR 分析

acc##E019

1r2##bB03787r5##bcB035979r5##bccB0355969r6##bccd0355(11)5

S11d##bcc03554S5cd##bc0353S5ccd##b032S3bccd##01

GOTO Action 输入串 符号栈 状态栈 步骤

Page 30: 第 7 章   LR 分析

LR分析器模型

总控程序 output

Input#

S1 Xm

…S1

…X1

S0 #

状态 文法符号ACTION GOTO

LR 分析表产生式表

Page 31: 第 7 章   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) 分析步骤。

Page 32: 第 7 章   LR 分析

G[S] 拓广为 : S’ S

S a A c B e A b A Ab B d

I0 : S’ • S S • a A c B e

I1 : S’ S •I2 : S a • A c B e A • b A • Ab

I3 : S a A • c B e A A • b

I4 : A b •

I5 : S a A c • B e B • d

I7 : S a A c B • e

I8 : B d • I9 : S a A c B e •

I6 : A A b •

S a

A

bb

c

B

ed

G[L]= ab+ cde

Page 33: 第 7 章   LR 分析

G[S] 的 LR(0) 分析表ACTION GOTO

a c e b d # S A B0 S2 11 acc2 S4 33 S5 S64 r2 r2 r2 r2 r2 r25 S8 76 r3 r3 r3 r3 r3 r37 S98 r4 r4 r4 r4 r4 r49 r1 r1 r1 r1 r1 r1

Page 34: 第 7 章   LR 分析

Step states. Syms. The rest of input action 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

对输入串 abbcde# 的分析过程

Page 35: 第 7 章   LR 分析

Step states. Syms. The rest of input action 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] 的句子

对输入串 abbce# 的分析过程

Page 36: 第 7 章   LR 分析

SLR(1) 方法 :是只在 LR(0) 可归前缀图的二义性状态下向前看一符。 当有 I={x→●b A→r● B→●} FOLLOW(A)∩FOLLOW(B)=, FOLLOW(A)∩b= ; FOLLOW(B)∩b= 则称该冲突可以解决。满足上述条件则可利用 SLR(1) 方法

7.3 SLR ( 1)分析

Page 37: 第 7 章   LR 分析

例子: 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) 文法。

Page 38: 第 7 章   LR 分析

现举实型变量说明文法为例:< 实型变量说明 >→real< 标识符表 >< 标识符表 >→< 标识符表 >, i< 标识符表 >→i将该文法缩写后并拓广为 G’ 如下: 1.S’→S 2.S→rD 3.D→D,i 4.D→i 得图如下:

Page 39: 第 7 章   LR 分析

0:S’→.S S→.rDS

1:S’→S.

r2:S→r.D D→.D,i D→.i

D

3:S→rD. D→D.,i

i 4:D→i.

,5:D→D,.i

i

6:D→D,i.

冲突

Page 40: 第 7 章   LR 分析

实数说明文法的 LR(0) 分析表如下:

r2r2r2r26S65

r3r3r3r34r1r1r1,S5r13

3S42Acc1

1S20DS#i,r

GotoAction状态

Page 41: 第 7 章   LR 分析

解释冲突:S→rD●D→D●,i为归约项为移进项

follow(S)=follow(S’)={#}follow(S)∩{,}={#}∩{,}=φ 满足上述条件则可利用 SLR(1) 方法。转化情况如下:

Page 42: 第 7 章   LR 分析

实数说明文法的 SLR(1) 分析表如下:

r2r2r2r26S65

r3r3r3r34r1S53

3S42Acc1

1S20DS#i,r

GotoAction状态

Page 43: 第 7 章   LR 分析

LR ( 1 )项目 ( 配置)的一般形式[ A . , a ]意味着处在栈顶是的相应状态,期望相应在栈顶的状态,然后只有当跟在后的 token 是终结符 a 时进行归约 。 a 称作该项目 ( 配置) 的向前搜索符( lookahead )向前搜索符( lookahead )只对圆点在最后的项目起作用

A –> •, a. 意味着处在栈中是 的相应状态,但只有当下一个输入符是

a 时才能进行归约 . a 要么是一个终结符,要么是输入结束标记 #有多个向前搜索符,比如 a,b,c 时,可写作 A –> u•, a/b/c

7.4 LR ( 1)分析

Page 44: 第 7 章   LR 分析

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的闭包。

Page 45: 第 7 章   LR 分析

GO(I,X)=Close(IX)其中 IX={[αX.β[p],b]|[α.Xβ[p],b]∈I}

Page 46: 第 7 章   LR 分析

例子:若文法 G’[S’] 为: S’→S[0] S→BB[1] B→aB[2] B→b[3]则其转换图和分析表如下:

Page 47: 第 7 章   LR 分析

I0:S’→●S,# S→●BB,# B→●aB,a|b B→●b,a|bI1:S’→S●,#

S

I4:B→b●,a|bb

bI3:B→a●B,a|b B→●aB,a|b B→●b,a|b

a

.a

I8:B→aB●,a|b

B

B

Page 48: 第 7 章   LR 分析

I6:B→a●B,# B→●aB,# B→●b,#

I5:S→BB●,#

I7:B→b●,#

I2:S→B●B,# B→●aB,# B→●b#

I9:B→aB●,#

B

B

bb

a a

Page 49: 第 7 章   LR 分析

r2r28r29

r379S7S66

r15r3r3 4

8S4S3 35S7S62

acc121S4S3 0BS#ba

GOTO ACTION 状态

Page 50: 第 7 章   LR 分析

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 )

Page 51: 第 7 章   LR 分析

I1:S’S •,#

I5:Li •,=/#

I7:L*R •,=/#

I8:RL •,=/#

I9:SL=R •,#

I3:SR •,#

I12:Li •,# I10:RL •,#

I13:L*R •,#

I0:S’ •S,# S •L=R,#

S •R,# L •*R,=/#

L •i,=/# R •L,#

I4: L *•R,=/# R •L,=/#L •i,=/#

L •*R,=/#

I6:S L= •R,# R •L,# L •*R,#

L •i,#

I11:L * •R,# R •L,# L •*R,#

L •i,#

I2:S L •=R,# R L•,#

s

R

=L

R

i i

*

i

i

R

L

L

R L

**

*

例 LR(1) 项目集及转换函数

Page 52: 第 7 章   LR 分析

每个 SLR ( 1 )文法都是 LR ( 1 )的,一个 SLR ( 1 )文法的规范 LR 分析器比其 SLR( 1 )分析器的状态要多。

例子:若文法 G[S’]为: S’→S[0] S→BB[1] B→aB[2] B→b[3](注:与前例文法同)

LALR1 方法:

Page 53: 第 7 章   LR 分析

同心项目集合:I0:S’.S S .BB B .aB B .b

I1:S’ S.

I2:S B.B B.aB B.b

I3:Ba.B B.aB B.b

I4:BaB.

I5: Bb.

I6: SBB.

Page 54: 第 7 章   LR 分析

I0:S’ S, # S BB, #

B aB, a/bB b, a/b

I1:S’ S, #

I2:S BB, # B aB, #B b, #

I5:S BB, #

I6:S aB, # B aB, #B b, # I3:B aB, a/b

B aB, a/b B b, a/b

I4:B b,a/b

I7:B b, #

I9:B aB, #

I8:B aB, a/b

s

B B

a

b

b

b

B

B

aa

a

LR(1) 项目集和转换函数

b

Page 55: 第 7 章   LR 分析

LALR— 在 SLR ( 1 )和 LR( 1 )间寻找折衷办法(状态数目,分析能力)LALR (lookahead LR)合并同心集 I36 I47 I89

I3:B aB, a/b B aB, a/b B b, a/b

I6:S aB, # B aB, #B b, #

I4:B b, a/b

I7:B b, #

I8:B aB, a/b

I9:B aB, #

Page 56: 第 7 章   LR 分析

构造 LALR(1) 分析表 .方法 1

1. 构造文法 G 的规范 LR(1) 状态 .2. 合并同心集(除搜索符外两个集合是相同的)的状态 .3. 新 LALR(1) 状态的 GO 函数是合并的同心集状态的 GO 函数的并 .4. LALR(1) 分析表的 action 和 goto 登录方法与 LR

(1) 分析表一样 .经上述步骤构造的表若不存在冲突,则称它为 G 的LALR(1) 分析表。存在这种分析表的文法称为 LALR ( 1 )文法。

Page 57: 第 7 章   LR 分析

LR(0) 、 SLR(1) 、 LR(1) 、 LALR(1) 方法比较实际上不同 LR 方法之间的主要区别就在于归约的判定方法上: LR(0) 是不看展望符判定归约; SLR(1) 是看展望符,但把所有 B→ 的展望符集均定义为 Follow(B) 。即把符号栈顶上的句柄归约为

B 的条件是:展望符为 Follow(B) 中的元素。换句话说,归约任何位置上的 B ,都用统一的展望符集; LR(1) 也是看展望符,但归约不同位置上的 B 时,采用不同的展望符集。每个项由心与向前搜索符组成,搜索符长度为 1 。由于 LR(1) 方法对于归约条件的判定比 SLR(1) 更精确,可大大减少移入 / 归约冲突; LALR(1): 对 LR(1) 项目集规范族合并同心集

Page 58: 第 7 章   LR 分析

LR(0) 、 SLR(1) 、 LR(1) 、 LALR(1) 分析表比较LR(0) 分析表局限性大,但其构造方法是其他构造方法的基础;SLR 分析表虽然不是对所有文法都存在,但这种分析表较易实现又极有使用价值;LR 分析表的分析能力最强,能适用于一大类文法,但是,实现代价过高(表过大);LALR 分析表的能力介于 SLR 和 LR 之间,实现效率较高。

Page 59: 第 7 章   LR 分析

总结:语法分析

自顶向下 递归子程序法LL(1) 方法

自底向上简单优先方法算符优先法

LR方法LR(0)SLR(1)LR(1)LALR(1)