注:α、β表示符号串
如何求FIRST集
(一)求符号的FISRST集
对于文法G中的任意一个符号X(X属于终结符号和非终结符号),其FISRST(x)的产生如下:
(1),若X属于终结(VT),则FIRST(X)={X}
(2),若X属于非终结符号(VN),且有形如X->a的产生式(a属于非终结符号)或者形如X->ε,
则将a或者ε加入FIRST(X)中
(3),如果文法中有如下的产生式
X->Y1Y2....Yk
① 若Y1属于非终结符号,则把FIRST(Y1)中的一切非ε符号加入FIRST(X)中
②若Y1属于终结符号,则把Y1入到FIRST(X)中
③ 若对于一切2≤i≤k,若Y1Y2....Yk均为非总结符号,
其中存在Yj(1≤j≤i-1),
使得ε∈FIRST(Yj),则将FIRST(Yj)中的一切非ε符号加入FIRST(X)中
④若对于一切1≤i≤k,都有ε∈FIRST(Yi),则将ε加入到FIRST(X)中
(注:③和④对于复杂情况的ε的加入做了探讨)
例:求文法G[E]:
中非终结符号的FIRST集
(二)求符号串的FIRST
对于文法G的任意符号串α=X1X2...Xn,则FIRST(α)的产生如下:
(1)置FIRST(α)=Ø
(2)将FIRST(X1)中的一切非ε符号加入到FIRST(α)中
(3)若ε∈FISRT(X1),将FIRST(X2)中的一切非ε加入到FIRST(α)中
若ε∈FISRT(X1)和ε∈FIRST(X2),将FIRST(X3)中的一切非ε加入到FIRST(α)中
依次类推
(4)若对于一切1≤t≤n,ε∈FIRST(X),则将ε加入FIRST(X)中
例:参考上述题目,求
的FIRST集
如何求FOLLOW集
(1)对于文法开始符号S,令#∈FOLLOW(S)
(2)(重点)看产生式右部:
①若产生式形如A->αBβ的产生式,且β≠ε,则将FIRST(β)中的一起非ε加入到FOLLOW(B)中
②若产生式形如A->αB或者A->αBβ(ε∈FIRST(β))的产生式,
则将FOLLOW(A)中的全部元素加入到FOLLOW(B)中
(3)FOLLOW集中无ε
例如:求文法G[E]:
中非终结符号的的FOLLOW集
如何求SELECT集
对于产生式P->α的可选集(SELECT)产生如下
1 若α不能推出ε,则
SELECT(P->α)=FIRST(α)
2,若α能推出ε,则
SELECT(P->α)=(FIRST(α)-{ε})∪FOLLOW(P)
例:求文法G[S]:
所有产生式的SELECT