如何填充語法分析表中的條目?


語法分析器是編譯的第二階段。語法分析器以來自前一階段(即詞法分析階段)生成的標記作為輸入,並將它們分組,以便可以識別它們的語法。

例如:

考慮 I0

I0 − E′ → ∙ E

      E → ∙ E + T

     E → ∙ T

     T → ∙ T ∗ F

     T → ∙ F

     F → ∙ (E)

     F → ∙ id

填充移進項

將SLR語法分析表構造演算法的規則(2a)應用於I0的一組產生式。只有當點之後是終結符時,才應用規則(2a)。考慮F → ∙ (E)

將A → α ∙ a β與F → ∙ (E)進行比較

F →ε(E )
A →α.aB

∴ A = F, α = ε, a = (, β = E)

應用規則,goto (Ii, a) = Ij

∵     goto (I0, ( ) = I4

∴    Action [0, ( ] = Shift 4

∴ 在第0行和左括號列前寫入s4

類似地,比較F → ∙ id

應用規則(2a)

將A → α ∙ a β與F → ∙ id進行比較

F →εidE
A →α.aB

∴ A = F, α = ε, a = id, β = ε

∴ goto (I0, id) = I5

∴ Action [0, id] = shift 5

在第0行和id列前寫入s5

類似地,透過以類似的方式處理從I0到I11的所有狀態,將完成表用移進操作填充。

填充歸約項(r) − 為了填充歸約(r)項,我們必須應用SLR語法分析表構造的規則(2b)。

從I0到I11,我們必須檢視A → α ∙形式的產生式。

考慮

I2 − E → T ∙

T → T ∙ * F

在這裡,我們有E → T ∙形式的產生式A → α ∙,其中點出現在最後位置。因此,將A → α ∙與E → T ∙進行比較。

E →T
A →α.

應用規則,我們必須找到FOLLOW (E)

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

問題中E → T的產生式編號為(2)

在狀態2的行和+, ), $的列前寫入r2。

action [2, +] = r2, action [2, )] = r2, action [2, $] = r2。

這裡,r2指的是使用產生式編號2進行歸約

類似地,考慮另一個狀態I3

I3 − T → F ∙

應用規則(2b)

將T → F ∙與A → α ∙進行比較

T →F
A →α.

∴ A = T, α = F

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

由於T → F是問題中的產生式編號(4)

在狀態3的行和+,*, ), $的列前寫入r4。

Action [3, +] = r4                 Action [3, $] = r4

Action [3, )] = r4                  Action [3, )] = r4

類似地,用歸約(r)項填充Action表。

填充goto項 − 可以使用語法分析表構造的規則(3)為非終結符填充goto表。

由於             I1 = goto(I0, E)

應用規則(3)

goto[0, E] = 1

在第0行和E列前寫入1。

類似地,          goto (I0, T) = I2

應用規則(3)

goto [0, T] = 2

在第0行和T列前寫入2。

類似地,我們可以填充goto表中的其他條目

填充“接受”項

應用規則(2C),存在一個產生式。

E′ → E ∙ 在I1中。

因此,在第1行和$列前寫入“接受”。

∴ action [1, $] = “接受”。

透過填充所有移進、歸約、接受、goto項,我們得到以下SLR語法分析表。

在表中,s表示移進,r表示歸約。

更新於:2021年11月2日

332 次檢視

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.