为以下文法构造 SLR(1) 分析表
1. E → E + T
2. E → T
3. T → T * F
4. T → F
5. F → (E)
6. F → id


解决方案

生成 SLR 分析表的步骤

  • 生成 LR(0) 项的规范集

  • 根据分析表算法规则 (2b) 计算 FOLLOW。

FOLLOW 的计算

根据 FOLLOW 的规则 (1)

FOLLOW(E) = {$}                                                    (1)

  • E → E + T

应用 FOLLOW 规则 (2)

即,将 E → E + T 与 A → α B β 进行比较

E →ΕE+ T
A →ΑBΒ

∴ A = E, α = ε, B = E, β = +T

∵ 因为 FIRST(β) = FIRST(+T) = {+} 不包含 ε。

∴ FOLLOW 规则 (2b)

FOLLOW(E) = {+}                                                    (2)

应用 FOLLOW 规则 (3)

E →Ε +T
A →αB

FOLLOW(T) = {FOLLOW(E)}                                  (3)

  • E → T

规则 (2) 不能应用。因为 E → T 不能与 A → α B β 进行比较。应用 FOLLOW 规则 (3)

E →εT
A →αB

FOLLOW(T) = {FOLLOW(E)}                                  (4)

  • T → T* F

应用 FOLLOW 规则 (2)

T →ET*F
A →ABβ

∴ FIRST(β) = FIRST(∗ F) = {*}

规则 (2a)

∴ FOLLOW (T) = {*}                                                (5)

应用 FOLLOW 规则 (3)

T →T*F
A →αB

∴ FOLLOW (F) = {FOLLOW(T)}                                (6)

  • T → F

规则 (2) 不能应用。因为 T → F 不能与 A → α B β 进行比较

应用规则 (3)

T →εF
A →αB

FOLLOW (F) = {FOLLOW(T)} (7)

  • F → (E)

应用 FOLLOW 规则 (2)

A →(E)
F →ABβ

∴ FIRST(β) = FIRST()) = { )}

FOLLOW(E) = { )} (8)

规则 (3) 不能应用。

  • F → id

规则 (2) 和 (3) 都不能应用于此产生式。因为它们不能与 F → id 进行比较。

将 (1) 到 (8) 结合起来

FOLLOW(E) = {$}                                            (1)

FOLLOW(E) = {+}                                            (2)

FOLLOW(T) = {FOLLOW(E)}                          (3)

FOLLOW(T) = {FOLLOW(E)}                          (4)

FOLLOW (T) = {*}                                            (5)

FOLLOW (F) = {FOLLOW(T)}                          (6)

FOLLOW (F) = {FOLLOW(T)}                          (7)

FOLLOW(E) = { )}                                            (8)

∴ 从 (1)、(2) 和 (8)

FOLLOW(E) = {$, +, )}

从 (3)、(4)、(5)、(8)

FOLLOW(T) = {$, +, ),*}

从 (6) 和 (7)

FOLLOW(F) = {$, +, ) *}

以以下方式构造表的结构:

  • 按行写下所有状态 I0 到 I11(即 0 到 11)。
  • 按列写下 Action 列中的终结符。
  • 按列写下 goto 列中的非终结符。

更新于:2021-11-02

852 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告