Vt是终结符集,Vn是非终结符集,P为产生式集,S为开始的非终结符。(书上一般大写的是非终结符,小写是终结符)
以下的定义可直接不看,书上太抽象,又啰嗦,直接看红字。
定义:设G=(Vt,Vn,P,S)是上下文无关文法。
FIRST(a)={a|a=>*ab,a∈VT, a,b∈V*}
若a=>*ε则规定ε∈FIRST (a)。称FIRST(a)为a的开始符号集或首符号集。
First(a)集就是求从a出发推导出所有开头的 终结符 构成的集合。
S => aB B => b 那么First(S) = {a};因为B只能推出终结符 b ,S => ab,所以它的首个开始符号为{a}
考虑以下情况,
S => AB
A => a
A => ε
B => b
b => ε 那么此时First(S) = {a,b,ε},因为A有可能推出 {a,ε} ,当推出ε时,导致 S => B,此时B又可以推出 {b,ε} ,所以最终
First(S) = {a,b,ε}
正式计算First集的语言描述如下:
- 若 X∈Vt,则FIRST(X)={X}。
- 若X∈Vn,且有产生式 X→a……(a∈Vt),则 a ∈ First(X)。
- 若X∈Vn,X => ε ,则 ε ∈ First(X)。
- 设G中有形如X→Y1…Yk的产生式,其中 X,Y1…Yk∈Vn,且 Y1…Yi-1 均能 =>*ε(1≤i≤k),则FIRST(Y1)-{ε},…, FIRST(Yi-1)-{ε},FIRST(Yi) 都包含在FIRST(X)中。
- 若对一切1≤i≤k,均有ε∈FIRST(Yi),则将ε符号加进FIRST(X)。
简单来说,
(1)如果是求的是终结符的First的集,那结果就是它本身;
(2)如果求非终结符的First集,就看它的产生式的首个符号是不是终结符,
(2.1)如果是该符号就是所求First集的一员;
(2.2)如果不是,那它就是非终结符,记为K,递归(2)重复上述步骤(非终结符推出空串的情况先不考虑);
(3)如果(2)中的 K 能推出 ε ,那么 ε 也要加入First集中。