語法分析-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
-
一組文法符號串 由規則可知單個文法字元的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 解:
-
舉例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 ) = ∅ 保證只有一個選擇存在。