设G=(V T ,V N ,S,P)是一个上下文无关文法。
VT表示终结符,VN表示非终结符。
FIRST集定义如下:
对于α可以有两种表达式:
下面开始构造每个文法符号的FIRST集合
对于每一个X∈VT∪VN,连续使用下面规则,知道每个集合的FIRST不再增大为止:
1.X∈VT,则有FIRST(X)={X}。
2.X∈VN,且有产生式X→а…,则把а加入到FIRST(X)中;若X→ε也是一条产生式,则把ε也加入到FIRST(X)中。
3.①若X→Y…是一个产生式,且有产生式Y∈VN,则把FIRST(Y)中所有的非ε元素都加到FIRST(X)中;
②若X→Y₁Y₂…Yi Yi-₁…Yn是一个产生式,Y₁…Yi-₁都是非终结符;
(1)对于任何j,1≤j≤i-1,FIRST(Yj)都含有ε(即Y₁…Yi-₁⇨*ε,经过多步推导出ε),则把FIRST(Yj)中所有非ε元素都加入到FIRST(X)中
(2)若所有的FIRST(Yj)中都含有ε,j=1,2…n,则把ε加入到FIRST(X)中。
FOLLOW集定义如下:
构造每个非终结符的FOLLOW集:
方法:(⇨*)表示多步推导
1.对于文法的开始符号S,把#加入FOLLOW(S)中;
2.若A→αBβ是一个产生式,则把FIRST(β)–{ε}(去掉ε)加入到FOLLOW(B)中;
证明:
A→αBβ是一个产生式,∀ а∈FIRST(β){ε},有β⇨а…
则有S⇨…A…⇨…αBβ…⇨…αBа…,所以а∈FOLLOW(B)*
3.若A→αB是一个产生式,或则若A→αBβ是一个产生式,而β⇨*ε(β能够经过多步推导出ε;也就是说ε∈FIRST(β)),则把FOLLOW(A)加入到FOLLOW(B)中
证明:
①A→αB是一个产生式,∀ а∈FOLLOW(A),
有S⇨*…Aа…,则会出现S⇨*…Aа…⇨…αBа…
所以а∈FOLLOW(B)
②A→αB是一个产生式,∀ а∈FOLLOW(A),有β⇨ε(β能够经过多步推导出ε)
有S⇨*…Aа…,则会出现S⇨*…Aа…⇨…αBβа…⇨*…αBа…
所以а∈FOLLOW(B)
计算文法各个产生式的可选集—SELECT集
例题:
FIRST集:
FOLLOW集:(求FOLLOW集时需要注意一个表达式可能同时满足A→αBβ或者A→αB或者A→αBβ、β⇨*ε这三种形式,故需要对这三种形式都需要分析)