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) = {+,),*,$}

实际上,我们回顾规则开头,当没有新的终结符加入时,不必对所有的式子都应用
式子进行计算。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐