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 直到沒...