(11)此时栈顶第一个终结符为,,当前符号为),由于,>),所以应该进行归约。
由于堆栈中(<,,所以当前句型的最左素短语为N,N,对其进行归约,得到:
(12)此时栈顶第一个终结符为(,当前输入符号为),由于(=),所以应该移进,得到:
(13)此时栈顶第一个终结符为),当前输入符号为),由于)>),所以应该进行归约。
由于此时堆栈中(=),而,<(,所以当前的最左素短语为栈顶的(N),对其进行归约,得到:
(14)此时栈顶的第一个终结符为,,当前输入符号为),由于,>),所以应该进行归约。
由于此时堆栈中(<,,所以当前的最左素短语为N,N,对其进行归约,得到:
(15)此时栈顶的第一个终结符为(,当前输入符号为),由于(=),所以应该移进,得到:
(16)此时栈顶的第一个终结符为),当前输入符号为#,由于)>#,所以应该进行归约。
由于此时堆栈中(=),#<(,所以当前的最左素短语为(N),对其进行归约,得到:
此时栈顶的第一个终结符为#,当前的输入符号也为#,标志分析成功。
2、课件第5章中练习题。
第6章
1、给定文法:
E(L)|a
LL,E|E
(1)构造识别活前缀的确定有限自动机(LR(0)项目集规范族);
(2)构造LR(0)分析表;
(3)构造SLR
(1)分析表;
(4)该文法是否为LR(0)文法?
为什么?
(5)该文法是否为SLR
(1)文法?
为什么?
(6)用SLR
(1)分析表对((a),a)进行LR语法分析,给出分析程序的每一步动作及缓冲区和堆栈的变化情况。
【解答】
(1)首先对文法进行拓广,得到如下的拓广文法:
<1>SE
<2>E(L)
<3>Ea
<4>LL,E
<5>LE
构造识别活前缀的确定有限自动机(LR(0)项目集规范族)如下图所示:
(2)LR(0)项目集规范族中有9个项目集(确定有限自动机的状态),所以LR(0)分析表应该有9行,每行对应一个状态。
假设用数字0~8分别对应I0~I8。
对于0号状态这一行,考察项目集I0,其中含3个项目,分别为待约项目SE,移进项目E(L)和Ea。
对于SE,由于GO(I0,E)=I1,所以在这一行E列(GOTO子表)中放置状态1;对于E(L),应该在(列放置移进动作,由于GO(I0,()=I2,所以应该设置s2;对于Ea,应该在a列放置移进动作,由于GO(I0,a)=I3,所以应该放置s3。
对于1号状态这一行,由于I1中只有接受项目,所以在这一行#列应该设置接受动作(acc)。
对于2号状态这一行,含有3个待约项目E(L),LL,E和LE,因此,根据它们填充GOTO子表,具体地,根据待约项目E(L)及GO(I2,L)=I4,在这一行L列放置状态号4,根据待约项目LL,E及GO(I2,L)也是在这一行L列放置状态号4,根据待约项目LE及GO(I2,E)=I8,在这一行E列放置状态号8。
此外,在这个项目集中还有两个移进项目E(L)和Ea,根据E(L)及GO(I2,()=I2,应该在这一行(列放置s2,根据Ea及GO(I2,a)=I3,应该在这一行a列放置s3。
对于3号状态,由于其中只含一个归约项目Ea,据此需要在这一行每个终结符对应的列上(动作子表的)放置用Ea进行归约的动作,即r3。
按照同样的方式考察其他状态,得到:
4号状态行)列(动作子表)放置状态号s5,,列(动作子表)放置s6;5号状态行动作子表每一列放置用E(L)进行归约的动作,即r2;6号状态行a列放置s3,(列放置s2,E列放置状态7;7号状态行动作子表每一列放置用LL,E进行归约的动作,即r4;8号状态行动作子表每一列放置用LE进行归约的动作,即r5。
根据前面的分析,可以得到如下表所示的LR(0)分析表:
状态
ACTION(动作)
GOTO(转移)
a
(
)
#
E
L
0
s3
s2
1
1
acc
2
s3
s2
8
4
3
r3
r3
r3
r3
r3
4
s5
s6
5
r2
r2
r2
r2
r2
6
s3
s2
7
7
r4
r4
r4
r4
r4
8
r5
r5
r5
r5
r5
(3)SLR
(1)分析表的构造与LR(0)只是在归约项目上有所不同。
在识别活前缀的确定有限自动机中,包含归约项目的状态(项目集)有4个,分别为I3、I5、I7和I8。
现在我们考察这些