在考完編譯原理之后才弄懂,悲哀啊。不過懂了就好,知識嗎,不能局限於考試。
E→TE'
E'→+TE'|ε
T→FT '
T'→*FT'|ε
F→id| (E)
一、首先判斷是不是 LL(1)文法
--------------------------------------------------------------------------------------------------------
文法G的任意兩個具有相同左部的產生式 A --> α|β 滿足下列條件:
1、如果α和β不能同時推導出ε,則 FIRST(α)∩FIRST(β) = 空
2、 α和β 至多有一個能推導出 ε
3、如果 β --*--> ε ,則 FIRST(α)∩ FOLLOW(A)= 空
--------------------------------------------------------------------------------------------------------
對於 E'→+TE'|ε ,顯然ε --> ε, First(+TE') = {+} ,Follow(E') = {{),#} 顯然二者交集為空滿足。
對於 F→id|(E) ,First(id) = {id} First((E)) = {(} 顯然二者交集為空滿足。
所以該文法是LL(1)文法。
二、計算出First集和Follow集
參考:http://www.cnblogs.com/standby/p/6792774.html
三、構建LL(1)分析表
輸入:文法G
輸出:分析表M
步驟:
1、對G中任意一個產生式 A --> α 執行第2步和第3步
2、for 任意a ∈ First(α),將 A --> α 填入M[A,a]
3、if ε ∈ First(α) then 任意a ∈ Follow(A),將 A --> α 填入M[A,a]
if ε ∈ First(α) & # ∈Follow(A), then 將 A --> α 填入M[A,#] (覺得這步沒用)
4、將所有沒有定義的M[A,b] 標上出錯標志 (留空也可以)
--------------------------------------------------------------------------------------------------------
過程就不贅述了,結果:

四、分析過程
步驟:
1、如果 X = a = # 則分析成功並停機
2、如果 X = a != # 則彈出棧頂符號X, 並將輸入指針移到下一個符號上
3、如果 X != a,查詢分析表M[X,a] , 如果 M[X,a] = {X --> UVW},
則用UVW (U在棧頂) 替換棧頂符號 X。如果 M[X,a] = error或空,
則分析器調用錯誤處理程序。
(只有在第2種條件下才將輸入指針移動!!!)
根據上表,對輸入串 “id + id * id” 進行預測分析過程如下:
最開始在棧里壓入 # 和 開始符號 E

