FIRST集和FOLLOW集的計算


FIRST集的定義:

設G=(VT,VN,P,S)是上下文無關文法

FIRST(a)={a|a=>ab,a∈VT, a,b∈V}

若a=>*ε則規定ε∈FIRST (a)

FIRST(α)就是從α可能推導出的所有開頭終結符號和可能的ε所構成的集合。

 

FIRST集的計算://用通俗的語言講

1.置FIRST(α)為空

2.遍歷所有產生式左側是α文法的式子如果右側產生式第一位字符為終結符則把該字符放入FIRST(α)集

例子:A->aB,FIRST(A)={a}

3.如果右側產生式第一位字符為非終結符則根據把該字符的FIRST放入FIRST(α)集

例子:A->BC,FIRST(A)=FIRST(B)

4.檢查3.步驟中非終結符的FIRST集有無空字符(ε),若有則把下一個非終結符字符的FIRST集也放入FIRST(α)中

5.重復上述步驟直到所有FIRST集都生成且不再變化

 

例:

E →TE’

E’→+TE’

E’→ε

T →T'F

T’→*FT’

T’→ε

F→(E)|i

 

FIRST(E)=FIRST(T)//FIRST(T)未計算

FIRST(E‘)={+,ε}//步驟2.

FIRST(T)=FIRST(T')∪FIRST(F)//由於T’集合存在ε所以要加上FIRST(F)

FIRST(T')={*,ε}

FIRST(F)={(,i} -> FIRST(E)=FIRST(T)={*,ε,(,i}

 

FOLLOW集定義:

FOLLOW(A)={a| S=>mAb 且a∈FIRST(b),m∈V,b∈V+}

若 S=>uAb, 且b =>ε,則#∈FOLLOW( A)。

 

FOLLOW集的計算://用通俗的語言講

1.對於開始的文法的FOLLOW集加入{#}

例:對於G[S]文法置FOLLOW(S)={#}

2.看產生式左側的符號,如果在產生式右側找到則根據情況進行判斷

如果該符號的右側是最后一位,則把產生式左側的FOLLOW集加入FOLLOW(α)

例:A->Bα,FOLLOW(α)=FOLLOW(A)

如果該符號的下一位是終結符,則把該終結符放入FOLLOW(α)

例:A->αbC,FOLLOW(α)={b}

如果該符號的下一位是非終結符,則把該符號除去空符號(ε)的FIRST集放入FOLLOW(α)

例:A->αBC,FOLLOW(α)=FIRST(B)-{ε}

3.檢查2.步驟中非終結符的FIRST集有無空字符(ε),若有則把下一個字符的進行同2.步驟的判斷直至遇到終結符或者不含空符號的非終結符

5.重復上述步驟直到所有FOLLOW集都生成且不再變化

 

例:

E →TE’

E’→+TE’

E’→ε

T →FT'

T’→*FT’

T’→ε

F→(E)|i

 

FOLLOW(E)={#,)}//步驟1.+最后一個式子

FOLLOW(E')=FOLLOW(E')=FOLLOW(E)={#,)}//第一個式子

FOLLOW(T)=(FIRST(E')-{ε})∪FOLLOW(E')={+,#,)}//第一個式子or第二個式子,由於E'已經是最后一個則加入FOLLOW(E')

FOLLOW(T’)= FOLLOW(T)= {+,) ,#}

FOLLOW(F)={FIRST(T’)-{e}})∪FOLLOW(T’) = {+,*,) ,#}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM