解决方案
生成 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 中逐列写下非终结符。