SLR(1)
SLR(1)分析表的构造方法和LR(0)分析表方法一样:
拓广文法→列项目→项目集规范蔟(DFA图)→分析表
步骤同上,只是多求一步FOLLOW集。
目的
SLR(1)的出现是为了解决LR(0)中的冲突:
- 移进——归约
移进(·后面是终结符)
归约(·在最后) - 归约——归约
活前缀定义、项目定义,会识别四种项目(移进、归约、接受、待约)
规范句型的一个前缀(不含句柄之后的任何符号)
文法中G[s]中每一个产生式的右部添加一个原点
⋅
·
⋅
归约项目(
A
→
a
⋅
A→a·
A→a⋅)
⋅
·
⋅在最后
接受项目(
S
→
a
⋅
S→a·
S→a⋅)开始文法对应的(一个LR0中只会产生一个接受项目accept)
移进项目(
A
→
a
⋅
x
β
A→a·xβ
A→a⋅xβ)
⋅
·
⋅后面是终结符
待约项目(
A
→
a
⋅
x
β
A→a·xβ
A→a⋅xβ)
⋅
·
⋅后面是非终结符
方法步骤(例题)
试构造下述文法的SLR(1)分析表
G[E]:
E → E + T | T
T → F * | F
F → (E) | a
第一步:拓广文法为G’[S’]
(0) S’ → E
(1) E → E + T
(2) E → T
(3) T → F*
(4) T → F
(5) F → (E)
(6) F → a
第二步:构造项目规范蔟(DFA表)
第三步:求FOLLOW集
FOLLOW(S’) = {$}
FOLLOW(E) = {+, ), $}
FOLLOW(T) = {+, ), $}
FOLLOW(F) = {*, +, ), $}
第四步:画分析表,先将有转换的按照之前的方式填入(填入
S
i
S_i
Si)
第五步:填入
R
i
R_i
Ri
I
2
I_2
I2对应的是文法中的(2) E → T
在E的FOLLOW集中,对应的填入
r
2
r_2
r2,
FOLLOW(E) = {+, ), $}
接下来是
I
5
I_5
I5、
I
7
I_7
I7、
I
9
I_9
I9、
I
1
0
I_10
I10,按照上述方法分析
如何判定lr[s]是SLR(1)文法
是否有移进和归约的冲突,
I
1
I_1
I1和$ I_3$中出现冲突
将
⋅
·
⋅后面的终结符和前面的FOLLOW集进行对比,是否为空串:
I
1
I_1
I1:{ + } ∩ FOLLOW(S’) = Φ
I
3
I_3
I3: { * } ∩ FOLLOW(T) = Φ
如果都为空,就是SLR(1)文法,满足该条件就是