R → L
解决方案
步骤 1 - 首先,将其转换为增强文法 G' 并对产生式进行编号
(0) S′ → S
(1) S → L = R
(2) S → R
(3) L →∗ R
(4) L → id
(5) R → L
步骤 2 - 查找闭包和 goto 函数以构造 LR(0) 项目。
在以下 LR(0) 项目集中,方框表示新状态,圆圈表示重复状态
步骤 3 - FOLLOW 的计算 - 应用 FOLLOW 的规则 (1),我们得到
FOLLOW(S) = $ (1)
- S → L = R
应用规则 (2) FOLLOW - 将 S → L = R 与 A → α B β 进行比较。
S → | Ε | L | = R |
A → | Α | B | Β |
∴ A = S,α = ε,B = L,β = {= R}
FIRST(β) = FIRST(= R) = {=} 不包含 ε
规则 (2a) of FOLLOW
FOLLOW(L) = {=} (2)
应用规则 (3) of FOLLOW - 将 S → L = R 与 A → α B 进行比较
S → | L = | R |
A → | α | Β |
∴ FOLLOW(R) = {FOLLOW(S)} (3)
- S → R
规则 (2) of FOLLOW 无法应用。
由于 S → R 无法与 A → α B β 进行比较。因为,如果我们比较,我们会得到,α = ε,B = R,β = ε。但 β 不应为 ε 以应用此规则。
应用规则 (3) of FOLLOW - 将 S → R 与 A → α B 进行比较
S → | ε | R |
A → | α | Β |
∴ A = S,α = ε,B = R
FOLLOW(R) = {FOLLOW(S)} (4)
- L →*R
规则 (2) of FOLLOW 无法应用。
由于 L →* R 无法与 A → α B β 进行比较。因为 β 将为 ε,这是不可能的。
应用规则 (3) of FOLLOW - 将 L →∗ R 与 A → α B 进行比较
L → | * | R |
A → | α | Β |
∴ A = L,α =∗,B = R
FOLLOW(R) = {FOLLOW(L)} (5)
- L →id
规则 (2) 和 (3) of FOLLOW 无法应用。
由于 L → id 无法与 A → α B β 和 A → α B 匹配。
- R → L
规则 (2) 无法应用。
由于 R → L 无法与 A → α B β 匹配。
应用规则 (3) of FOLLOW - 将 R → L 与 A → α B 进行比较
R → | E | L |
A → | A | Β |
∴ A = R,α = ε,B = L
FOLLOW(L) = {FOLLOW(R)} (6)
结合语句 (1) 到 (6)
FOLLOW(S) = $ (1)
FOLLOW(L) = {=} (2)
FOLLOW(R) = {FOLLOW(S)} (3)
FOLLOW(R) = {FOLLOW(S)} (4)
FOLLOW(R) = {FOLLOW(L)} (5)
FOLLOW(L) = {FOLLOW(R)} (6)
从 (1)
FOLLOW(S) = $
从 (1)、(2)、(3)、(4)、(5)、(6)。
FOLLOW(L) = FOLLOW(R) = {=, $}
构造解析表
填充移进项 (s)
由于 goto (I0,*) = I4
∴ Action [0,∗] = s4
由于 goto (I0, id) = I5
∴ Action [0, id] = s5
类似地,所有移进项 (s) 都填充到表中。
填充归约项 (r)
应用规则 (2b) SLR 解析表的构造
考虑
I2 S → L ∙= R
R → L ∙
R → L ∙ 与 A → α ∙ 进行比较
R → | L | . |
A → | α | . |
∴ A = R,α = L
由于 R → L 是给定问题中的产生式编号 (5)。
∴ 在第 2 行状态和第 = 列、$ 列前面写入 r5。
类似地,归约的其他条目填充到表中。
填充“接受”条目
考虑 I1
I1 - S′ → S ∙
应用解析表构造规则 (4)
∴ 在第 1 行状态和第 $ 列前面写入“接受”。
通过填充所有移进、归约、goto 和接受条目,我们得到以下解析表。
下表精确地显示 Action [2, =] = s6 或 r5 中有多个条目。
状态 I2 - S → L ∙ = R
R → L ∙
R → L ∙ 具有 A → α ∙ 的形式
∴ 可以对其应用归约规则。
R → L 是给定问题中的产生式编号 (5)。
∴ Action [2, =] = r5
∴ goto (I2, =) = I6
∴ Action [2, =] = s6
因此,在条目 Action [2, =] 上存在移进/归约冲突。这表明给定的文法不是 SLR(1) 文法。