【问题标题】:Follow set example doesn't follow any rules?遵循设置示例不遵循任何规则?
【发布时间】:2017-10-02 04:17:54
【问题描述】:
  1. S → asg
  2. S → 如果 C 则 S E
  3. C → 布尔
  4. E → 否则 S
  5. E → λ

所有小写字母和λ都是终结符

我需要帮助来推导该语法的以下集合。我通常不会遇到这些问题,而且我知道规则,但是当我从书中练习这个例子时,这是我唯一能得到的:

Follow(S) = {$} U Follow(E) 
Follow(C) = 
Follow(E) = 

【问题讨论】:

  • S 后面可以跟 E,E 的第一个集合包括 else。而C后面可以跟then

标签: parsing grammar ambiguous-grammar


【解决方案1】:

根据https://www.cs.uaf.edu/~cs331/notes/FirstFollow.pdf

要计算所有非终结符 A 的 FOLLOW(A),请应用以下规则,直到无法将任何内容添加到任何 FOLLOW 集合:

  1. 将 $ 放在 FOLLOW(S) 中,其中 S 是开始符号,$ 是输入右结束标记。
  2. 如果有一个产生式 A ⇒ αΒβ,那么 FIRST(β) 中的所有内容,除了 ε,都放在 FOLLOW(B) 中。
  3. 如果存在产生式 A ⇒ αΒ,或产生式 A ⇒ αΒβ,其中 FIRST(β) 包含 ε(即 β ⇒ε),则 FOLLOW(A) 中的所有内容都在 FOLLOW(B) 中。

假设S是语法中的开始符号,λ代表一个空字符串,我们得到:

  • {$} ⊆ Follow(S) 按照规则 1。
  • (First(E) \ {λ}) ⊆ Follow(S) 按规则 2/生产 2。
  • Follow(E) ⊆ Follow(S) 按规则 3 / 生产 4。
  • (First(then S E) \ {λ}) ⊆ Follow(C) 按规则 2/生产 2。
  • Follow(S) ⊆ Follow(E) 按规则 3/生产 2。

First(then S E) 只是then(因为它是终端),所以我们有{then} ⊆ Follow(C)

这是对Follow(C) 的唯一约束,所以满足它的最小集合是:

Follow(C) = {then}

因为我们有Follow(E) ⊆ Follow(S)Follow(S) ⊆ Follow(E),所以(哈哈)它们是相等的:

Follow(E) = Follow(S)

终于有了

Follow(S) = {$} ∪ (First(E) \ {λ})

幸运的是First(E) 很简单,因为E 只有两个产生式,一个是空的,另一个以终结符号开头:

First(E) = {λ, else}

因此

Follow(S) = {$, else}

Follow(E) = {$, else}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多