对预测分析中FIRST和FOLLOW集合的理解

一、FIRST和FOLLOW的含义

  • FIRST(α):可以从α推导得到的串的首符号的集合。其中α是任意的文法符号,FIRST集合中的符号是终结符号
  • FOLLOW(A):可能在某些句型中紧跟在A右边的终结符号的集合。其中A是非终结符号

二、FIRST和FOLLOW的求法

①FIRST

不断应用下列规则,直到没有新的终结符号或者 ϵ \epsilon ϵ可以加入到任何FIRST集合中为止。

  • 如果X是一个终结符号,那么FIRST(X)=X;
  • 如果 X→ε是一个产生式,那么将ε加入到FIRST(X)中;
  • 如果X是一个非终结符号,且X→Y1Y2…Yk是一个产生式,其中k≥1,那么:(1).如果对于某个i,a在FIRST(Yi)中且 ϵ \epsilon ϵ在所有的FIRST(Y)、FIRST(Y)… FIRST(Yi-1)中,就把a加入到FIRST(X)中(也就是Y1…Yi-1    ⟹    \implies ϵ \epsilon ϵ,即只要Yi前面有可能推出 ϵ \epsilon ϵ就应加入); (2).如果对于所有的j=1,2 … \dots k, ϵ \epsilon ϵ在FIRST(Yj)中,那么将 ϵ \epsilon ϵ加入到FIRST(X)中
②FOLLOW

不断应用下列规则,直到没有新的终结符号可以加入到任意FOLLOW集合中为止。

  • 将$放到FOLLOW(S)中,其中S是开始符号,而$是输入右端的结束标记
  • 如果存在一个产生式A → α \to\alpha αB β \beta β,那么FIRST( β \beta β)中除 ϵ \epsilon ϵ之外的所有符号都在FOLLOW(B)中
  • 如果存在一个产生式A → α \to\alpha αB,或者存在产生式A → α \to\alpha αB β \beta β且FIRST( β \beta β)包含空,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中
③求解顺序
  • 对于FIRST集合,先求文法层次较低的非终结符,再求较高的
  • 对于FOLLOW集合,先求文法层次较高的非终结符,再求较低的

三、例题

考虑以下非左递归文法:
E → T E ′ E\to TE' ETE
E ′ → + T E ′ ∣ ϵ E' \to +TE' | \epsilon E+TEϵ
T → F T ′ T\to FT' TFT
T ′ → ∗ F T ′ ∣ ϵ T'\to*FT' | \epsilon TFTϵ
F → ( E ) ∣ i d F\to (E)|id F(E)id

FIRST求解如下:

  • FIRST(F)={ ( , i d id id },先求语法层次低的非终结符号
  • FIRST(T ′ ' )={ * , ϵ \epsilon ϵ},由第四个产生式直接得到
  • FIRST(T)=FIRST(F)={ ( , i d id id},由第三个产生式知,F(F)中所有符号一定在F(T)中,故先将F(F)加入到F(T)中,因为F不能推导出 ϵ \epsilon ϵ,故不再向F(T)中加入任何符号
  • FIRST( E ′ E' E)={ + , ϵ \epsilon ϵ }
  • FIRST(E)=FIRST(T)={ ( , i d id id }

FOLLOW求解如下:

  • FOLLOW(E)={ ) ,$ },先求层次高的非终结符,因为E是开始符号,因此加入$,同时由第五个产生式知 ) 在其中
  • FOLLOW( E ′ E' E)=FOLLOW(E)={ ) ,$},根据A → α \to\alpha αB这一规则FOLLOW(E)= FOLLOW( E ′ E' E)
  • FOLLOW(T)={ +,) ,$ },T在产生式中出现时,只有 E ′ E' E跟在后面,因此FIRST( E ′ E' E)中除 ϵ \epsilon ϵ外的所有符号都在FOLLOW(T)中,故包含+ ;又因为FIRST( E ′ E' E)包含 ϵ \epsilon ϵ,因此FOLLOW(E)中的所有符号都在FOLLOW(T)中,故包含)和$
  • FOLLOW( T ′ T' T)=FOLLOW(T)={ + ,),$ },由第三个产生式推知
  • FOLLOW(F)={ ) , i d id id ,+ ,* },因为FIRST( T ′ T' T)包含 ϵ \epsilon ϵ,所以FOLLOW(T)中的所有符号都在FOLLOW(F),同时由最后一个产生式得 i d id id和 )
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值