首先引用龍書裡面的一段較為公式化的follow集求法的話:
計算所有非終結符號a的follow(a)集合時,不斷應用下面的規則,直到再沒有新的終結符號可以被加入到任意的follow集合中為止。
(1)將放到
foll
ow(s
)中,其
中s是開
始符號,
而 是輸入右端的結束標記。
(2)如果存在乙個產生式a→αbβ,那麼first(β)中除ε之外的所有符號都在follow(b)中。
(3)如果存在乙個產生式a→αb,或存在產生式a→αbβ且first(β)包含ε,那麼follow(a)中的所有符號都在follow(b)中。
下面舉個例子來說明下,假設有如下文法:
①e→te』
②e』→+te』 | ε
③t→ft』
④t』→*ft』 | ε
⑤f→(e)| id
對於每個非終結符號,我們都可以求出其follow集:
根據(1),首先將加入
到fol
low(
e)中,
即fol
low(
e)={
},由⑤可知,)也應該在follow(e)中,即follow(e)={$,)};
對於e』,根據規則(3)以及產生式①,應該將follow(e)加入到follow(e『)中,即follow(e』)={$,)};
對於t,根據規則(2)以及產生式①,應該將first(e』)加入到follow(t)中,即follow(t)={+},根據規則(3),由於first(e』)包含ε,所以應該將follow(e)加入到follow(t)中,即follow(t)={+,$,)};
對於t』,根據規則(3)以及產生式③,應該將follow(t)加入到follow(t『)中,即follow(t』)={+,$,)};
對於f,根據規則(2)以及產生式③,應該將first(t』)加入到follow(f)中,即follow(f)={},根據規則(3),由於first(t』)包含ε,所以應該將follow(t)加入到follow(f)中,即follow(f)={,+,$,)};
編譯原理FOLLOW集的求法
follow集求法有兩種,要麼逐步推導,推導出所有式子求follow集合,這種方法簡單但是容易遺漏 要麼就按照步驟一步一步來求文字定義 follow a 集合是所有緊跟a之後的終結符或 所組成的集合 是句尾的標誌 稱follow a 是a的隨符集計算所有非終結符號a的follow 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 直到沒...