FIRST集的构造:
计算所有文法符号X的FIRST(X),直到每个FIRST集合不再增大为止.
(1) 若X∈VT,那么FIRST(X)={X}.
(2) 若X→ε是产生式,那么把ε加入FIRST(X).
(3) 如果X是非终结符,且X→Y1Y2…Yk是产生式,若对某个i, a属于FIRST(Yi),并且ε属于所有的FIRST(Y1),FIRST(Y2), …,FIRST(Yi-1),即Y1Y2…Yi-1 ε,则把a加入FIRST(X).如果对所有的j=1,2,…,k, 有ε属于FIRST(Yj),那么把ε加入FIRST(X).
FOLLOW集的构造:
对所有的非终结符A计算FOLLOW(A).应用下面规则,直到每个FOLLOW集不再增大为止.
(1) 把#加入FOLLOW(S),其中S是开始符号,#是输入结束标记.
(2) 如果有产生式A→αBβ,那么除ε外,把FIRST(β)中的所有元素加入FOLLOW(B).
(3) 如果有产生式A→αB,或有产生式A→αBβ且 FIRST(β)含ε,那么,把FOLLOW(A)中的一切元素加入 FOLLOW(B).
栗子:
构造FIRST集:
FIRST(S) = {}
FIRST(M) = {}
FIRST(H) = {}
FIRST(L) = {}
FIRST(K) = {}
把所有在开头的终结符加入到对应的FIRST:
FIRST(S) = {a, }
FIRST(H) = {ε, }
FIRST(K) = {d, ε}√
FIRST(L) = {e}√
FIRST(M) = {b, }
ps:√表示已完成