龍書算法:
First:
(1)、如果X是終結符,那么First(X) = X;
(2)、如果X是非終結符,且XàY1Y2......Yk是一個產生式,其中k>=1;那么如果對於某個I, a在First(Yi)中,且#(空串)在所有的First(Y1)…..First(Yi-1)中,就吧a加入到First(X)中。
(3)、如果Xà#(空串)是一個產生式,那么將#加入到First(X)中。
Follow:
(1)、將$放入到Follow(S)中,其中S是開始符號,而$是輸入右端結束的標記。
(2)、如果存在一個產生式AàaBb,那么First(b)中除#(空串)外地所有符號都在Follow(B)中。
(3)、如果存在一個產生式AàaB, 或存在AàaBb且First(b)包含#(空串),那么Follow(A)中的所有符號都在Follow(B)中。
自己理解:
First:(看X的產生式)
(1)、如果X是終結符,那么First(X)= X;
(2)、如果X是非終結符,且XàY1Y2......Yk,i=1;
1)、將First(Yi)加入到First(X)中,
2)、如果#包含着First(Yi)中,i++,重復1);
3)、如果#不包含在First(Yi)中,First(X)計算完成;
(3)、如果Xà#(空串)是一個產生式,那么將#加入到First(X)中。
Follow:(看在右邊有B的產生式)
(1)、將$放入到Follow(S)中,其中S是開始符號,而$是輸入右端結束的標記。
(2)、如果存在一個產生式AàaBb,那么First(b)中除#(空串)外地所有符號都在Follow(B)中。
(3)、如果存在一個產生式AàaB, 或存在AàaBb且First(b)包含#(空串),那么Follow(A)中的所有符號都在Follow(B)中。
實例:
(1) EàTE’ (2)E’à+TE’ |# (3) TàFT’ (4)T’à*FT’|# (5)Fà(E)|id
FIRST(F)={(,id } FIRST(T’)={*,#} FIRST(T)=FIRST(F)={(,id}
FITST(E’)={+,#} FIRST(E)={(,id}
FOLLOW(E)={$,)}
FOLLOW(E’)={$,)}
FOLLOW(T)={+,$,)}
FOLLOW(T’)={+,$,)}
FOLLOW(F)={*,+,$,)}
