FIRST集合求法
- FIRST集的定义
定义:令X 为一个文法符号(一个终结符或非终结符)或ε,则集合First (X) 由从X可能推导出的所有终结符号串的开头终结符组成,此外可能还有ε,它的定义如下:
(1)若X 是终结符或ε,则First (X) = {X}。
(2)若X 是非终结符,则对于每个产生式X→X1X2. . . Xn ,First (X)都包含了First(X1) - {ε}。
若对于某个i < n ,所有的集合First (X1), . . . , First (Xi) 都包括了。则First (X) 也包括了First (X i + 1 ) -{ε}。若所有集合First (X1), . . . , First (Xn)包括了ε,则First (X)也包括ε。
现在为任意串a = X1 X2 . . . Xn (终结符和非终结符的串)定义First (a),如下所示:First (a)包括First (X1) 对于每个i = 2, . . . , n ,如果对于所有的k = 1, . . . ,i -1 ,First (Xk) 包括了ε,则First (a)就包括了First (Xi)。最后,如果对于所有的i =1, . . . , n ,First (Xi) 都包括了ε,则First (a)也包括了ε。
- FIRST集的作用
First(A)集的作用是标示在替换非终结符A的时候,替换后的文法的首字母集合,语法分析程序根据这个来判断给定的语言是否是合法的,是符合规则的。 - FIRST 集求法
利用定义计算,具体步骤如下:
(1) 若X ∈ Vt,则FIRST(X) = {X}。(即定义1)
(2)若X ∈ Vn,且有产生式X → a……, a ∈ Vt,则a ∈ FIRST(X) (非终结符,将首个终结符加入First集)
(3)若X ∈ VN,X → ε,则 ε ∈ FIRST(X) (直接推导)
(4)若X→Y1,Y2,……,Yn ∈ Vn,而有产生式X → Y1,Y2,……,Yn。当Y1,Y2,……,Y(i-1) 直接推出ε时,则FIRST(Y1) - ε, FIRST(Y2) - ε, …… , FIRST(Y(i-1) - ε) ,FIRST(Yi) 都包含在FIRST(X)中(无ε)
(5)当(4)中所有Yi 都推出 ε时,则最后的FIRST(X) = FIRST(Y1) ∪ FIRST(Y2) ∪ …… ∪ FIRST(Yn) ∪ {ε}
反复运用(2)-(5)步骤计算,直到每个符号的FIRST集合不再增大为止
例如:文法:
S→ABc
A→a|ε
B→b|ε
解:
FIRST(A)={a,ε}
FIRST(B)={b,ε}
FIRST(S)={a,b,c}
-
技巧:
First一般从下往上找。
如果要找A的First,我们要找A的定义式,即A在左边的式子,看着他的右边来找。 -
例题
文法G[A]
A→BCc|gDB
B→bCDE|ε
C→DaB|ca
D→dD|ε
E→gAf|c
FIRST(A)=FIRST(BCc)∪FISRT(gDB)
=(FIRST(B)-{ε})∪FIRST(Cc)∪{g}
={b,d,a,c,g}FIRST(B)=FIRST(bCDE)∪FIRST(ε)
={b,ε}
FIRST( C)=FIRST(DaB)∪FIRST(ca)
=FIRST(dDaB)∪FIRST(aB)∪{c}
={d,a,c}FIRST(D)=FIRST(dD)∪FIRST(ε) ={d,ε}
FIRST(E)=FIRST(gAf)∪FIRST( c )={g,c}