1. 程式人生 > >編譯原理:LL(1),LR(0),SLR(1),LALR(1),LR(1)對比

編譯原理:LL(1),LR(0),SLR(1),LALR(1),LR(1)對比

LL(1)定義:一個文法G是LL(1)的,當且僅當對於G的每一個非終結符A的任何兩個不同產生式 A→α|β,下面的條件成立:SELECT( A→α)SELECT( A→β)=,其中,

α|β不能同時ε。

解釋:LL(1)的意思是,第一個L,指的是從左往右處理輸入,第二個L,指的是它為輸入生成一個最左推導。1指的是向前展望1個符號。LL(1)文法是上下文無關文法的一個子集。它用的方法是自頂向下的(遞迴式的處理)。它要求生成的預測分析表的每一個專案至多隻能有一個生成式。上面的定義說的是,任何兩個不同的產生式 A→α和 A→β,選擇A→α或者 A→β是不能有衝突的,即SELECT( A→α)∩SELECT( A→β)=

,具體來說,就是,第一:First( A→α∩ First( A→β)=,首符集不能有交集,否則當交集中的元素出現時,選擇哪個產生式進行推導是不確定的,(這其中也包含了α|β不能同時ε,否則交集就是{ε}不為空),第二:若任何一個產生式β,有ε屬於First(β),應有First(A)∩Follow( A)為空(當ε屬於First(β),則A有可能被空串代替,那麼就要看A的下一個字元,即Follow集,即要求Follow集和First集不能相交,否則可能發生衝突)。

LR文法:定義:如果某一文法能夠構造一張分析表,使得表中每一個元素至多隻有一種明確動作,則該文法稱為LR文法。

拓展:由上面的定義可以看到,LL(1)和LR文法都是無二義性的:LL(1)要求生成的預測分析表的每一個專案至多隻能有一個生成式,即對於讀頭下的每一個字元,都可以明確地選擇哪個產生式來推導,LR文法要求每一步都有明確的動作,移進和歸約都是可確定的,沒有二義性。

比較兩大型別(自頂向下 vs 自底向上)的文法的特點:

1.首先LL(1)分析法是自上而下的分析法。LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法。
   2.自上而下:從開始符號出發,根據產生式規則推導給定的句子。用的是推導
   3.自下而上:從給定的句子規約到文法的開始符號。用的是歸約
   4.自上而下就是一種試探過程,怎麼試探?需要你寫出它的FIRST()集與FOLLOW()集。寫出這兩個集合後根據LL(1)分析表構造規則畫出LL(1)分析表。現在基本完成了大半,當計算機輸入句子時,分析程式便會根據輸入去和分析表進行匹配,如果每步都能夠匹配成功則說明符合該語法規則,分析成功。
   FIRST()集:其實是終結符的集合,看該非終結符A能不能產生以它裡面的某個符號開頭的句子。(這也是自上而下分析法的思想)
   5.自下而上就是把句子變成非終結符,在把非終結符變成非終結符,這樣不斷的進行如果能到根節點則成功。

 LL(1)就是向前只搜尋1個符號,即與FIRST()匹配,如果FIRST為空則還要考慮Follow。
  LR需要構造一張LR分析表,此表用於當面臨輸入字元時,將它移進,規約(即自下而上分析思想),接受還是出錯。
   LR(0)找出控制代碼字首,構造分析表,然後根據輸入符號進行規約。不考慮先行,只要出現終結符就移進,只要出現歸約狀態,就無條件歸約,這樣子可能出現歸約-移進,歸約-歸約衝突。
   SLR(1)使用LR(0)時若有歸約-歸約衝突,歸約-移進衝突,所以需要看先行,則只把有問題的地方向前搜尋一次。

SLR(1)定義:滿足下面兩個條件的文法是SLR(1)文法

a.對於在s中的任何專案 A→α.Xβ,當X是一個終結符,且X在Follow(B)中時,s中沒有完整的專案B→r.

b.對於在s中的任何兩個完整專案A→α.和 B→β.,Follow(A)Follow(B)為空。

解釋:a.當X是一個終結符且X出現在讀頭上,對於專案 A→α.Xβ應該採用移進,若有完整的專案B→r.Follow(B)中有X,當X出現在讀頭上時,此時應該歸約,於是,就產生了移進和歸約衝突

b.假設Follow(A)∩Follow(B)為{ X },對於A→α.,若Follow(A)[A後面的元素]出現時,應該歸約,同理B也一樣,於是,會產生歸約-歸約衝突,SLR(1)是為了消除LR(0)的兩個衝突。
   LR(1)1.在每個專案中增加搜尋符。2.舉個列子如有A->α.Bβ,則還需將B的規則也加入。
   LALR(1)就是假如兩個產生式集相同則將它們合併為一個,幾合併同心集

總結:

見到First集就移進,見到Follow集就歸約。

LR(0):見到First集就移進,見到終態就歸約

SLR(1)見到First集就移進,見到終態先看Follow集,與Follow集對應的專案歸約,其它報錯。

SLR分析法包含的展望資訊是體現在利用了Follow(A)資訊,可以解決“歸約-歸約”衝突

SLR分析法沒有包含足夠的展望資訊,不能完成解決“移進-歸約”衝突,需要改進。

下面是LR(0),SLR(1),LALR(1),LR(1)文法處理能力的比較,圓圈越大說明能力越強。