1. 程式人生 > >LR(1)專案集族的構造:如何確定前向搜尋符

LR(1)專案集族的構造:如何確定前向搜尋符

    按照這個標題搜進來的各位是不是以為這也是和課本一樣的內容呢,其實這是我看了兩天課本才理解出來的內容啊,絕對和課本不一樣。

    課本上LR(1)專案集族的構造內容如下:

    以S′→·S,#屬於初始專案集中,把'#'號作為向前搜尋符,表示活字首為γ(若γ是有關S產生式的某一右部)要歸約成S時,必須面臨輸入符為'#'號才行。我們對初始專案S′→·S,# 求閉包後再用轉換函式逐步求出整個文法的LR(1)專案集族。具體構造步驟如下:

 (1) 構造LR(1)專案集的閉包函式。

 a)假定I是一個專案集, I 的任何專案都屬於CLOSURE(I)。

 b) 若有專案 A→α·Bβ,a 屬於CLOSURE(I),B→γ是文法中的產生式,β∈V*,b∈FIRST(βa), 則 B→·γ,b 也屬於CLOSURE(I)中。

 c) 重複b)直到CLOSURE(I)不再增大為止。

    大家是不是看的一頭霧水呢。課本上還給出了一個例子:

    文法G'為:

    (0)S'->S

    (1)S->aAd

    (2)S->bAc

    (3)S->aec

    (4)S->bed

    (5)A->e

    之後直接給出了這個文法的LR(1)專案集規範族:

    I0:S'->·S,#

        S->·aAd,#

        S->·bAc,#

        S->·aec,#

        S->·bed,#

    I1:S'->S·,#

    I2:S->a·Ad,#

        S->a·ec,#

        A->·e,d

    I3:S->b·Ac,#

        S->b·ed,#

        A->·e,c

    I4:S->aA·d,#

    I5:S->ae·c,#

        A->e·,d

    I6:S->bA·c,#

    I7:S->be·d,#

        A->e·,c

    I8:S->aAd·,#

    I9:S->aec·,#

    I10:S->bAc·,#

    I11:S->bed·,#

    大家是不是在想I5中A->e·,d後的d、I7中A->e·,c後的c是怎麼來的呢?

    課本的答案是對的,但是寫法很是讓我們一頭霧水,下面讓我們來看看答案是怎麼出來的:

1.一開始,綠框處S'是整個句子,所以後面理所當然跟句子結束符#。然後S後面是‘ε’(就是什麼都沒有)所以β=ε,接著逗號後面是‘#’即a=#,這樣FIRST(βa)=FIRST(ε#)={#}。這就是I0中S後面#號的來歷。 2.在I2中,如紅線所示,在I2:S->a·Ad,#中A的後面是d,所以FIRST(d#)={d}(就是“d#”的第一個終結符d),所以接下來A的後面跟的是d。 3.在確定了A的逗號後面的搜尋符後,基本上就可以直接照搬下去了,如圖中的紫線所示。(其實#號一直都在照搬來著,大家注意到沒?)     下面再講一點FIRST(β)的計算。 1.如果β的第一個字元是終結符,如: β=aAbbC β=eBbbD 那麼FIRST(β)=FIRST(aAbbC)+FIRST(eBbbD)={a}+{e}={a,e};   (‘+’代表‘並’,那個符號不好打,用‘+’來代替了。大笑 2.如果β的第一個字元是非終結符,如: β=AEbC A=DBac D=ε B=ea B=bd 那麼: FIRST(β)=FIRST(AEbC) =FIRST(FIRST(A)EbC) =FIRST(FIRST(DBac)EbC) =FIRST(FIRST(FIRST(D)Bac)EbC) =FIRST(FIRST(εBac)EbC)        (ε表示空,如果不是空,就結束了,但是空還要計算ε後面的Bac) =FIRST(FIRST(εBac)EbC)+FIRST(FIRST(Bac)EbC) =FIRST(εEbC)+FIRST(FIRST(Bac)EbC) ={ε}+FIRST(FIRST(Bac)EbC) ={ε}+FIRST(FIRST(FIRST(ea)ac)EbC)+FIRST(FIRST(FIRST(bd)ac)EbC)        (由於B有兩個推導式,所以分開來寫並求並集,‘+’代表‘並’) ={ε}+FIRST(FIRST(eac)EbC)+FIRST(FIRST(bac)EbC) ={ε}+FIRST(eEbC)+FIRST(bEbC) ={ε}+{e}+{b} ={ε,e,b} 為了普遍性,我把β搞的複雜了點,多看幾遍,你就會了。如果不會,在下面留言。我可是看了兩天才看懂的。大哭