1、第七章 习题解答7.1 给定文法:S(A) AABBABBbBc 构造它的基本 LR(0)项目集; 构造它的 LR(0)项目集规范族; 构造识别该文法活前缀的 DFA; 该文法是 SLR文法吗?若是,构造它的 SLR分析表。7.2 给定文法:EEE+EEE*Ea 构造它的 LR(0)项目集规范族; 它是 SLR(1)文法吗?若是,构造它的 SLR(1)分析表; 它是 LR(1)文法吗?若是,构造它的 LR(1)分析表; 它是 LALR(1)文法吗?若是,构造它的 LALR分析表。7.3 给出一个非 LR(0)文法。7.4 给出一个 SLR(1)文法,但它不是 LR(0)文法,构造它的 SLR分
2、析表。7.5 给出一个 LR(1)文法,但它不是 LALR(1)文法,构造它的规范 LR(1)分析表。7.6 给定二义性文法: EE+E EE *E E(E) Eid用所述的无二义性规则和(或)另加一些无二义性规则,例如,给算符 *、+施加某种结合规则。 构造它的 LR(0)项目集规范族及识别活前缀的 DFA; 构造它的 LR分析表。习题参考答案7.1 解:文法的基本 LR(0)项目集为S.(A) S(.A) S(A.) S(A).A.ABB AA.BB AAB.B AABB.A.B AB. B.b Bb.B.c Bc.构造该文法的识别活前缀的 DFSA如下图所示:c S .(A) B b.
3、A ABB. S (.A) A .ABB A .B B .b B .c B c. S (A). S (A.) A A.BB B .b B .c A B. A AB.B B .b B .c I1 I0 I2 I3 ( ) B b c b c b I4 I5 I6 I8 I7 B B A 文法的识别活前缀的 DFSA该文法的 LR(0)项目集规范族=I 0,I 1,I 2,I 3,I 4,I 5,I 6,I 7,I 8因为在构造出来的识别活前缀的 DFA中,每一个状态对应的项目集都不含有移进-归约、归约-归约冲突,所以该文法是 LR(0)文法,当然也是 SLR文法。因为 FOLLOW(S)=#FO
4、LLOW(A)=FIRST)FIRST(BB)=),b,cFOLLOW(B)=FIRST(B)FOLLOW(A)=b,c,)其对应的 SLR(1)分析表如下表所示。文法 GS的 SLR(1)分析表ACTION GOTO状态b c ( ) # A B0 S11 S4 S5 2 32 S4 S5 S7 63 r3 r3 r34 r4 r4 r45 r5 r5 r56 S4 S5 87 acc8 r2 r2 r27.2 解:首先构造增广文法如下:SE 0EEE+ 1EEE * 2Ea 3(1) 构造它的 LR(0)项目集规范族如下图所示。该文法的 LR(0)项目集规范族=I 0,I 1,I 2,I
5、3,I 4,I 5(2) 因为在识别活前缀的 DFSA的每一个状态中,都不存在移进-归约冲突和归约-归约冲突,所以文法是 LR(0)文法,当然也是 SLR(1)文法。因为 FOLLOW(E)=#,+, *,a所以该文法对应的 SLR(1)分析表如下表所示。S .EE .E+E .E*E .aS E.E E.E+E E.E*E .E+E .E*E .aE E.+E E.*E E.E+E E.E*E .E+E .E*E .a E E*.E E+.E a.a+E*EEI1I0 I3I2I4I5aa文法的 LR(0)项目集规范族文法的 SLR(1)分析表ACTION GOTO状态a + * # E0
6、S2 11 S2 acc 32 r3 r3 r3 r33 S2 S4 S5 74 r1 r1 r1 r15 r2 r2 r2 r2(3) 该文法是 SLR(1)文法,当然也是 LR(1)文法。它的以 LR(1)项目集为状态的识别活前缀的 DFSA如下图所示。相应的 LR(1)分析表如表所示。S E., #E E.+, #/aE E.*, #/aE .E+, +/*/aE .E*, +/*/aE .a, +/*/aS .E, #E .E+, #/aE .E*, #/aE .a, #/aE E.+, #/aE E.*, #/aE E.+, +/*/aE E.*, +/*/aE .E+, +/*/a
7、E .E*, +/*/aE .a, +/*/aE a., #/aE a., +/*/aE E+., #/aE E*., #/aE*I3EE E.+, +/*/aE E.*, +/*/aE E.+, +/*/aE E.*, +/*/aE .E+, +/*/aE .E*, +/*/aE .a, +/*/a+E E+., +/*/aE E*., +/*/a*+I1I0I2EE a aaaI4 I7 I8I9I5I6文法的以 LR(1)项目集为状态的识别活前缀的 DFSA文法的 LR(1)分析表ACTION GOTO状态a + * # E0 S2 11 S4 acc 32 r3 r33 S4 S5 S
8、6 74 r3 r3 r35 r1 r16 r2 r27 S4 S8 S9 78 r1 r1 r19 r2 r2 r2(4) 由于文法的以 LR(1)项目集为状态的识别活前缀的 DFSA中,状态 I2和 I4、I 3和I7、I 5和 I8、I 6和 I9是同心项目集,将它们合并后不会产生冲突。因而可构造文法的LALR(1)分析表如下表所示。文法的 LALR(1)分析表ACTION GOTO状态a + * # E0 S24 11 S24 acc 3724 r3 r3 r3 r337 S24 S58 S69 3758 r1 r1 r1 r169 r2 r2 r2 r27.3 解:构造二义性文法 G
9、:SaAbScSSaAbSG 不是 LR(0)文法。7.4 解:构造下面文法 G:SbASB|bASdSa|bBcAa|c然后构造其 SLR分析表。 (略)7.5 解:构造下面的文法 G:SaAa|aBb|bAb|bBaAxBx然后构造其 LR(1)分析表。(略)7.6 解:首先构造增广文法如下:SE 0EE+E 1EE *E 2 E(E) 3Eid 4(1) 构造它的识别活前缀的 DFSA如下图所示。*( +S E.E .+ .*E E +.E .E .E* .( )E .idE ( .E) .+E .E* .( )E .id E *E. .+E .*EE +E. .E .*EE *.E .
10、+E .E* .( )E .idE ( E.) .+E .*EE ( E) .S .EE .+ .E*E .() idE id. (E(I1 +I0 EidI3*I4I5idI2id EEI7*I8*+I6I9)该文法的 LR(0)项目集规范族=I 0,I 1,I 2,I 3,I 4,I 5,I 6,I 7,I 8,I 9(2) 构造它的 LR分析表如下表所示。文法有冲突的 LR分析表ACTION GOTO 状态id + * ( ) # E0 S3 S2 11 S4 S5 acc2 S3 S2 63 r4 r4 r4 r4 r4 r44 S3 S2 r4 75 S3 S2 86 S4 S5 S
11、97 r1 r1/S4 r1/S5 r1 r1 r18 r2 r2/S4 r2/S5 r2 r2 r29 r3 r3 r3 r3 r3 r3由于识别文法活前缀的 DFSA中,状态 I7和 I8都存在“移进-归约”冲突,同时,FOLLOW(E)=#,),+, *即使构造 SLR分析表也无法避免冲突。为此规定*的优先级高于+,且它们均服从左结合,得到无冲突的 LR分析表如下表所示。文法无冲突的 LR分析表ACTION GOTO 状态id + * ( ) # E0 S3 S2 11 S4 S5 acc2 S3 S2 63 r4 r4 r4 r44 S3 S2 r4 75 S3 S2 86 S4 S5 S97 r1 S5 r1 r18 r2 r2 r2 r29 r3 r3 r3 r3