LL(1)文法分析表的構造和分析過程示例




在考完編譯原理之后才弄懂,悲哀啊。不過懂了就好,知識嗎,不能局限於考試。



文法:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM