求以下文法的 FIRST 集和 FOLLOW 集:\nE → TE′\nE → +TE′|ε\nT → FT′\nT′ →* FT′|ε\nF → (E)|id


解答

计算 FIRST 集

  • E →TE′

应用 FIRST 集的规则 (4b)

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

∴ FIRST(E) = FIRST(TE′) = FIRST(T)

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

  • E → +TE′|ε

应用 FIRST 集的规则 (3)

将 E′ → +TE′ 与 X → aα 进行比较

∴ FIRST(E′) = {+}

对 E′ → ε 应用规则 (2)

FIRST(E′) = {ε}

∴ FIRST(E′) = {+, ε} (2)

  • T→FT′

应用 FIRST 集的规则 (4b)

由于 FIRST(F) 不能推导出 ε

∴ FIRST(T) = FIRST(FT′) = FIRST(F)

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

  • T′→*FT′|ε

根据 FIRST 集的规则 (2) 和 (3),我们得到

∴ FIRST(T′) = {ε,∗} (4)

  • F→(E)|id

根据 FIRST 集的规则 (3) 进行比较

∴ FIRST(F) = {(, id} (5)

结合语句 (1)、(2)、(3)、(4)、(5)

FIRST(E) = {FIRST(T)}

FIRST(E′) = {+, ε}

FIRST(T) = {FIRST(F)}

FIRST(T′) = {ε,*}

FIRST(F) = {(, id}

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

FIRST(E′) = {+, ε}

FIRST(T′) = {ε,*}

计算 FOLLOW 集

E → TE′

E → +TE′|ε

T → FT′

T′ →∗ FT′|ε

F → (E)|id

应用 FOLLOW 集的规则 (1)

∴ FOLLOW(E) = {$} (1)

  • E → TE′

应用 FOLLOW 集的规则 (2)

E →εTE′
A →αBβ

∴ A = E, α = ε, B = T, β = E′

由于 FIRST(β) = FIRST(E′) 包含 ε。

∴ FOLLOW 集的规则 (2b)

FOLLOW(T) = FIRST(E′) - {ε} ∪ FOLLOW(E)

FOLLOW(T) = {+, ε} - {ε} ∪ FOLLOW(E)

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

应用 FOLLOW 集的规则 (3)

E →TE′
A →αβ

A = E, α = T, B = E′

∴ FOLLOW(E′) = {FOLLOW(E)} (3)

  • E′ → +TE′

应用规则 (2)

E →TE′
A →Bβ

A = E, α = +, B = T, β = E′

由于 FIRST(β) = FIRST(E′) 包含 ε。

∴ **FOLLOW 集的规则 (2b)**

∴ FOLLOW(T) = FIRST(E′) - {ε} ∪ FOLLOW(E′)

∴ FOLLOW(T) = {+, ε} - {ε} ∪ FOLLOW(E′)

∴ FOLLOW(T) = {+} ∪ FOLLOW(E′) (4)

  • 应用规则 (3)
E →+TE′
A →αB

∴ FOLLOW(E′) = {FOLLOW(E′)} (5)

  • T′ →FT′

应用规则 (2)

T →εFT′
A →αBβ

由于 FIRST(β) 推导出 ε。

∴ **FOLLOW 集的规则 (2b)**

∴ FOLLOW(F) = FIRST(T′) - {ε} ∪ FOLLOW(T)

∴ FOLLOW(F) = {∗, ε} - {ε} ∪ FOLLOW(T)

∴ FOLLOW(F) = {∗} ∪ FOLLOW(T) (6)

应用规则 (3)

T →FT′
A →αB

∴ FOLLOW(T′) = {FOLLOW(T)} (7)

  • T →*FT′|ε

应用 FOLLOW 集的规则 (2)

T′ →*FT′
A →αBβ

FIRST(β) = FIRST(T′) 包含 ε 或 T′ 推导出 ε。

∴ **规则 (2b)**

∴ FOLLOW(F) = FIRST(T′) - {ε} ∪ FOLLOW(T′)

∴ FOLLOW(F) = {*, ε} - {ε} ∪ FOLLOW(T′)

∴ FOLLOW(F) = {*} ∪ FOLLOW(T′) (8)

应用 FOLLOW 集的规则 (3)

T′ →*FT′
A →αB

∴ FOLLOW(T′) = {FOLLOW(T′)} (9)

  • F→(E)

应用规则 (2)

F →(E)
A →αBβ

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

∴ **规则 (2a)**

∴ FOLLOW(E) = FIRST( ))

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

规则 (3) 不适用于此产生式。

因为 A → α B 在产生式的右端有非终结符 B。但是 F → (E) 在其右端有 ) 终结符。

规则 (2) 和规则 (3) 不适用于其余产生式,因为它们与规则不匹配。

结合产生式 (1) 到 (10)

FOLLOW(E) = {$} (1)

FOLLOW(T) = {+} ∪ FOLLOW(E) (2)

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

FOLLOW(T) = {+} ∪ FOLLOW(E′) (4)

FOLLOW(E′) = {FOLLOW(E′)} (5)

FOLLOW(F) = {*} ∪ FOLLOW(T) (6)

FOLLOW(T′) = {FOLLOW(T)} (7)

FOLLOW(F) = {*} ∪ FOLLOW(T′) (8)

FOLLOW(T′) = {FOLLOW(T′)} (9)

FOLLOW(E) = {)} (10)

根据 (1)、(3) 和 (10)

FOLLOW(E) = FOLLOW(E′) = {$, )} (11)

∴ 根据规则 4、7 和 11

∴ FOLLOW(T) = {+} ∪ FOLLOW(E′)

∴ FOLLOW(T) = {+} ∪ {$, )}

∴ FOLLOW(T) = {+, ), $}

FOLLOW(T′) = {FOLLOW(T)} = {+, ), $} (12)

∴ 根据语句 6、8 和 12

FOLLOW(F) = {*} ∪ FOLLOW(T)

FOLLOW(F) = {*} ∪ {+, ), $, }

FOLLOW(F) = {*, +, ), $} (13)

∴ 语句 11、12 和 13 给出了所需的答案

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

FOLLOW(T) = FOLLOW(T′) = {+, ), $}

FOLLOW(F) = {+, *, ), $}

更新于: 2021年11月1日

4K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告