【编译原理】FIRST集和FOLLOW集

文章目录

  • 龙书上的定义:
    • FIRST
    • FOLLOW
  • 自己的理解
    • FIRST
    • FOLLOW
  • 例子
    • 推导FIRST
    • 推导FOLLOW

龙书上的定义:

FIRST

如果x是一个终结符,则FIRST(X) = X

如果x是一个非终结符,则 X → Y 1 Y 2 Y 3 ⋯ Y k X\rightarrow Y_1Y_2Y_3\cdots Y_k XY1Y2Y3Yk,其中 k ≥ 1 k\ge1 k1
∃ i ∈ k , a ∈ F I R S T ( Y i ) 且 F I R S T ( Y 1 ) ⋯ F I R S T ( Y i − 1 ) \exists i \in k,a\in FIRST(Y_i)且FIRST(Y_1)\cdots FIRST(Y_{i-1}) ik,aFIRST(Yi)FIRST(Y1)FIRST(Yi1)
中 都 有 ϵ 则 把 a 加 入 到 F I R S T ( X ) 中 中都有\epsilon 则把a加入到FIRST(X)中 ϵaFIRST(X)

并且可以有以下推论:

  1. F I R S T ( Y 1 ) ∈ F I R S T ( X ) FIRST(Y_1)\in FIRST(X) FIRST(Y1)FIRST(X)
  2. 如果 Y 1 Y_1 Y1不能推导出 ϵ \epsilon ϵ,则不会再往 F I R S T ( X ) FIRST(X) FIRST(X)中添加任何元素

FOLLOW

如果 S S S是开始符,则 ς ∈ F , ς \varsigma\in F ,\varsigma ςF,ς是输入右端的结束标记。

如果有 A → α B β A\rightarrow \alpha B\beta AαBβ,那么 F I R S T ( β ) FIRST(\beta) FIRST(β)中除了 ϵ \epsilon ϵ之外的所有符号都在 F O L L O W ( B ) FOLLOW(B) FOLLOW(B)中。

如果有 A → α B A\rightarrow \alpha B AαB,或 A → α B β A\rightarrow \alpha B\beta AαBβ F I R S T ( β ) FIRST(\beta) FIRST(β)包含 ϵ \epsilon ϵ。则 F O L L O W ( A ) FOLLOW(A) FOLLOW(A)的所有符号都在 F O L L O W ( B ) FOLLOW(B) FOLLOW(B)中。

自己的理解

FIRST

  1. 终结符的FIRST就是自己
  2. 对于产生式,如果最左边的能推导出 ϵ \epsilon ϵ,则再开始推第二个,并把最左边的FIRST并到自己的FIRST里。

FOLLOW

  1. 产生式的右边如果存在,则把FIRST(右边)中除了 ϵ \epsilon ϵ之外所有的符号加入FOLLOW(自己)
  2. 如果产生式的右边能推导出 ϵ \epsilon ϵ,或者不存在,则产生式左边的FOLLOW也在自己的里面。

例子

G [ S ] : G[S]: G[S]:

E → T E ′ E \rightarrow TE^{'} ETE (1)
E ′ → + T E ′ ∣ ϵ E^{'} \rightarrow +TE^{'} | \epsilon E+TEϵ(2)
T → F T ′ T\rightarrow FT^{'} TFT(3)
T ′ → ∗ F T ′ ∣ ϵ T^{'}\rightarrow *FT^{'}|\epsilon TFTϵ(4)
F → ( E ) ∣ i d F\rightarrow (E)|id F(E)id(5)

推导FIRST

由(5)明显易得:

  1. FIRST(F)={ ( ,id } 因为是终结符
    所以:
  2. FIRST(T) = FIRST(F) 因为(3),最左边的元素,且FIRST(F)里没有 ϵ \epsilon ϵ
    同理根据(1)可得
  3. 所以FIRST(E) = FIRST(T) = FIRST(F)

也由(4)明显易得:
FISRT( T ′ T^{'} T) = { *, ϵ \epsilon ϵ }
同理(2)
FISRT( E ′ E^{'} E) = { +, ϵ \epsilon ϵ }

推导FOLLOW

因为E是开始符,并且由(5)得到FOLLOW(E) = { ) , $ }
由(1)可得 FOLLOW( E ′ E^{'} E) = FOLLOW(E)
由(2)可得FOLLOW(T)中一定有FIRST( E ′ E^{'} E)
所有FOLLOW(T)中一定有’+’
且FIRST( E ′ E^{'} E)中存在 ϵ \epsilon ϵ,并且(1)产生式的左边是E
所以FOLLOW(T)={ +,),$ }
所以FOLLOW( T ′ T^{'} T) = FOLLOW(T)
有(3),(4)可得
FOLLOW(F) = { ) , + , * , $ }

你可能感兴趣的:(编译原理)