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 →EL
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) 文法

更新于:2021 年 11 月 2 日

3K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告