SLR(1)

SLR(1)

  • 目的
  • 方法步骤(例题)
  • 如何判定lr[s]是SLR(1)文法

SLR(1)分析表的构造方法和LR(0)分析表方法一样:
拓广文法→列项目→项目集规范蔟(DFA图)→分析表
步骤同上,只是多求一步FOLLOW集。

目的

SLR(1)的出现是为了解决LR(0)中的冲突:

  1. 移进——归约
    移进(·后面是终结符)
    归约(·在最后)
  2. 归约——归约

活前缀定义、项目定义,会识别四种项目(移进、归约、接受、待约)
规范句型的一个前缀(不含句柄之后的任何符号)
文法中G[s]中每一个产生式的右部添加一个原点 ⋅ ·
归约项目( A → a ⋅ A→a· Aa ⋅ · 在最后
接受项目( S → a ⋅ S→a· Sa)开始文法对应的(一个LR0中只会产生一个接受项目accept)
移进项目( A → a ⋅ x β A→a·xβ Aaxβ ⋅ · 后面是终结符
待约项目( A → a ⋅ x β A→a·xβ Aaxβ ⋅ · 后面是非终结符

方法步骤(例题)

试构造下述文法的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表)
SLR(1)_第1张图片
第三步:求FOLLOW集
FOLLOW(S’) = {$}
FOLLOW(E) = {+, ), $}
FOLLOW(T) = {+, ), $}
FOLLOW(F) = {*, +, ), $}

第四步:画分析表,先将有转换的按照之前的方式填入(填入 S i S_i Si
SLR(1)_第2张图片
第五步:填入 R i R_i Ri
I 2 I_2 I2对应的是文法中的(2) E → T
在E的FOLLOW集中,对应的填入 r 2 r_2 r2
FOLLOW(E) = {+, ), $}

SLR(1)_第3张图片
接下来是 I 5 I_5 I5 I 7 I_7 I7 I 9 I_9 I9 I 1 0 I_10 I10,按照上述方法分析
SLR(1)_第4张图片

如何判定lr[s]是SLR(1)文法

是否有移进和归约的冲突, I 1 I_1 I1和$ I_3$中出现冲突
SLR(1)_第5张图片

⋅ · 后面的终结符和前面的FOLLOW集进行对比,是否为空串:
I 1 I_1 I1:{ + } ∩ FOLLOW(S’) = Φ
I 3 I_3 I3: { * } ∩ FOLLOW(T) = Φ
如果都为空,就是SLR(1)文法,满足该条件就是

你可能感兴趣的:(编译原理,算法,编译原理)