考慮文法:
S → CC
C → c C | d
構建 LALR(1) 解析器的解析表。
解決方案
步驟1 − 構造 LR(1) 專案集。首先,應生成所有 LR(1) 專案集。
在這些狀態中,狀態 I3 和 I6 可以合併,因為它們具有相同的核心或第一部分,但展望符 (Look Ahead) 的第二部分不同。
同樣,狀態 I4 和 I7 是相同的。
同樣,狀態 I8 和 I9 是相同的。
因此,I3 和 I6 可以合併為 I36。
I4 和 I7 合併為 I47。
I8 和 I9 合併為 I89。
所以,狀態將是
∴ I3 = goto(I0, c)
但 I3 , I6 合併為 I36
∴ I36 = goto(I0, c)
∴ I4 = goto(I0, d)
但 I4 , I7 合併為 I47
∴ I47 = goto(I0, d)
∴ I6 = goto(I2, c)
∴ I36 = goto(I2, c)
∴ I7 = goto(I2, d)
∴ I47 = goto(I2, d)
∴ goto(I3, C) = I8
但 I8 現在是 I89 的一部分
∴ goto(I36, C) = I89
同樣,goto(I3, d) = I4, goto(I6, d) = I7 ∴ goto(I36, d) = I47
LALR 解析表構建
填充“移進”項 (s)
考慮 goto(I0, c) = I36
∴ Action[0, c] = s36
∴ 在狀態 0 行和 c 列前面寫入 s36。
同樣,考慮
goto(I2, d) = I47
∴ Action[2, d] = 47
∴ 在狀態 2 行和 d 列前面寫入 s47。
填充“歸約”項 (r)
考慮 A → α ∙ 形式的產生式,
例如,考慮狀態
I47 = goto(I0, d)
C → d ∙, c |d |$
∴ C → d ∙, c |d |$ 具有 A → α ∙ 的形式。
由於 C → d 是給定問題中第 (3) 個產生式。
∴ 在狀態 47 行和 c、d、$ 列前面寫入 r3。
因為 c、d 是產生式 C → d ∙ , c | d 中的展望符。
填充 goto 項
這隻對非終結符才能找到。
例如,考慮
goto(I0, S) = I1
∴ goto[0, S] = 1
填充“接受”項
由於 S′ → S ∙ , $ 在 I1 中
∴ 在狀態 1 行和 $ 列前面寫入 accept。
LALR 解析表也可以透過合併 CLR 解析的組合狀態的行來獲得,即合併對應於 3、6 的行,然後是 4、7,然後是 8、9。
生成的 LALR 解析表將是: