为以下文法构造 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 → | E | T | *F |
A → | A | B | β |
∴ 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 → | A | B | β |
∴ 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 列中的非终结符。