編譯原理 FIRST集與FOLLOW集

2021-09-03 02:07:50 字數 3479 閱讀 7984

first集合是對產生式右部的字串而言的,求取的是非終結符vt(或終結符、空字元、文法符號串)的開始符號集合,集合中包含的是由左部非終結符vt推導得到的終結符vn或空字元ε。以α表示乙個文法的字串,first( α )表示由α推導出的串的首個終結符或空字元組成的集合。

規則

求文法符號x的first( x ) ,直到沒有終結符或空字元可以加入。

① 如果x屬於終結符vt,則first(x) = 。

② 如果x屬於非終結符vn,且有產生式形如x → a…,則first( x ) = 。

③ 如果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 )∪∪

由規則③規則②可知

first( a ) =first( b )∪first( d )∪∪∪∪

=∪∪∪∪

=first( b ) =

first( c ) = first( d )∪∪=

first( d ) =

first( e ) =

對於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 )∪=

first( a ) =

first( b ) =

對於s來說:有三種選擇 abs與bas、ε,分別用②與規則④。

對於a來說:有兩種選擇baa與 a,均用規則②。

對於b來說:有兩種選擇abb與 b,均用規則②。

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 ) =

follow( b ) = first( c )∪follow( a )∪follow( c )

=∪∪=

follow( c ) = ∪first( d )∪first( e )

=∪∪=

follow( d ) = first( b )∪follow(a )∪first( e )∪

= ∪∪∪

=follow( e ) = follow( b )

=其中,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 )

= ∪∪

=follow( b ) =first( s )∪ follow( s )∪first( 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 )除ε以外加入進去。

滿足條件:

① 文法無左遞迴。

②如果a存在多個選擇ai,那麼任意兩個不同的選擇ai和aj,需滿足first( ai )∩first( aj )= ∅ ,保證不會回溯。

③如果ε 屬於a 的開始符號集合,需滿足first( a )∩follow( a ) = ∅ 保證只有乙個選擇存在。

編譯原理 FIRST集與FOLLOW集的計算

參考 我認為求這兩個集最重要的就是分別理解清楚 first集和follow集的意義是什麼 具體演算法在兩篇博文中已有介紹 first集,即終結首符集,就是求乙個輸入串開頭的所有可能出現的終結符的集合。例如a ac bb cd,根據這個產生式的幾條候選式,就可以知道,非終結符a被替換後,串開頭可能出現...

編譯原理 FIRST集和FOLLOW集

自己的理解 例子如果x是乙個終結符,則first x x 如果x是乙個非終結符,則x y 1y2y 3 yk x rightarrow y 1y 2y 3 cdots y k x y1 y 2 y3 yk 其中k 1 k ge1 k 1。i k,a firs t yi 且fi rst y1 firs...

編譯原理 First集和Follow集

剛學first集和follow集的時候,如果上課老師沒有講明白或者自己沒聽明白,自己看的時候還真是有點難理解,不過結合著具體的題目可以理解的更快。先看一下兩種集合的求法 first集合的求法 first集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的first集合,由於終結符的first...