编译原理只看书的话还是很难学,上课听老师讲的蛮好,可忘得也很快,再复习看书的时候已然忘记老师当时是怎么讲的了QAQ...

现在只能在网上找教程自学一下喽编译原理 first集 follow集 实例 解析:先看看为什么要有first集和follow集:

编译原理 first集 follow集 实例 解析

编译原理 first集 follow集 实例 解析

编译原理 first集 follow集 实例 解析       

编译原理 first集 follow集 实例 解析

编译原理 first集 follow集 实例 解析

       这个很简单了,x是终结符,那它的FIRST集肯定也是x了。

编译原理 first集 follow集 实例 解析 

        举个栗子::Y->b|ε,那么First (Y)={b, ε}(b是终结符)

编译原理 first集 follow集 实例 解析

        举个栗子:Y->b|ε,那么First (Y)={b, ε}(b是终结符),X->Yabcd|ε,则FIRST(X) = (First(Y)--{ε})∪ {ε}(这

        里的{ε}是由法则2 编译原理 first集 follow集 实例 解析 推导出来 )

   编译原理 first集 follow集 实例 解析编译原理 first集 follow集 实例 解析编译原理 first集 follow集 实例 解析

         举个栗子:

1、文法G [S]为:

SAB                                  First(S) =(First(A)-{ε})∪(First (B)-{ε}) ∪{ε}∪{b} 

SbC                                   因为A的first有ε,B的first有ε,S->AB,所以是First(A)-{ε})∪(First (B)-{ε}) ∪{ε}
A→ε         然后S->bC由法则2得,所以再加一个b就是First(A)-{ε})∪(First(B)-{ε})∪{ε}
Ab                                    ∪{b}

B→ε          由之前的法则:First (A)={b, ε}First (B)={a, ε}所以First(S) ={a,b,ε}

BaD

CAD

Cb

DaS

Dc

编译原理 first集 follow集 实例 解析

    编译原理 first集 follow集 实例 解析

    FOLLOW集就是找后面有没有能处理这个终结符的非终结符,如果有就继续,没有则报错!所以此处我们的视角和求解first集的视角有所不同,此时我们应该向后看,找后面的。

编译原理 first集 follow集 实例 解析

编译原理 first集 follow集 实例 解析

        这个不用多说,初始规定就是这样。

编译原理 first集 follow集 实例 解析

        举个栗子:文法G [E]为:    

                   E   →  TE'          因为E是文法的识别符所以把#加入FOLLOW(E),又由规则F  →  (E) | i 得E

                   E'  →  +TE' | ε    的后跟符号  )(  first(')') = {)}  ) ,所以,FOLLOW(E)={ #,) };

                   T   →  FT'

                   T'  →  *FT' | ε

                   F  →  (E) | i

编译原理 first集 follow集 实例 解析

          举个栗子:文法G [E]为:    

                   E   →  TE'          先给出它们的FIRST集:(求解方法见上面FIRST集的求解)

                   E'  →  +TE' | ε            FIRST(F)={ (,i }

                   T   →  FT'                    FIRST(T’)={ *,ε }

                   T'  →  *FT' | ε             FIRST(T) ={ (,i }

                   F  →  (E) | i                 FIRST(E’)={ +,ε }

                                                   FIRST(E)={ (,i }

FOLLOW集的求解:因为E是文法的识别符所以把#加入FOLLOW(E),又由规则F  →  (E) | i 得E的后跟符号),所以,FOLLOW(E)={ #,) };

FOLLOW(E’)={ #,) }    ∵E → TE’   follow集的目的是为了在E'无法处理当前终结符的时候,判断E'之后有没有能处理该终结符的非终结符,    ∴FOLLOW(E)加入 FOLLOW(E')

FOLLOW(T)={+,),#}      ∵E'→ +TE’  ∴FIRST(E’)-{ε}加入FOLLOW(T); 又E’→ε,     ∴ FOLLOW(E’)加入FOLLOW(T)此处如果把E'->+TE'看为A->aBb,b=>ε的话,则Follow(E')加入Follow(E')中,这样没有任何意义。

FOLLOW(T’)= FOLLOW(T)= {+,),#}      ∵T → FT’   ∴ FOLLOW(T)加入FOLLOW(T’)
FOLLOW(F)={*,+,),#}    ∵T → FT’   ∴ FOLLOW(F)=FIRST(T’)-{ε} ; 又T’→ε ∴ FOLLOW(T)加入FOLLOW(F)

        

相关文章:

  • 2021-10-02
  • 2022-12-23
  • 2021-11-04
  • 2021-07-03
  • 2022-12-23
  • 2021-11-06
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-05-30
  • 2022-12-23
  • 2021-10-21
  • 2021-08-13
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案