求 FIRST集,FOLLOW集,FIRSTVT 集和 LASTVT 集

FIRST 集的定義
簡單的說 FIRST 集就是一個文法符號串的開始符號集合

設 G=(VT,VN,S,P)是上下文無關文法,
FIRST(α)={a|α=>aβ,a∈VT,α,β∈v*}
若 α=> ε(經過0或多步推導可以推出爲空串),則規定 ε ∈ FIRST(α)

FIRST(α) 是 α 的所有可能推導的開頭終結符或可能的 ε。

例題 4.3:求 FIRST 集
題目:

給定文法 G[S]:
(1)S -> Af
(2)S -> Be
(3)A -> a
(4)A -> cA
(5)B -> b
(6)B -> dB


詳解:
求(1)中的 Af 的 FIRST 集,注意,因爲如果推出爲空時用 ε,所以 A 後面的 f 是沒用的,我們只分析 A 的第一個終結符的集。
因爲(3)和(4)都是由 A 推導,所以兩個都考慮
FIRST(Af) = FIRST(a) ∪ FIRST(cA) = {a,c}

同理可求出:
FIRST(Be)
FIRST(a)
FIRST(cA)
FIRST(dB)

(三)關於 FOLLOW 集 - 後隨集
如果僅適用 FIRST 只能根據首字符不同選擇產生式,如果首字符不同…

FOLLOW 集的定義
簡單的說 FOLLOW 集就是一個文法符號的後跟終結符號的集合。

設 G =(VT,VN,S,P)是上下文無關文法,A∈VN,S是開始符號。
FOLLOW(A)={a|S=>*…Aa…,a ∈VT}
若有 S=>*…A(就是說 A 已經是最後一個時,沒有後面的),則規定 # ∈ FOLLOW(A)

FOLLOW(A) 是所有出現在緊接 A 之後的終結符或 “#”;

FOLLOW 計算規則
(1) 對於文法的開始符號 S,置 # 到 FOLLOW(S) 中;
(2)若 A -> αBaβ 是一個產生式,a 爲終結符,則把 a 加至 FOLLOW(B) 中;
(3)若 A -> αBβ 是一個產生式,則把 FIRST(β) - {ε} 加至 FOLLOW(B) 中;
(4)若 A -> αB 是一個產生式,或 A -> αBβ 是一個產生式,而 β =*> ε,
則把 FOLLOW(A) 加至 FOLLOW(B) 中

提示:
(1)就是說如果對開始符號求 FOLLOW(S) ,直接來個 # ∈FOLLOW(S) ,不過要表示成 {#}
(2)就是把後面的緊跟的終結符,就直接加到 FOLLOW 集
(3)正經的求 B 的 FOLLOW 集,就是 B 後面 β 的 FIRST(β) - {ε}
(4)分情況:

如果 A -> αB,就把 FOLLOW(A) 加至 FOLLOW(B) 中
A -> αBβ 是一個產生式,此時 β 可以推成 ε,就是相當於也能推出 A -> αB,也把 FOLLOW(A) 加至 FOLLOW(B) 中
注意: (4)中這裏是 FOLLOW(A) 加至 FOLLOW(B) ,就是左部的 FOLLOW 集,加到其推導出的右部的最後一個非終結符的 FOLLOW 集,
例如:需要識別輸入符號串 :bsAcD,求 FOLLOW(B) 的時候
此時 FOLLOW(A) 就含有 c,如果 A -> dB,即此時 FOLLOW(B) 也應該有 c

記憶方式:
提示:這是規則,不是求某個固定誰的 FOLLOW 集,而涉及多個非終結符的 FOLLOW 集,所以建議對每個產生式對這 4 個規則都要考慮,不然很容易漏。
規則(1)看左側爲開始符;
規則(2)右側看 B 後是否緊跟終結符;
規則(3)右側看 B 後緊跟的是否有非終結符
規則(4)右側看 B 是不是最後一個,或 B 後面的可以推出空串,間接最後一個

例題 4.4:求 FOLLOW 集
題目:

給定文法 G[S]:
(1)S -> eT|RT
(2)T -> DR|ε
(3)R -> dR|ε
(4)D -> a|bd

詳解:
計算時,要同時考慮四個規則是否滿足,就是都要考慮
對產生式(1):

1.滿足規則(1),因爲 S 是開始符號,可以得到 FOLLOW(S) = {#}
2.不滿足規則(2)
3.滿足規則(3),對 S -> RT,應把 FIRST(T) - {ε} = {a,b} 加到 FOLLOW(R);
4.滿足規則(4),將 FOLLOW(S)={#} 加到 FOLLOW(T)
對產生式(2):

1.不滿足規則(1)
2.不滿足規則(2)
3.滿足規則(3),對 T -> DR,應把 FIRST® - {ε} = {d} 加到 FOLLOW(D);
4.滿足規則(4),將 FOLLOW(T)={#} 加到 FOLLOW(R)
對產生式(3):

1.不滿足規則(1)
2.不滿足規則(2)
3.不滿足規則(3)
4.不滿足規則(4),前後 R 和 R 一樣不用加
對產生式(4):

1.不滿足規則(1)
2.不滿足規則(2)
3.不滿足規則(3)
4.不滿足規則(4)
最終結果:

FOLLOW(S) = {#}
FOLLOW(T) = {#}
FOLLOW(R) = {a, b, #}
FOLLOW(D) = {d, #}
 

 

 

FIRSTVT(T)    
LASTVT(T) 

表示及含義:

FIRSTVT(T)    非終結符T的最左終結符集合
LASTVT(T)    非終結符T的最右終結符集合
定義:

定義解釋:

FIRSTVT(T)    非終結符T經過1步或多步推導,得到的最左端終結符,以及左端第二個終結符的集合
LASTVT(T)    非終結符T經過1步或多步推導,得到的最右端終結符,以及倒數第二個終結符的集合
求 FIRSTVT 集的步驟:

(1)若有產生式 T→a 或者 T→Ra…,則 a ∈ FIRSTVT(T)

(2)若 a ∈ FIRSTVT®,且有產生式 T→R…,則 a ∈ FIRSTVT(T)

​ 就是說如果 a 是非終結符 R 的 FIRSTVT 集,且 T 可以推出以非終結 R 帶頭的右部,則 a 也是非終結符 T 的 FIRSTVT 集。

​ 注: 省略號 … 可以爲空,就是沒有

求 LASTVT 集的步驟:

(1)若有產生式 T→…a 或者 T→…aR,則 a ∈ LASTVT(T)

(2)若 a ∈ LASTVT®,且有產生式 T→…R,則 a ∈ LASTVT(T)

例題:

已給文法:
G[S]:
S→a|b|(B)
A→S, A|S
B→A

求所有非終結符的 FIRSTVT,LASTVT 集

解析:
(1)只要是讓求 FIRSTVT,LASTVT 集,則該文法就隱含條件爲算符優先文法。

(2)算符優先文法的特點是:不會出現兩個相鄰的非終結符,即兩個非終結符中間夾着一個終結符。如果第一個是終結符則第二個是非終結符。

結果:

FIRSTVT 集    LASTVT 集
S    {a, b, ( }    {a, b, ) }
A    {a, b, (, 逗號 }    {a, b, ), 逗號}
B    {a, b, (, 逗號 }    {a, b, ), 逗號}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章