1. 程式人生 > >語法分析-FIRST集合與FOLLOW集合

語法分析-FIRST集合與FOLLOW集合

FIRST集合和FOLLOW集合

一、First集合

  • 定義: First集合是對產生式右部的字串而言的,求取的是非終結符VT(或終結符、空字元、文法符號串)的開始符號集合,集合中包含的是由左部非終結符VT推導得到的終結符VN或空字元ε。以α表示一個文法的字串,FIRST( α )表示由α推匯出的串的首個終結符或空字元組成的集合。

  • 規則 求文法符號X的FIRST( X ) ,直到沒有終結符或空字元可以加入。 ① 如果X屬於終結符VT,則FIRST(X) = { X } 。 ② 如果X屬於非終結符VN,且有產生式形如X → a…,則FIRST( X ) = { a }。 ③ 如果X屬於非終結符VN

    ,且有產生式形如X → ABCdEF…(A、B、C均屬於非終結符且包含 ε,d為終結符),需要把d、FIRST( A )、FIRST( B )、FIRST( C )加入到FIRST( X)中。 ④ 如果X經過一步或多步推匯出空字元ε,將ε加入FIRST( X )。

  • 一組文法符號串 由規則可知單個文法字元的FIRST集,那麼一組文法字串的FIRST集也可以求取了。假設文法符號串S由X1X2X3……Xn組成,則將每個文法符號Xi的FIRST集加入到FIRST( S )中,包括空字元ε。

  • 舉例1 設有文法G[A]:     A→BCc | gDB          B→bCDE | ε         C→DaB | ca          D→dD | ε          E→gAf | c  解:

    FIRST( A ) = FIRST( BCc ) ∪ FIRST( gDB ) =FIRST( B )∪FIRST( C )∪{ c }∪{ g } 由規則③規則②可知 FIRST( A ) =FIRST( B )∪FIRST( D )∪{ a }∪{ c }∪{ c }∪{ g } ={ b,ε }∪{ d,ε }∪{ a }∪{ c }∪{ g } ={ a,b,c,d,g ,ε } FIRST( B ) = { b,ε } FIRST( C ) = FIRST( D )∪{ a }∪{ c }= { a,c,d,ε } FIRST( D ) = { d,ε } FIRST( E )
    = { g,c } 對於A來說:有兩種選擇 BCc 與 gDB,BCc用規則③,gDB用規則②。 對於B來說:有兩種選擇 bCDE 與 ε,均用規則②。 對於C來說:有兩種選擇 DaB 與 ca,由於D存在空字元,所以 DaB用規則③,ca用規則②。 對於D來說:有兩種選擇dD 與 ε ,分別用規則②與規則④。 對於E來說:有兩種選擇gAf 與 c ,均用規則②。

  • 舉例2 設有文法G[S]:    S→aBS | bAS | ε    A→bAA | a    B→aBB | b 解: FIRST( S ) = FIRST( aBS )∪FIRST( bAS )∪{ ε }={ a,b,ε } FIRST( A ) = { a,b } FIRST( B ) = { a,b } 對於S來說:有三種選擇 aBS與bAS、ε,分別用②與規則④。 對於A來說:有兩種選擇bAA與 a,均用規則②。 對於B來說:有兩種選擇aBB與 b,均用規則②。

二、Follow集合

  • 定義: Follow集合是對某個非終結符而言的,求取的是非終結符VT的後繼符號集合,集合中包含的是由非終結符VT後面緊跟的終結符VN和結束符$,不能出現空字元ε 。以X表示一個非終結符,FOLLOW( X )表示當X通過規約出現時,接下來的輸入可能是哪些終結符。

  • 規則 求非終結符X的FOLLOW( X ) ,直到沒有終結符可以加入。 ① 如果X是開始符號,則將$加入到FOLLOW(X)中 。 ② 如果存在一個產生式S->αXβ,那麼將集合FIRST(β)中除ε外的所有元素加入到FOLLOW(X)當中。 ③如果存在一個產生式 S->αX , 或者S->αXβ且FIRST(β)中包含ε , 那麼將集合FOLLOW(S)中的所有元素加入到集合FOLLOW(X)中。

  • 舉例1 設有文法G[A]:     A→BCc | gDB          B→bCDE | ε         C→DaB | ca          D→dD | ε          E→gAf | c  解: FOLLOW( A ) ={ f ,$ } FOLLOW( B ) = FIRST( C )∪FOLLOW( A )∪FOLLOW( C )              ={ a,c,d }∪{ f ,$ }∪{ c,d,g,$ }              ={ a,c,d,f,g,$ } FOLLOW( C ) = { c }∪FIRST( D )∪FIRST( E )              ={ c }∪{ d }∪{ g,c }              ={ c,d,g } FOLLOW( D ) = FIRST( B )∪FOLLOW(A )∪FIRST( E )∪{ a }              ={ b } ∪{ g,c }∪{ f ,$ }∪{ a }              ={ a,b,c,g,f,$ } FOLLOW( E ) = FOLLOW( B )              ={ a,c,d,f,g,$ } 其中,A,B,C,D,E都是非終結符,A是開始符號。 對於A的出現來說:A是開始符號,規則①需要加入$;E→gAf,規則②將f加入FOLLOW( A )。 對於B的出現來說:有 A→BCc,規則②將FIRST( C )除ε以外加入進去;有A→gDB,規則③將FOLLOW( A )加入進去;有C→DaB,規則③將FOLLOW( C )加入進去。 對於C的出現來說:有 A→BCc,規則②將c加入進去;有B→bCDE,規則③將FOLLOW( D )加入進去,由於D存在空字元ε,所以需要把FIRST( E )除ε以外也加入進去。 對於D的出現來說:有A→gDB,規則②將FIRST( B )除ε以外加入進去,由於B存在空字元ε,所以規則③將FOLLOW( A )加入進去;有B→bCDE,規則②將FIRST( E )除ε以外加入進去;有C→DaB,規則②將a加入進去。 對於E的出現來說:有B→bCDE,規則③將FOLLOW( B )加入進去。

  • 舉例2 設有文法G[S]:    S→aBS | bAS | ε    A→bAA | a    B→aBB | b 解: FOLLOW( S ) = { $ } FOLLOW( A ) = FIRST( S )∪FOLLOW( S )∪FIRST( A )              ={ a,b } ∪{ $ }∪{ a,b }              ={ a,b,$ } FOLLOW( B ) =FIRST( S )∪ FOLLOW( S )∪FIRST( B )              ={ a,b } ∪ { $ }∪{ a,b }              ={ a,b,$ } 其中S,A,B是非終結符,S是開始符號。 對於S的出現來說:規則①將$加入進去。 對於A的出現來說:有S→bAS,規則②將FIRST( S )除ε以外加入進去,由於S存在空字元ε,規則③將FOLLOW( S )加入進去;有A→bAA,規則②將FIRST( A )除ε以外加入進去。 對於B的出現來說:有S→aBS,規則②將FIRST( S )除ε以外加入進去,由於S存在空字元ε,規則③將FOLLOW( S )加入進去;有B→aBB,規則②將FIRST( B )除ε以外加入進去。

三、LL(1)文法

  • 滿足條件: ① 文法無左遞迴。 ②如果A存在多個選擇ai,那麼任意兩個不同的選擇ai和aj,需滿足FIRST( ai )∩FIRST( aj )= ∅ ,保證不會回溯。 ③如果ε 屬於A 的開始符號集合,需滿足FIRST( A )∩FOLLOW( A ) = ∅ 保證只有一個選擇存在。