FIRST集合
定义
令G是一个不含左递归的文法,对G的所有非终结符的每个候选a定义它的终结首符集FIRST(a)为:
FIRST(α) = { a│α ⇒∗ a…, a∈VT }
若α ⇒∗ ε ,则规定ε∈FIRST(α)。
FIRST(α)被定义为从α推导得到的句子的首符号的集合,α是任意的文法符号串。
n非终结符的FISRT集合中有空串与该非终结符属于NULLABLE集合等价。
FIRST集合构造
构造每个文法符号的FIRST集合
第一种说明:
对于文法G的每个文法符号X∈VT∪VN:
- 若 X ∈ VT,则 FIRST(X) = { X }
- 若 X ∈ NULLABLE,则把 ε 加入FIRST(X)
- 若 X ∈ VN,且 X → a…, a ∈ VT,则把a加入到FIRST(X)中
- 若 X ∈ VN,且 X → Y…, Y ∈ VN,则把FIRST(Y) - {ε}加到FIRST(X)中
- 若 X →Y1Y2 … Yi , 且 Y1, Y2, … ,Yi-1 ∈ nullable,则把 FIRST(Yi) - {ε}加到FIRST(X)中
- 若 FIRST(Ym) ∈ NULLABLE(1<=m<=i),则ε∈FIRST(X)
第二种说明:
对每一X∈VT∪VN,连续使用下面的规则,直至每个集合FIRST不再增大为止:
- 若X ∈ VT,则FIRST(X)={X}。
- 若X ∈ VN,且有产生式X→a…,则把a加入到FIRST(X)中;若X→ε也是一条产生式,则把 ε 也加到FIRST(X)中。
- 若X→Y…是一个产生式且Y ∈ VN,则把FIRST(Y)中的所有非 ε- 元素都加到FIRST(X)中;若X→Y1Y2…Yi-1Yi…Yk是一个产生式,Y1,…,Yi-1都是非终结符,对于任何j,1<=j<=i-1,FIRST(Yj)都含有 ε (即Y1…Yi-1 ⇒∗ε), 则把FIRST(Yi)中的所有非 ε-元素都加到FIRST(X)中;若所有的FIRST(Yj)均含有 ε,j=1,2,…,k,则把 ε 加到FIRST(X)中。
如果上面两个构造方法看不懂也不要紧,我们大白话讲一下
第三种说明(这种比较好理解):
对于 X -> ... 这条产生式而言,
- 若右边第一个符号是终结符或 ε ,则直接将其加入 FIRST(X)
- 若右边第一个符号是非终结符,则将其 FIRST 集的的非 ε 元素加入 FIRST(X)
- 若右边第一个符号是非终结符而且紧随其后的是很多个非终结符,这个时候就要注意是否有 ε 。
- 若第 i 个非终结符的 FIRST 集有 ε ,则可将第 i+1 个非终结符去除 ε 的 FIRST 集加入 FIRST(X)。
- 若所有的非终结符都能够推导出 ε ,则将 ε 也加入到 FIRST(X)
以上三种说明大致意思都是相同的
例题
文法G:
E → TE'
E' → +TE'│ε
T → FT'
T' → *FT'│ε
F → (E)│i
求每个非终结符号的FIRST集合
这是一道非常经典的例题,下面我们一起来看一下
因为FIRST集合是要不断重复进行的,我们可以多次循环构造它(以下均使用第三种说明)
第一次循环
//E的产生式紧跟的是两个非终结符,根据构造法第二条,FIRST(E)=FIRST(T),而FIRST(T)我们还没求出来,所以我们这项暂时为空
FIRST(E) = { }
//E'的产生式紧跟的是非终结符+,根据构造法第一条,将其加入到FIRST(E')中,产生式中还可以推导出ε,将ε也加入到FIRST(E')中
FIRST(E') = {+,ε}
//T的产生式紧跟的是FT'两个非终结符,根据构造法第二条,FIRST(T)=FIRST(F),而FIRST(T)我们还没求出来,所以我们这项暂时为空
FIRST(T) = { }
//T'的产生式紧跟的是非终结符*,根据构造法第一条,将其加入到FIRST(T')中,产生式中还可以推导出ε,将ε也加入到FIRST(T')中
FIRST(T') = {*,ε}
//F的产生式紧跟的是非终结符(,根据构造法第一条,将其加入到FIRST(T')中,产生式中还可以推导出i,将i也加入到FIRST(F)中
FIRST(F) = {(, i}
//第一次循环之后,有FIRST集合发生改变,再次循环,直到所有FIRST集合不发生改变为止
第二次循环
FIRST(E) = { } //没有得到FIRST(T),依旧不能得到FIRST(E),所以为空
FIRST(E') = {+,ε} //不变
FIRST(T) = {(, i}
//T的产生式紧跟的是非终结符F,根据构造法第二条,将FIRST(F)中的元素加入到FIRST(T)中
FIRST(T') = {*,ε} //不变
FIRST(T) = {(, i} //不变
//第二次循环之后,FIRST集合发生变化,再次循环
第三次循环
FIRST(E) = {(, i} //根据构造法第二条,将将FIRST(T)中的元素加入到FIRST(E)中
FIRST(E') = {+,ε} //不变
FIRST(T) = {(, i} //不变
FIRST(T') = {*,ε} //不变
FIRST(T) = {(, i} //不变
//第三次循环之后,FIRST集合发生改变,接着循环
第四次循环
FIRST(E) = {(, i}
FIRST(E') = {+,ε}
FIRST(T) = {(, i}
FIRST(T') = {*,ε}
FIRST(T) = {(, i}
所有FIRST集合都不改变,完成FIRST集合的构造
构造任意符号串的FIRST集合
对文法G的任何符号串α=X1X2…Xn构造集合FIRST(α)
FIRST(α)={ a│α⇒∗ a…, a∈VT }
α = X, X∈VT∪VN
α = X1X2…Xn, X∈VT∪VN
1. 置FIRST(α)=FIRST(X1) \ {ε};
2. 若对任何1<=j<=i-1,ε∈FIRST(Xj),则把FIRST(Xi) \ {ε}加至FIRST(α)中;特别是,若所有的FIRST(Xj)均含有ε,1<=j<=n,则把ε 也加至FIRST(α)中。显然,若α=ε则FIRST(α)={ ε }。
如果能理解上面对文法符号的构造,对任意符号串的构造就很好理解了
如有错误,欢迎指正!