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’) = {+,*,) ,#}