FOLLOW集的不動點演算法

2021-10-05 19:37:37 字數 1226 閱讀 3018

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 如果產生式右部第乙個是非終結符,那麼就找以這個非終結符為產生式左部的產生式,直到找到產生式右部以終結符開頭,那...