一、FIRST和FOLLOW的含义
- FIRST(α):可以从α推导得到的串的首符号的集合。其中α是任意的文法符号,FIRST集合中的符号是终结符号
- FOLLOW(A):可能在某些句型中紧跟在A右边的终结符号的集合。其中A是非终结符号
二、FIRST和FOLLOW的求法
①FIRST
不断应用下列规则,直到没有新的终结符号或者 ϵ \epsilon ϵ可以加入到任何FIRST集合中为止。
- 如果X是一个终结符号,那么FIRST(X)=X;
- 如果 X→ε是一个产生式,那么将ε加入到FIRST(X)中;
- 如果X是一个非终结符号,且X→Y1Y2…Yk是一个产生式,其中k≥1,那么:(1).如果对于某个i,a在FIRST(Yi)中且 ϵ \epsilon ϵ在所有的FIRST(Y1)、FIRST(Y2)… FIRST(Yi-1)中,就把a加入到FIRST(X)中(也就是Y1…Yi-1    ⟹    \implies ⟹ ϵ \epsilon ϵ,即只要Yi前面有可能推出 ϵ \epsilon ϵ就应加入); (2).如果对于所有的j=1,2 … \dots …k, ϵ \epsilon ϵ在FIRST(Yj)中,那么将 ϵ \epsilon ϵ加入到FIRST(X)中
②FOLLOW
不断应用下列规则,直到没有新的终结符号可以加入到任意FOLLOW集合中为止。
- 将$放到FOLLOW(S)中,其中S是开始符号,而$是输入右端的结束标记
- 如果存在一个产生式A → α \to\alpha →αB β \beta β,那么FIRST( β \beta β)中除 ϵ \epsilon ϵ之外的所有符号都在FOLLOW(B)中
- 如果存在一个产生式A → α \to\alpha →αB,或者存在产生式A → α \to\alpha →αB β \beta β且FIRST( β \beta β)包含空,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中
③求解顺序
- 对于FIRST集合,先求文法层次较低的非终结符,再求较高的
- 对于FOLLOW集合,先求文法层次较高的非终结符,再求较低的
三、例题
考虑以下非左递归文法:
E
→
T
E
′
E\to TE'
E→TE′
E
′
→
+
T
E
′
∣
ϵ
E' \to +TE' | \epsilon
E′→+TE′∣ϵ
T
→
F
T
′
T\to FT'
T→FT′
T
′
→
∗
F
T
′
∣
ϵ
T'\to*FT' | \epsilon
T′→∗FT′∣ϵ
F
→
(
E
)
∣
i
d
F\to (E)|id
F→(E)∣id
FIRST求解如下:
- FIRST(F)={ ( , i d id id },先求语法层次低的非终结符号
- FIRST(T ′ ' ′)={ * , ϵ \epsilon ϵ},由第四个产生式直接得到
- FIRST(T)=FIRST(F)={ ( , i d id id},由第三个产生式知,F(F)中所有符号一定在F(T)中,故先将F(F)加入到F(T)中,因为F不能推导出 ϵ \epsilon ϵ,故不再向F(T)中加入任何符号
- FIRST( E ′ E' E′)={ + , ϵ \epsilon ϵ }
- FIRST(E)=FIRST(T)={ ( , i d id id }
FOLLOW求解如下:
- FOLLOW(E)={ ) ,$ },先求层次高的非终结符,因为E是开始符号,因此加入$,同时由第五个产生式知 ) 在其中
- FOLLOW( E ′ E' E′)=FOLLOW(E)={ ) ,$},根据A → α \to\alpha →αB这一规则FOLLOW(E)= FOLLOW( E ′ E' E′)
- FOLLOW(T)={ +,) ,$ },T在产生式中出现时,只有 E ′ E' E′跟在后面,因此FIRST( E ′ E' E′)中除 ϵ \epsilon ϵ外的所有符号都在FOLLOW(T)中,故包含+ ;又因为FIRST( E ′ E' E′)包含 ϵ \epsilon ϵ,因此FOLLOW(E)中的所有符号都在FOLLOW(T)中,故包含)和$
- FOLLOW( T ′ T' T′)=FOLLOW(T)={ + ,),$ },由第三个产生式推知
- FOLLOW(F)={ ) , i d id id ,+ ,* },因为FIRST( T ′ T' T′)包含 ϵ \epsilon ϵ,所以FOLLOW(T)中的所有符号都在FOLLOW(F),同时由最后一个产生式得 i d id id和 )