求解下列文法的FIRST集合和FOLLOW集合:
E → E + T|T
T → T ∗ F|F
F → (E)|id


解答

FIRST集合的计算

  • E → E + T|T

由于FIRST(E)不包含ε。

∴ FIRST(E) = FIRST(E + T) = FIRST(E)

因为 E → T

∴ FIRST(E) = {FIRST(T)} (1)

  • T → T ∗ F|F

由于FIRST(T)不包含ε,或者T不能推导出ε。

∴ FIRST(T) = FIRST(T ∗ F) = {FIRST(T)}

因为 T → F (FIRST(T) = {FIRST(F)} (2)

  • F → (E)|id

∴ 根据FIRST的规则(3)

FIRST(F) = {(, id} (3)

由(1),(2)和(3)

FIRST(F) = {(, id} (3)

FIRST(T) = {FIRST(F)} (2)

FIRST(E) = {FIRST(T)} (1)

∴ FIRST(E) = FIRST(T) = FIRST(F) = {(, id}

FOLLOW集合的计算

E → E + T|T

T → T ∗ F|F

F → (E) |id

应用规则(1) FOLLOW(E) = {$} (1)

  • E → E + T|T

应用FOLLOW的规则(2)

E →εE+T
A →αBβ

α = ε, B = E, β = +T

由于FIRST(β) = FIRST(+T) = {+}不包含ε

∴ FOLLOW的规则(2a)

∴ FOLLOW(E) = FIRST(+T) = {+}

∴ FOLLOW(E) = {+} (2)

应用FOLLOW的规则(3)

E →E +T
A →αB

FOLLOW(T) = {FOLLOW(E)} (3)

  • T → T * F

应用规则(2)

T →εT*F
A →αBβ

∴ A = T, α = ε, B = T, β = *F

由于FIRST(β) = {∗}不包含ε。

∴ FOLLOW的规则(2a)

∴ FOLLOW(T) = FIRST(* F)

∴ FOLLOW(T) = {∗} (4)

应用规则(3)

T →T*F
A →αB

FOLLOW(F) = {FOLLOW(T)} (5)

  • F → (E)

应用规则(2)

F →(E)
A →αBβ

由于FIRST(β) = {)}不包含ε。

∴ FOLLOW的规则(2a)

∴ FOLLOW(E) = FIRST())。

∴ FOLLOW(E) = {)} (6)

规则(3)不能应用于此产生式

它在右端有 )。

但在规则(3)中,我们应该在右端有一个非终结符。

即,我们不能将A → αB与F → (E)进行比较。

结合所有6个语句,我们得到

FOLLOW(E) = {$} (1)

FOLLOW(E) = {+} (2)

FOLLOW(T) = {FOLLOW(E)} (3)

FOLLOW(T) = {∗} (4)

FOLLOW(F) = {FOLLOW(T)} (5)

FOLLOW(E) = {)} (6)

∴ 由规则(1),(2)和(6)

FOLLOW(E) = {$, +, )}

∴ 由规则(3),(4)和(5)

FOLLOW(T) = FOLLOW(F) = {$, +, ),∗}

更新于:2021年11月3日

8K+ 浏览量

开启你的职业生涯

完成课程获得认证

开始学习
广告