如何填充語法分析表中的條目?
語法分析器是編譯的第二階段。語法分析器以來自前一階段(即詞法分析階段)生成的標記作為輸入,並將它們分組,以便可以識別它們的語法。
例如:
考慮 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 → | α | . | a | B |
∴ 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 → | ε | ∙ | id | E |
| A → | α | . | a | B |
∴ 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表示歸約。

資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP