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

解决方案

生成 SLR 解析表的步骤

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

  • 按照解析表算法规则 (2b) 的要求计算 FOLLOW。

FOLLOW 的计算

按照 FOLLOW 的规则 (1)

FOLLOW(E)= {$} (1)

  • E → E + T

应用规则 (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
一→αB

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

  • E → T

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

E →εT
一→αB

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

  • T → T* F

应用 FOLLOW 规则 (2)

T*F
A →一种Bβ

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

规则 (2a)

∴ 跟随 (T) = {*} (5)

应用规则 (3) 跟随

T →时间*F
一→αB

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

  • T → F

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

应用规则 (3)

εF
一→αB

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

  • F → (E)

应用规则 (2) 跟随

一→(E)
F →一种Bβ

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

FOLLOW(E)= { )} (8)

不能适用规则(3)。

  • F → 身份证

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

结合 (1) 到 (8)

FOLLOW(E)= {$} (1)

FOLLOW(E)= {+} (2)

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

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

跟随 (T) = {*} (5)

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

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

FOLLOW(E)= { )} (8)

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

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

从 (3), (4), (5), (8)

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

从 (6) 和 (7)

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

按以下方式构造表的结构 -

  • 逐行记下所有状态 I 0到 I 11(即 0 到 11)。

  • 在 Action column-wise 中写下终端符号。

  • 在 goto column-wise 中逐列写下非终结符。

猜你喜欢