4.编译原理 FIRST集 和 FOLLOW集 的求法

在这里插入图片描述

FIRST集 的求法

文字定义
FIRST(A)集合是​ A能推出的,所有的,第一个的,终结符 或 ε 所组成的集合



FOLLOW集 的求法

文字定义
FOLLOW(A)集合是​ 所有紧跟A之后的终结符 或 # 所组成的集合(#是句尾的标志),称FOLLOW(A)是A的随符集


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

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

( 1 )若S是文法的开始符号,则将 # 放到follow(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) | i

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

FOLLOW E
因为E是文法的开始符合,故 FOLLOW (E)={ # }

再根据规则(2)和产生式 5) 加入, 所以 follow(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)和产生式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) = {+,),*,#}



综合例子

在这里插入图片描述

参考视频:https://www.bilibili.com/video/BV1Cu411m7VX

  • 39
    点赞
  • 277
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
编译原理中,First集合Follow集合是两个重要的概念,用于描述文法规则的语言特征和语法结构,下面是它们的求法: 1. First集合求法: 对于一个非终结符号,它的First集合包括所有以该符号作为起始符号的产生式的首字符的终结符号。 对于一个终结符号,它的First集合就是本身。 对于一个产生式,如果它的右部第一个符号是终结符号,则将该符号加入First集合。 如果它的右部第一个符号是非终结符号,则将该符号的First集合中的所有符号加入到该产生式的First集合中,如果该符号的First集合中包含ε,则还需要将下一个符号的First集合中的符号加入到该产生式的First集合中,直到没有ε为止。 2. Follow集合求法: 对于文法的开始符号,将#(结束符号)加入到该符号的Follow集合中。 对于每个非终结符号,遍历所有产生式,如果该符号出现在产生式右部,则将该符号后面的符号的First集合中的所有符号(除ε)加入到该符号的Follow集合中,如果该符号后面的符号可以推导出ε,则将该产生式左部符号的Follow集合中的所有符号加入到该符号的Follow集合中。 对于每一个右部可以推导出ε的产生式,将该产生式左部符号的Follow集合中的所有符号加入到该产生式右部最后一个符号的Follow集合中。 以上就是编译原理中First集合Follow集合求法
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说的白是什么白_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值