FIRST 和 FOLLOW求解

(一)FIRST集合

概念:FIRST(α)定义为可以从α推导得到的串的首符号的串的集合。换言之,就是由非终结符推出的所有的开头符号(终结符)或者是ε,即如果α=*=>ε,那么ε也在FIRST(α)中.

1.FIRST的计算方法

  1. 计算单个文法符号X的FIRST(X)时,不断应用以下规则,直到没有新的终结符或者是ε加入。
    (1)如果X是终结符号,那么FIRST(X)={X}
    (2)如果X是非终结符号,且X->ε是一个产生式,那么ε在FIRST(X)中。
    (3)如果X是非终结符号,且X->Y1Y2…Yk是产生式
    —如果ε在FIRST(Y1), FIRST(Y2),…, FIRST(Y i-1)中,那么FIRST(Yi)中的非ε元素,也在FIRST(X)中。
    —如果ε在FIRST(Y1), FIRST(Y2),…, FIRST(Yk)中,那么ε在FIRST(X)中。(PS:注意这里是k,也就是说要所有都推出 ε 才能说明 ε 在FIRST(X))

理解(3)中的两条规则,第一条如果ε在FIRST(Y1), FIRST(Y2),…, FIRST(Y i-1)中,那么我们根据规则(1)可以知道Y1->ε,Y1->ε…Y(i-1)->ε,所以X->Yi 所以那么FIRST(Yi)中的非ε元素,也在FIRST(X)中;同理对于第二条根据规则(1)可以知道Y1->ε,Y1->ε…Yk->ε,所以可以推出X->ε,所以ε在FIRST(X)中。

  1. 计算FIRST(X1X2…Xn)的方法
    (1)向集合中加入FIRST(X1)中所有非ε的符号;
    (2)如果ε在FIRST(X1)中,再加入FIRST(X2)中的所有非ε的符号;
    (3)…
    (4)如果**ε在所有的FIRST(Xi)**中,将ε加入FIRST(X1X2…Xn)中。
    注意:此处说的是所有

2.求FIRST集合的例子
S→ABc
A→a|ε
B→b|ε
则:FIRST(A)={a,ε},FIRST(B)={b,ε}
由于从S可以推得aBc,bc,c,故FIRST(S)={a,b,c}

(二)FOLLOW集合

对于非终结符A,FOLLOW(A)被定义为在某些句型中紧跟在A右边的终结符。

1.计算FOLLOW集合算法

  1. 将右端结束标记 $ 放到FOLLOW(S)中,S是开始符号。
  2. 按下面的两个规则不断迭代,直到没有新的终结符或者是ε加入。
    ①如果存在产生式A->αBβ,那么FIRST(β)-{ε}【表示除了ε之外的符号】的符号都在FOLLOW(B)中。
    ②如果存在产生式A->αB,或者A->αBβ且FIRST(β)包含ε,那么FOLLOW(A)中所有符号都加入到FOLLOW(B)中。
    如:对于产生式 A -> BC,求FOLLOW(B).
    ① FOLLOW(B) += FIRST© - {ε},
    ② 如果 ε ∈ FIRST©,FOLLOW(B) += FOLLOW(A)
    ③ FOLLOW(B) = ① + ②
    如:S->r1 A r2, A -> αB;
    则S->r1 αB r2;

2.关键点
①在产生式的右边找非终结符,如果求FOLLOW(A),则找右边含有A的产生式
②看后面的串
3.例子
文法
(1)E->TE’ (2)E’->+TE’ | ε
(3)T -> FT’ (4)T’->*FT’ | ε (5)F->(E) | id
①首先求得各个文法符号的FIRST集合如下:
FIRST(E) = FIRST(T) = FIRST(F) = {(,id};
FIRST(E’) = {+,ε}; FIRST(T’) = { * ,ε};
因为T只有一个产生式,而该产生式的体以F开头,又因为F的两个产生式都是以终结符开头且不能推导出ε,所以FIRST(T) = FIRST(F),FIRST(E)也同理。
②接下来我们求FOLLOW集合:
Ⅰ:FOLLOW(E) = {$,)}
#因为E是开始符号,所以 结束标记 $ 要加进来,看(5)产生式,把)加进来。
Ⅱ:FOLLOW(T) = FOLLOW(T’) = {+, $ ,)}
#在产生式的右边找终结符,看(1)E->TE’ 可知FIRST(E’)-{ε}-> FOLLOW(T)中;且FIRST(E’) 包含ε,因此FOLLOW(E)ㄈFOLLOW(T)中。
#因为T’只出现在T产生式的尾部,所以FOLLOW(T) = FOLLOW(T’)
Ⅲ:FOLLOW(E’ )= FOLLOW(E) ={ $ ,)}
##因为E’只出现在E产生式的尾部,所以FOLLOW(E’) = FOLLOW(E)
Ⅳ:FOLLOW(F) = { * ,+, $ ,)};
#F的产生式体(3)T -> FT’ (4)T’->*FT’ | ε 中只有T’跟在后面,因此FIRST(T’)-{ε}的所有符号都在FOLLOW(F)中,即+好。
#由T -> FT’得FOLLOW(F)包含FOLLOW(T)。
4.FIRST集合和FOLLOW集合
①FIRST集合 集合元素是终结符和ε。
②FOLLOW集合 集合元素是终结符。
③求FOLLOW集合之前要先求FIRST集合。

你可能感兴趣的:(编译原理)