A∈VN

,有

FOLLOW(A)={a|S⟹∗⋅⋅⋅Aa⋅⋅⋅,a∈VT}

S⟹∗⋅⋅⋅A

,则规定

#∈FOLLOW(A)

这里用#作为输入串的结束符,也称为输入串括号。

因此对于每一文法符号

A∈VN

,实际上求

FOLLOW(A)

就是考察A在产生式右端的出现情况,哪些终结符号可以跟随在A后面?

使用下列规则,直至每个FOLLOW集不再增大为止:

首先,设S为文法的开始符号,把

{#}

加入

FOLLOW(S)

中(这里#为句子括号)若

B→αAβ

是一个产生式,则

FIRST(β)−{ε}⊆FOLLOW(A)

如果

B→αA

或者

B→αAβ

β⟹∗ε

,则

FOLLOW(B)⊆FOLLOW(A)

解释: 因为在推导过程中可能出现如下的句型序列:

S⇒∗⋅⋅⋅α1Bβ1⋅⋅⋅⇒⋅⋅⋅α1αAββ1⋅⋅⋅⇒⋅⋅⋅α1αAβ1⋅⋅⋅

例题:

A→BCc | gDB

B→bCDE | ε

C→DaB | ca

D→dD | ε

E→gAf | c

非终结符FIRSTFOLLOWA{a, b, c, d, g}{f, #}B{b,

ε

}{a, c, d, g, f, #}C{a, c, d}{c, d, g}D{d,

ε

}{a, b, c, g, f, #}E{c, g}{a, c, d, g, f, #}

对于FIRST集合,解释其中的FIRST(A)的求解。

A→BCc

属于上述产生式的特例情况,很显然

B⇒∗ε,C⇏∗ε

,因此

(FIRST(B)−{ε})⋃FIRST(C)⊆FIRST(A)

A→gDB

属于上述产生式的第二种情况,因此

g∈FIRST(A)

最后得出:

FIRST(A)=(FIRST(B)−{ε})⋃FIRST(C)⋃{g}

FIRST(B)={b,ε},FIRST(C)={a,c,d}

FIRST(A)={a,b,c,d,g}

对于FOLLOW集合,有如下的计算情况:

FOLLOW(A)=(FIRST(f)−{ε})⋃{#}={f,#}

FOLLOW(B) =(FIRST(Cc)−{ε})⋃FOLLOW(A)⋃FOLLOW(C)={a,c,d}⋃{f,#}⋃FOLLOW(C)={a,c,d}⋃{f,#}⋃{c,d,g}={a,c,d,g,f,#}

FOLLOW(C) =(FIRST(c)−{ε})⋃(FIRST(DE)−{ε})={c}⋃(FIRST(D)−{ε})⋃FIRST(E)={c,d,g}

FOLLOW(D) =(FIRST(B)−{ε})⋃FOLLOW(A)⋃(FIRST(E)−{ε})⋃(FIRST(aB)−{ε})={b}⋃{f,#}⋃{c,g}⋃{a}={a,b,c,g,f,#}

FOLLOW(E) =FOLLOW(B)={a,c,d,g,f,#}

3.为什么要引入SELECT集的概念?

由于从2中我们得出结论: 当某一非终结符的产生式中含有空产生式时,它的非空产生式右部的开始符号集两两不相交,并与在推导过程中紧跟该非终结符右部可能出现的终结符集也不相交,则仍可构造确定的自顶向下分析。 因此当文法中含有形如:

A→αA→β

的产生式时,其中

A∈VN,α、β∈V∗

,若

α

β

不能同时推导出空,假定

α⇏∗ε,β⇒∗ε

,则当

FIRST(α)⋂FOLLOW(A)=∅ FIRST(β)⋂FOLLOW(A)=∅

也即是

FIRST(α)⋂(FIRST(β)⋃FOLLOW(A))=∅

时,对于非终结符A的替换仍可唯一地确定候选。为了表示和分析方便,因此引入了SELECT集合。

SELECT集合定义如下:

一个产生式的选择符号集SELECT。给定上下文无关文法的产生式

A→α,A∈VN,α∈V∗

,若

α⇏∗ε

,则

SELECT(A→α)=FIRST(α)

如果

α⇒∗ε

,则

SELECT(A→α)=(FIRST(α)−{ε})⋃FOLLOW(A)

因此一个上下文无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式,

A→α,A→β

,满足

SELECT(A→α)⋂SELECT(A→β)=∅

其中

α、β

不同时能

⇒∗ε

再次回到上述例题

A→BCc | gDB

B→bCDE | ε

C→DaB | ca

D→dD | ε

E→gAf | c

非终结符FIRSTFOLLOWA{a, b, c, d, g}{f, #}B{b,

ε

}{a, c, d, g, f, #}C{a, c, d}{c, d, g}D{d,

ε

}{a, b, c, g, f, #}E{c, g}{a, c, d, g, f, #}

右部产生式FIRSTBCc{a, b, c, d}gDB{ g }bCDE{ b }

ε

{

ε

}DaB{a, d}ca{ c }dD{ d }gAf{ g }c{ c }

因此根据以上所求得的FIRST集和FOLLOW集,可求得各产生式的SELECT集合如下:

SELECT(A→BCc)={a,b,c,d}SELECT(A→gDB)={g}SELECT(B→bCDE)={b}SELECT(B→ε)={a,c,d,g,f,#}SELECT(C→DaB)={a,d}SELECT(C→ca)={c}SELECT(D→dD)={d}SELECT(D→ε)={a,b,c,g,f,#}SELECT(E→gAf)={g}SELECT(E→c)={c}

由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。