编译原理FOLLOW集的求法

follow集求法有两种,要么逐步推导,推导出所有式子求follow集合,这种方法简单但是容易遗漏
要么就按照步骤一步一步来求
文字定义:FOLLOW(A)集合是所有紧跟A之后的终结符或#所组成的集合(#是句尾的标志),称FOLLOW(A)是A的随符集

下面直接介绍规范的求法(这个文法必须消除左递归和提取公共左因子)

计算所有非终结符号A的follow(A)集合时,不断应用下面的规则,直到再没有新的终结符号可以被加入到任意的follow集合中为止。
注意:当A是最右部的时候,将$加入到follow(A)中

(1)将 $ 放到follow(S)中,其中S是文法的开始符号。

(2)如果存在一个产生式A→αBβ,那么first(β)中除ε之外的所有符号都在follow(B)中。 【 follow(B)是求跟在B后的终结符或$组成的集合,因此对于跟在B后的β,它的first集合就是follow(B)的子集 】

(3)如果存在一个产生式A→αB,或存在产生式A→αBβ且first(β)包含ε,那么follow(A)中的所有符号都在follow(B)中。 【 对于A→αBβ,且β多步推导出ε ,那么可以用αB替换A, B后面紧跟的字符就是A后面紧跟的字符】


下面举个例子来按照这种方法求FOLLOW

文法如下:

  1. E -> TE’
  2. E’ -> +TE’ | ε
  3. T -> FT’
  4. T’ -> *FT’ | ε
  5. F -> (E) | id

直接给出First集
first(E) = first(T) = first(F) = { ( , id }
first(E’) = {+, ε}
first(T’) = {*, ε}

FOLLOW E
E是文法的开始符号,根据规则 (1) 将$加入到 follow(E), follow(E) = { $ }, 
再根据规则(2)和产生式 5) 加入, 所以 follow(E) = {$, )}
FOLLOW E’
根据产生式 1 , E'是结尾符号,所以将$加入follow(E’), 根据规则 (3) 和产生式 1,可知,将
follow(E) 加入到 follow(E‘)中 ,所以 follow(E') = {$, )}
FOLLOW T
 根据产生式 1 和 规则(2) ,first(E') - {ε}加入到follow(T)中,follow(T) = {+} , 
 再根据产生式 1 和规则(3),follow(E)加入到follow(T)中,所以follow(T) = {+, ), $}
FOLLOW T’
根据产生式 3 因为T'出现在最右部,所以{$}加入follow(T‘)中,再根据规则(3)和产生式3,
将follow(T)加入到follow(T’)中,所以follow(T') = {+, ), $}
FOLLOW F
① 根据产生式 3 和规则 (2),first(T')-{ε}加入到follow(F)中,follow(F) = {*}
② 产生式 3 和 规则 (3) ,将follow(T)加入到follow(F)中,follow(F) = {*,+,),$}
③ 再根据产生式 4 和规则(3)follow(T')加入follow(F) follow(F) = {+, ), *, $}
④ 根据产生式 4 和规则2first(T')加入到follow(F)中, follow(F) = {+,),*,$}

实际上,我们回顾规则开头,当没有新的终结符加入时,不必对所有的式子都应用
式子进行计算。
  • 47
    点赞
  • 270
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值