為以下文法構造 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 列中的非終結符。