第七章 LR分析法
第1题已知文法
A→aAd|aAb|ε
判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。
文法:A→aAd|aAb|ε
拓广文法为G′,增加产生式S′→A
若产生式排序为:
0S' →A
1 A →aAd
2 A →aAb
3 A →ε
由产生式知:
First (S' ) = {ε,a}
First (A ) = {ε,a}
Follow(S' ) = {#}
Follow(A ) = {d,b,#}
G′的LR(0)项目集族及识别活前缀的DFA如下图所示:
在I0中:
A →.aAd和A →.aAb为移进项目,A →.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)
文法。
在I0、I2中:
Follow(A) ∩{a}= {d,b,#} ∩{a}=
所以在I0、I2中的移进-归约冲突可以由Follow集解决,所以G是SLR(1)文法。
构造的SLR(1)分析表如下:
题目1的SLR(1)分析表
ab#的分析过程
题目1对输入串
第2题若有定义二进制数的文法如下:
S→L.L|L
L→LB|B
B→0|1
(1) 试为该文法构造LR分析表,并说明属哪类LR分析表。
(2) 给出输入串101.110的分析过程。
解:文法:
S→L.L|L
L→LB|B
B→0|1
拓广文法为G′,增加产生式S′→S
若产生式排序为:
0 S' →S
1 S →L.L
2 S →L
3 L →LB
4 L →B
5 B →0
6 B →1
由产生式知:
First (S' ) = {0,1}
First (S ) = {0,1}
First (L ) = {0,1}
First (B ) = {0,1}
Follow(S' ) = {#}
Follow(S ) = {#}
Follow(L ) = {.,0,1,#}
Follow(B ) = {.,0,1,#}
G′的LR(0)项目集族及识别活前缀的DFA如下图所示:
在I2中:
B →.0和B →.1为移进项目,S →L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。在I2、I8中:
Follow(s) ∩{0,1}= { #} ∩{0,1}=
所以在I2、I8中的移进-归约冲突可以由Follow集解决,所以G是SLR(1)文法。
构造的SLR(1)分析表如下:
题目2的SLR(1)分析表
题目2对输入串101.110#的分析过程
分析成功,说明输入串101.110是题目2文法的句子。
3.考虑文法:S→AS|b A→SA|a
(1) 列出该文法所有的LR(0)项目。
(2)按(1)列出的项目构造识别这个文法活前缀的NFA,把这个NFA确定化为DFA,说明这个DFA的所有状态全体构成这个文法的LR(0)规范族。
(3)此文法是SLR(1)的吗?,若是,构造他的SLR分析表
(4)这个文法是LALR或LR(1)的吗?
(1)构造增广文法,S’→S
文法的LR(0)项目有:
1. S’→.S
2. S’→S.
3. S→.AS
4. S→A.S
5. S→AS.
6. S→.b
7. S→b.
8. A→.SA
9. A→S.A 10. A→SA. 11. A→.a 12. A→a.
(2)所产生的NFA略。
由规则构造所需的DFA:
则LR(0)项目集规范族为:
C={I0,I1,I2,I3,I4,I5,I6,I7}
(3)可以看到I1,I6,I7存在着移进-归约的冲突。
冲突是不能用SLR(1)的方法来解决。比如I6:
对于状态S→AS. 和S→.b
Follow(S)={#,a,b}与{b}相交不为空。
所以以上文法不是SLR(1)文法。
(4)为验证该文法是否为LALR或LR(1)的,构造LR(1)项目集。
对于I5,产生了移进-归约矛盾,所以这个文法不是LR(1)文法。于是也不是LALR文法。
文法:
S→UTa|Tb
T→S|Sc|d
U→US|e
拓广文法为G',增加产生式S'→S
若产生式排序为:
0 S' →S
1 S →UTa
2 S →Tb
3 T →S
4 T →Sc
5 T →d
6 U →US
7 U →e
由产生式知:
First (S' ) = {d,e}
First (S ) = {d,e}
First (U ) = {e}
First (T ) = {d,e}
Follow(S' ) = {#}
Follow(S ) = {a,b,c,d,e,#}
Follow(U ) = {d,e}
Follow(T ) = {a,b}
G′的LR(0)项目集族及识别活前缀的DFA如下图所示:
在I1中:
S' →S.为接受项目,T →S. 为归约项目,T →S.c为移进项目,存在接受-归约和移进-归约冲突,因此所给文
法不是LR(0)文法。
在I1中:
Follow(S') ∩ Follow(T)= { #} ∩{a ,b}=
Follow(T) ∩{ c}= { a ,b} ∩{c}=
在I8中:
Follow(U) ∩ Follow(T) ∩{ c}={d,e}∩{ a ,b} ∩{c}=
所以在I1中的接受-归约和移进-归约冲突与I8中的移进-归约和归约-归约冲突可以由Follow集解决,所以G 是SLR(1)文法。
构造的SLR(1)分析表如下:
题目3的SLR(1)分析表
第8题
文法:S A#A→BaBb|DbDa B→εD→ε
证明该文法是LR(1)但不是SLR(1)。
解:若产生式排序为:
0 S'→A# 1 A →BaBb 2 A →DbDa 3 B →ε 4 D →ε
由产生式知:
First (S' ) = {a,b}
First (A ) = {a,b}
First (B ) = {ε}
First (D ) = {ε}
Follow(S' ) = {#}
Follow(A ) = {#}
Follow(B ) = {a,b}
Follow(D ) = {a,b}
G′的LR(1)项目集族及识别活前缀的DFA如下图所示:
在I0中:
B →.,a和T →.,b为归约项目,但它们的搜索符不同,若当前输入符为a时用产生式B →ε归约,为b时用产生式D →ε归约,所以该文法是LR(1)文法。
若不看搜索符,在I0中项目B →.和T →.为归约-归约冲突,而
Follow(B ) ∩Follow(D ) = {a,b} ∩{a,b}≠,冲突不能用Follow集解决,所以该文法不是SLR(1)文法。
构造的LR(1)分析表如下:
题目4的LR(1)分析表
10.判断下列各题所示文法是否为LR类文法,若是请说明是LR(0)、SLR(1)、LALR(1)或LR(1)的哪一种,并构造相应分析表
(1)S→AB A→aBa|εB→bAb|ε
(3)S→aAd|eBd|aBr|eAr A→a B→a
(5) A→aB|εB→Ab|a
(6) S→(SR|a R→.SR|)
(1)解:对于该文法构造LR(0)项目规范族:
I0: S’→.S I1: S’→S. I3: A→a.Ba I5: B→b.Ab I6: A→aB.a S→.AB I2: S→A.B B→.bAb A→.aBa I7: A→aBa.
A→.aBa B→.bAb B→. A→. I8: B→bA.b
A->. B→. I4: S→AB. I9: B→bAb.
可见存在着移进-归约冲突,这个文法不是LR(0)文法。考虑用SLR(1)来解决问题:构造
(3)解:先构造该文法的LR(0)项目集规范族:
I0: S’→.S I1: S’→S. I3: S→e.Bd I5: S→aB.r I9: S→aAd.
S→.Ad I2: S→a.Ad B→.a I6: A→a. I10:S→aBr.
S→.eBd S→a.Br S→e.Ar B→a. I11:S→eBd.
S→.aBr A→.a A→.a I7: S→eB.d I12:S→eAr.
S→.eAr B→.a I4: S→aA.d I8: S→eA.r
该文法存在着归约-归约冲突,所以不是LR(0)文法。
对于状态I6: A→a.
B→a.
Follow(A)={dr} Follow(B)={dr}
两个集合相交不为空,所以该文法也不是SLR(1)文法。
构造该文法的LR(1)文法可得该文法是LR(1)的。
I0: S’→S,# I2: S→a.Ad,# I4: S→aA.d,# I10: S→aAd.,#
S→.aAd,# S→a.Br,# I5: S→aB.r,# I11: S→aBr.,#
S→.eBd,# A→.a,d I6: A→a.,d I12: S→eBd.,#
S→.aBr,# B→.a,r B→b.,r I13: S→eAr.,#
S→.eAr,# I3: S→e.Bd,# I7: S→eB.d,#
I1: S’→S.,# S→e.Ar, # I8: S→eA.r,#
B→.a,d I9: B→a.,d
A→.a,r A→a.,r
构造LR(1)分析表(略)。
(5)解:构造LR(0)的分析表:
I0: S→.A I3: S->aB. I6: B->AB.
A→.aB I4: B->A.b
A→ . I5: B->a.
I1: S->A. A->a.B
I2: S->a.B B->.Ab
B->.Ab B->.a
B->.a A->.aB
A->.aB A->.
A->.
可以看到存在着移进-归约的冲突,不是LR(0)文法。
在I0中Follow(A)与{b}相交不为空。所以也不为SLR(1)文法。
构造该文法的LR(1)项目集规范族:
I0: S->.A,# I4: B->A.b,# I9: B->a.,b
A->.aB,# I5: B->a.,# A->a.B,b
A->.,# A->a.B,b B->.Ab,b
I1: S->A.,# B->.Ab,b B->.a,b
I2: A->a.B,# B->.a,b A->.aB,b
B->.Ab,#, B->.aB,b A->.,b
B->.a,# A->.aB,b I10:B->AB.,b
A->.aB,b I6: B->Ab.,#
A->.,b I7: A->aB.,b
I3: A->aB.,# I8: B->A.b,b
其中存在冲突,所以文法也不是LR(1)文法。
(6)解:将文法拓广后得:
(0) S’→ S
(1) S→(SR
(2) S→ a
(3) R→.SR
(4) R→)
构造LR(0)的项目集规范族:
一个文法是LR(0)文法一定也是SLR(1)文法,也是LR(1)文法。但反之则不一定成立。
I0~~I9无冲突项目,所以此文法是LR(0)文法。
构造其LR(1)的DFA(构造过程中,在建立好初态集后,立即产生所有新状态的核集合,然后再逐步扩充):
LALR(1)项目集规范族:
同心集合并后无冲突,其项目集的个数与LR(0)相同,此文法是LALR(1)文法。
11. 设文法G[S]为:S→AS|ε A→aA|b
(1) 证明G[S]是LR(1)文法
(2) 构造出它的LR(1)分析表
(3) 给出输入符号串abab#的分析过程
一个文法不是SLR(1)时,不能证明它是LR(1)的
解:将文法改写为拓广文法:
(0) S’→S (1) S→AS (2) S→ε (3) A→aA (4) A→b
构造其LR(1)项目集规范族:
对abab#的分析过程:
第15题:已知文法为: S→a| |(T) T→T,S|S
(1) 构造它的LR(0)、LALR(1),LR(1)分析表
(2)给出对输入符号长(a#和(a,a#的分析过程
(3)说明(1)中三种分析表发现错误的时刻和输入串的出错位置有何区别。
解:构造该文法的LR(0)项目集规范集:
I0: S’→.S I2: S’→a. I5: S→(T.) I9: T→T,S.
S→.a I3: S→∧. T→T.,S
S→.∧I4: S→(.T) I6: T→S.
S→.(T) T→.T,S I7: S→(T).
I1: S’→S. T→.S I8: T→T,.S
S→.a S→.a
S→.∧S→.∧
S→.(T) S→(T)
构造
构造LR(1)规范集族:
I0: S’→.S,# I2: S’→a.,# I5: S→(T.),# I9: T→T,S.,) S→.a,# I3: S→∧.,# T→T.,S,) I10:S->a.,)
S→.∧,# I4: S→(.T),# I6: T→S.,) I11:S->∧.,)
S→.(T),# T→.T,S,)I7: S→(T).,# I12:S->(.T),) I1: S’→S.,# T→.S,)I8: T→T,.S,) T->.T,S,)
S→.a,)S→.a,) T->.S,)
S→.∧,)S→.∧,) S->.a,)
S→.(T),)S→(T),) S->.∧, I13:S->(T.),) I14:S->(T).,) S->.(T),) T->T.,S,)
构造LR(1)分析表:
和I12、I5和I13、I7和
分析对输入符号为(a#和(a,a#的LR(0),LR(1),LALR(1)分析过程:
(a#的LR(0)分析过程:
(a,a#的LR(0) 分析过程:
(
(3)LR(1)分析表发现问题最早,LALR次之,LR(0)最慢,发现位置相同。