编译原理之求FIRST集

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集的语言描述如下:

 

  1. 若 X∈Vt,则FIRST(X)={X}。
  2. 若X∈Vn,且有产生式 X→a……(a∈Vt),则 a ∈ First(X)。
  3. 若X∈Vn,X => ε ,则 ε ∈ First(X)。
  4. 设G中有形如X→Y1…Yk的产生式,其中 X,Y1…Yk∈Vn,且 Y1…Yi-1 均能 =>*ε(1≤i≤k),则FIRST(Y1)-{ε},…, FIRST(Yi-1)-{ε},FIRST(Yi) 都包含在FIRST(X)中。
  5. 若对一切1≤i≤k,均有ε∈FIRST(Yi),则将ε符号加进FIRST(X)。

简单来说,

(1)如果是求的是终结符的First的集,那结果就是它本身;

(2)如果求非终结符的First集,就看它的产生式的首个符号是不是终结符,

        (2.1)如果是该符号就是所求First集的一员;

        (2.2)如果不是,那它就是非终结符,记为K,递归(2)重复上述步骤(非终结符推出空串的情况先不考虑);

(3)如果(2)中的 K 能推出 ε ,那么 ε 也要加入First集中。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值