10#(S,(S,S))#归约,>)
11#(S,(T))#归约,>)
12#(S,(T))#移进(=)
13#(S,S)#归约)>)
14#(T)#归约,>)
15#(T)#移进(=)
16#S#归约)>#
17#S#分析成功
5.考虑文法:
S→AS|b
A→SA|a
(1)列出这个文法所有的LR(0)项目;
(2)构造这个文法的LR(0)项目集规范族以及识别活前缀的DFA;
(3)这个文法是SLR的吗?
若是,构造分析表;
(4)这个文法是LALR或LR
(1)的吗?
解:
拓广文法如下:
S’→S
S→AS|b
A→SA|a
(1)所有LR(0)项目如下:
1)S’→.S2)S’→S.3)S→.AS4)S→A.S5)S→AS.6)S→.b
7)S→b.8)A→.SA9)A→S.A10)A→SA.11)A→.a12)A→a.
(2)该文法的LR(0)项目集规范族如下:
DFA略。
(3)FIRST(S)={b,a}FIRST(A)={a,b}
FOLLOW(S)={#,a,b}FOLLOW(A)={a,b}
在LR(0)项目集规范族中,同时存在“移进-归约”和“归约-归约”项目的项目集有I1,I5和I7;其中I1中“归约”项目是“接受”项目,面临#时接受,移进项目要求面临a和b时移进,不存在冲突;I5中归约项目面临FOLLOW(A)中元素a,b时归约,“移进”项目面临a,b时移进,存在冲突;同理,I7也存在冲突。
所以该文法不是SLR的。
(或者:
构造出SLR分析表,指出存在多重入口)
(4)构造LR
(1)项目集规范族:
因为:
I5,I8,I9中存在“移进-归约”冲突,所以该文法不是LR
(1)的,更不是LALR的。
(!
此题另解:
该文法是二义文法,故不是任何LR文法。
)
本章补充作业:
1.文法G[S],构造LR
(1)分析表:
S→aAd|bAc|aec|bed
A→e
解:
(1)拓广文法如下:
0)S’→S
1)S→aAd
2)S→bAc
3)S→aec
4)S→bed
5)A→e
(2)LR
(1)项目集规范族构造如下:
(3)LR
(1)分析表如下:
2.文法G[S]:
S→AB
A→aBa|ε
B→bAb|ε
(1)该文法是SLR的吗?
(2)若是,请构造它的分析表;
(3)给出输入串baab#的分析过程。
解:
对文法拓广:
(0)S’→S
(1)S→AB
(2)A→aBa
(3)A→ε
(4)B→bAb
(5)B→ε
(1)构造LR(0)项目集规范族如下:
因为:
FOLLOW(S)={#}FOLLOW(A)={b,#}FOLLOW(B)={a,#}
I0面临FOLLOW(A)中元素时归约,面临a时移进,不存在冲突;同理,I2,I3,I5中的冲突也可以用SLR方法解决,所以该文法是SLR的。
(2)SLR分析表如下:
(3)
步骤状态栈符号栈输入串
00#baab#
102#Abaab#
2025#Abaab#
30253#Abaab#
402536#AbaBab#
5025368#AbaBab#
60257#AbAb#
702579#AbAb#
8024#AB#
901#S#
3.若有文法G[S]:
S→S;M|M
M→MbD|D
D→D(S)|ε
(1)证明G[S]是SLR文法,并构造它的分析表;
(2)给出G[S]的LR
(1)项目集规范族中的I0。
解:
(1)拓广文法为:
0)S’→S
1)S→S;M
2)S→M
3)M→MbD
4)M→D
5)D→D(S)
6)D→ε
LR(0)项目集规范族如下:
FOLLOW(S)={#,;,)}
FOLLOW(M)={#,;,),b}
FOLLOW(D)={#,;,),b,c}
SLR分析表如下:
分析表入口唯一,所以是SLR的。
(2)LR
(1)项目集规范族中的I0:
S’→.S,#
S→.S;M,#/;
S→.M,#/;
M→.MbD,#/;/b
M→.D,#/;/b
D→.D(S),#/;/b/(
D→.,#/;/b/(
第6章
1。
对于某个上下文无关文法,当把每个文法符号联系于一组属性,且让该文法的产生式规则附加以属性计算时,称该文法为属性文法。
2.文法符号的属性有两种,一种称为综合属性,另一种成为继承属性
3.一个文法符号的继承属性是通过语法树中它的父结点和/或兄弟结点的相应文法符号的属性值来计算的,而综合属性是通过语法树中它的子结点的属性值来计算的
4.语法制导的编译程序能同时进行语法分析和语义分析