為以下文法構建一個預測分析表,並檢查字串 id + id * id 是否被接受。


問題 - 考慮以下文法 -

E → TE′

E′ → +TE′|ε

T′ → FT′

T′ → FT′|ε

F → (E)|id

解答 -

步驟1 - 消除左遞歸併執行左因子化

由於文法中不存在左遞迴,因此我們將按原樣進行。同樣,也不需要進行左因子化。

步驟2 - 計算 FIRST 集

FIRST(E) = FIRST(T) = FIRST(F) = {(, id}

FIRST (E′) = {+, ε}

FIRST (T′) = {*, ε}

步驟3 - 計算 FOLLOW 集

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

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

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

步驟4 - 構建預測分析

建立表格,即按行寫入所有非終結符,按列寫入所有終結符。

現在,透過應用預測分析表構建規則來填充表格。

  • E → TE′

將 E → TE′ 與 A → α 進行比較

E → TE′
A → Α

∴ A = E, α = TE′

∴ FIRST(α) = FIRST(TE′) = FIRST(T) = {(, id}

應用預測分析表的規則 (1)

∴ 將 E → TE′ 新增到 M[E, ( ] 和 M[E, id]

∴ 在行 (E) 和列 {(, id} 前面寫入 E → TE′ (1)

  • E′ → +TE′|𝛆

將其與 A → α 進行比較

E → +TE′
A → α

∴ A = E′ α = +TE′

∴ FIRST(α) = FIRST(+TE′) = {+}

∴ 將 E → +TE′ 新增到 M[E′, +]

∴ 在行 (E′) 和列 (+) 前面寫入產生式 E′ → +TE′ (2)

  • E′ → ε

將其與 A → α 進行比較

E → ε
A → α

∴ α = ε

∴ FIRST(α) = {ε}

∴ 應用預測分析表的規則 (2)。

查詢 FOLLOW (E′) = { ), $}

∴ 將產生式 E′ → ε 新增到 M[E′, )] 和 M[E′, $]

∴ 在行 (E′) 和列 {$, )} 前面寫入 E′ → ε                                                         (3)

  • T → FT′

將其與 A → α 進行比較

T → FT′
A → α

∴ A = T, α = FT′

∴ FIRST(α) = FIRST (FT′) = FIRST (F) = {(, id}

∴ 將產生式 T → FT′ 新增到 M[T, (] 和 M[T, id]

∴ 在行 (T) 和列 {(, id} 前面寫入 T → FT′                                                       (4)

  • T′ →*FT′

將其與 A → α 進行比較

T → *FT′
A → α

∴ FIRST(α) = FIRST (* FT′) = {*}

∴ 將產生式 T → +FT′ 新增到 M[T′,*]

∴ 在行 (T′) 和列 {*} 前面寫入 T′ →∗ FT′ (5)

  • T′ → ε

將其與 A → α 進行比較

T′ → ε
A → α

∴ A = T′

α = ε

∴ FIRST(α) = FIRST {𝜀} = {ε}

∴ 應用預測分析表的規則 (2)。

查詢 FOLLOW (A) = FOLLOW (T′) = {+, ), $}

∴ 將 T′ → ε 新增到 M[T′, +], M[T′, )] 和 M[T′, $]

∴ 在行 (T′) 和列 {+, ), $} 前面寫入 T′ → ε (6)

  • F →(E)

將其與 A → α 進行比較

F → (E)
A → A

∴ A = F, α = E

∴ FIRST(α) = FIRST ((E)) = {(}

∴ 將 F → (E) 新增到 M[F, (]

∴ 在行 (F) 和列 (( ) 前面寫入 F → (E) (7)

  • F → id

將其與 A → α 進行比較

F → Id
A → A

∴ FIRST(α) = FIRST (id) = {id}

∴ 將 F → id 新增到 M[F, id]

∴ 在行 (F) 和列 (id) 前面寫入 F → id (8)

將所有語句 (1) 到 (8) 組合起來將生成以下預測或 LL (1) 分析表 -


Id + * ( ) $
E E → TE′

E → TE′

E′
E′ → +TE′

E′ → ε T′ → ε
T T → FT′

T → FT′

T′
T′ → ε T′ →* FT′
T′ → ε T′ → ε
F F → id

F → (E)

步驟5 - 使用預測分析程式檢查字串 id + id * id 是否被接受

最初,棧將包含起始符號 E,並在棧底部包含 $。輸入緩衝區將包含一個字串,並在右側附加 $

如果棧頂 = 當前輸入符號,則棧頂的符號將彈出,並且輸入指標也前進或讀取下一個符號。

預測分析器執行的步驟序列


輸入 動作
$E id + id * id $ E → TE′
$E′T id + id * id $ T → FT′
$E′T′F id + id * id $ F → id
$E′T′id id + id * id $ 移除 id
$E′T′ +id * id $ T′ → ε
$E′ +id * id $ E′ → +TE′
$E′T + +id * id $ 移除 +
$E′T id * id $ T → FT′
$E′T′F id * id $ F → id
$E′T′id id * id $ 移除 id
$E′T′ * id $ T′ →* FT′
$E′T′F * * id $ 移除 *
$E′T′F id $ F → id
$E′T′id id $ 移除 id
$E′T′ $ T′ → ε
$E′ $ E′ → ε
$E $ 接受

更新於: 2023-11-08

33K+ 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告