編譯原理FOLLOW集的求法

2021-10-06 13:18:02 字數 2127 閱讀 5713

follow集求法有兩種,要麼逐步推導,推導出所有式子求follow集合,這種方法簡單但是容易遺漏

要麼就按照步驟一步一步來求

文字定義:follow(a)集合是所有緊跟a之後的終結符或#所組成的集合(#是句尾的標誌),稱follow(a)是a的隨符集
計算所有非終結符號a的follow(a)集合時,不斷應用下面的規則,直到再沒有新的終結符號可以被加入到任意的follow集合中為止。

注意:當a是最右部的時候,將$加入到follow(a)中

(1)將 $ 放到follow(s)中,其中s是文法的開始符號。

(2)如果存在乙個產生式a→αbβ,那麼first(β)中除ε之外的所有符號都在follow(b)中。【 follow(b)是求跟在b後的終結符或$組成的集合,因此對於跟在b後的β,它的first集合就是follow(b)的子集 】

(3)如果存在乙個產生式a→αb,或存在產生式a→αbβ且first(β)包含ε,那麼follow(a)中的所有符號都在follow(b)中。【 對於a→αbβ,且β多步推導出ε ,那麼可以用αb替換a, b後面緊跟的字元就是a後面緊跟的字元】

文法如下:

e -> te』

e』 -> +te』 | ε

t -> ft』

t』 -> *ft』 | ε

f -> (e) | id

直接給出first集

first(e) = first(t) = first(f) =

first(e』) =

first(t』) =

follow e

e是文法的開始符號,根據規則 (

1) 將$加入到 follow

(e),

follow

(e)=

, 再根據規則(

2)和產生式 5 將 ) 加入, 所以 follow

(e)=

follow e』
根據產生式 1 , e'是結尾符號,所以將$加入follow

(e』)中 , 根據規則 (

3) 和產生式 1

,可知,將

follow

(e) 加入到 follow

(e『)中 ,所以 follow

(e')

=

follow t
根據產生式 1 和 規則(2)

,將first

(e')

-加入到follow

(t)中,follow

(t)=

, 再根據產生式 1 和規則(3)

, 將follow

(e)加入到follow

(t)中,所以follow

(t)=

follow t』
根據產生式 3 因為t'出現在最右部,所以加入follow

(t『)中,再根據規則(

3)和產生式3,

將follow

(t)加入到follow

(t』)中,所以follow

(t')

=

follow f
① 根據產生式 3 和規則 (2)

,將first

(t')

-加入到follow

(f)中,follow

(f)=

② 產生式 3 和 規則 (

3) ,將follow

(t)加入到follow

(f)中,follow

(f)=

③ 再根據產生式 4 和規則(

3)將follow

(t')加入follow

(f)follow

(f)=

④ 根據產生式 4 和規則2 將first

(t')加入到follow

(f)中, follow

(f)=

實際上,我們回顧規則開頭,當沒有新的終結符加入時,不必對所有的式子都應用

式子進行計算。

編譯原理中Follow集的求法

首先引用龍書裡面的一段較為公式化的follow集求法的話 計算所有非終結符號a的follow a 集合時,不斷應用下面的規則,直到再沒有新的終結符號可以被加入到任意的follow集合中為止。1 將放到 foll ow s 中,其 中s是開 始符號,而 是輸入右端的結束標記。2 如果存在乙個產生式a ...

FIRST集和FOLLOW集的求法

follow集 若x a 則將終結符 加入first x 中 若x e 則將終結符e加入first x 中 e表示空集 若 x bc d,則將first b 所有元素 除了空集 加入first a 然後檢測first b 若first b 中不存在空集,則停止,若存在則向b的後面檢視,將first ...

編譯原理 FIRST集與FOLLOW集

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