因为I5中:FOLLOW(A)∩{a,b}≠Ф ,I7中:FOLLOW(B)∩{a,b}≠Ф 所以,该文法不是SLR(1)文法。 或者:
从分析表中可看出存在歧义,所以该文法不是SLR(1)文法。 (4)对于输入串bab,SLR分析器所作出的动作如下:
步骤 状态栈 (1) 0 (2) 03 (3) 01 (4) 014 (5) 015 (6) 02 (7) 0A2b3 (8) 027 (9) 01
(在第5个动作产生歧义)
(b)LR(1)项目集族为:
I0 : S’ ?·S, # S ?·AS, # | a | b S ?·SA, a | b
I1 : S’ ? S· A ? S·A, a | b
# #b #S #Sa #SA #A #Ab #AS #S 符号栈 当前字符 b a a b b b # # # 剩余字符串 ab# b# b# # # 动作 移进 归约 S?b 移进 归约 A?a 移进 # 归约 A?SA 归约 S?b 归约S?AS 接受 S ?·b, # | a | b A ?·a, a | b
S ?·AS, a | b
A ?·a, a | b S ?·b, a | b
I2 : S ?A·S, # | a | b I3 : S ? b·, # | a | b S ?·b, # | a | b S ?·AS, # | a | b I4 : A ? a·, a | b A ?·SA, a | b A ?·a, a | b
I5 : A ? SA·, a | b I6 : A ? S·
S ? A·S, a | b A ?·SA, a | b
S ? ·AS, a | b A ?·a, a | b S ?·b, a | b S ?·AS, a | b A ?·SA, a | b S ?·b, a | b A ?·a, a | b I7 : S ? AS·, a | b A ? S·A, a | b
A ?·SA, a | b A ?·a, a | b S ?·AS, a | b S ?·b, a | b
∵I6状态集中存在“归约――移进”冲突,故无法构造LR(1)分析表,因而也就无法构造LALR分析表。
4、对下面的文法:S->UTa|Tb T->S|Sc|d U->US|e
判断是否为LR(0),SLR(1),LALR(1),LR(1),说明理由,并构造相应的分析表。 [答案](1)拓广文法: (0)S’->S (1)S->UTa (2)S->Tb (3)T->S (4)T->Sc (5)T->d (6)U->US (7)U->e (2)构造识别
LR(0)项目的DFA如下:
因为I1、I8
中存在冲突,所以该文法不是LR(0)文法。
因为FOLLOW(S)={#,c,a,b,d,e},FOLLOW(T)={a,b},FOLLOW(U)={d,e} I1中FOLLOW(T)∩{c}=Ф
I8中FOLLOW(U)∩{c}=Ф,FOLLOW(T)∩{c}=Ф, FOLLOW(T)∩FOLLOW(U)=Ф
I1、I8中冲突解决,所以该文法是SLR(1)文法。
状态 0 1 2 3 4 5 6 7 8 9 10
ACTION a b r3 r3 S9 r5 r5 r4 r4 S10 S9 r3 r3 r2 r2 r1 r1 c S6 S6 r2 r1 d S5 S5 r7 r6 r2 r1 e S4 S4 r7 r6 r2 r1 # acc r2 r1 GOTO S 1 8 T 3 7 U 2 2
S T U
构造识别LR(1)项目的DFA如下:
FIRST e,d e,d e FOLLOW a,b ,d,e,#,c a,b d,e
因为不存在冲突,所以该文法是LR(1)文法。
其中I2、I9可合并,I11、I13可合并,I5、I10可合并,I6、I14可合并, I12、I16可合并,I7、I15可合并,合并后无冲突,所以
状态 0 1 2 ACTION a b r3 C S6 d S5 S10 e S4 S4 # acc GOTO S 1 8 T 3 7 U 2 9 3 4 5 6 7 8 9 10 11 12 13 14 15 16 S12 r3 r5 r4 S16 S11 r5 r4 S13 r3 r5 r2 r1 r4 S13 S14 r2 r1 r7 r6 S10 r2 r1 r7 r6 S4 r2 r1 r2 r1 8 15 9 状态 0 1 2,9 3 4 5,10 6,14 7,15 8 11,13 12,16 a r5 r4 S12,16 r3 b r3 S11,13 r5 r4 S11,13 r3 r2 r1 ACTION c d S5,10 S6 S5,10 r7 S6,14 r6 r2 r2 r1 r1 e S4 S4 r7 r6 r2 r1 # acc r2 r1 S 1 8 GOTO T U 3 2,9 7,15 2,9
七
1、对于输入的表达式(4*7+1)*2,根据下表的语法制导定义建立一棵带注释的分析树。 val:表示非终结符的整数值,综合属性,lexval 是单词 digit 的属性
语法制导定义
产生式 L ?E E ?E语义规则 print(E.val) E.val:=E.val+T.val E.val:=T.val T.val:=T.val*F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval 11+T E ?T 1T ?T*F T ?F F ?(E) F ?digit 1