first集合意義明確,求解直觀,不再贅述
先給出偽碼:
//init
foreach(nonterminal n)
follow(n) = {}
//開始符號s
follow(s) =
while(somw set is changing)
foreach (production p: n->β1 ... βn)
temp = follow(n)
foreach (βi from βn downto β1)
if(βi == a...)
temp =
if(βi == m...)
follow(m) ∪= temp
if(m is not nullable)
temp = first(m)
else
temp ∪= first(m)
為什麼這樣做呢?
因為如果有n->β1 …βn-2 βn-1βn
注意上述推導都是逆序遍歷每乙個產生式。
還是不懂?沒關係,我們來看乙個例子,直觀的感受一下這個演算法。
設有文法g[s]
s
−>aa
−>ba
′a′=
>ib
a′∣ϵ
b−
>cb
′b′−
>+c
b′∣ϵ
c−
>)a
∗∣
(s->a\\a->ba'\\a'=>iba'|ϵ\\b->cb'\\b'->+cb'|ϵ\\c->)a*|(
s−>aa
−>ba
′a′=
>ib
a′∣ϵ
b−>cb
′b′−
>+c
b′∣ϵ
c−>)a
∗∣(
求每個非終結符follow集
first(s)=
first(a)=
first(a』)=
first(b)=
first(b』)=
開始求解follow集:
第一次遍歷
第二次遍歷
第三次遍歷(沒有變化,演算法終止)
follow(s)
follow(a)
follow(a』)
follow(b)
follow(b』)
first集和follow集的計算
計算first集 根據定義計算 對每一文法符號x v 計算first x a 若x vt,則first x b 若x vn,且有產生式x a a vt,則 a first x c 若x vn,x 則 first x d 若x,y1,y2,yn都 vn,且有產生式x y1 y2 yn 當y1 y2 y...
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 a 1 如果產生式右部第乙個就是終結符,那麼這個終結符屬於first a 例子 a ab a c first a 分析 右部的第乙個產生式分別是a,c 2 如果產生式右部第乙個是非終結符,那麼就找以這個非終結符為產生式左部的產生式,直到找到產生式右部以終結符開頭,那...