跳转至

Follow 集合的简明理解

可以把 Follow 集合想象成一句很「人话」的问题:

「某个非终结符 A 推导完成之后,它后面可能紧跟着出现什么符号?」


一、直观理解(最重要)

假设你在读一句话(也就是输入串),语法分析器正在处理一个非终结符 A

  • A 会被展开成一段字符串(通过产生式)
  • 当这段字符串「结束」时,你接下来会看到什么?

Follow(A) = 所有可能出现在 A 后面的终结符集合


二、类比一个生活场景

把文法想成一句英文句子:

S → Subject Verb Object

比如:

I eat apples

我们关注 Subject(主语):

  • 主语后面一定是 Verb(动词)
  • 所以可以说:

Follow(Subject) = { Verb }


再看 Verb

  • 后面可能是 Object
    Follow(Verb) = { Object }

再看 Object

  • 它后面没有东西了(句子结束)

Follow(Object) = { $ }
$ 表示输入结束符)


三、回到编译原理的定义

在形式化定义中:

Follow(A) 是所有可以出现在某个句型中 A 右边的终结符集合

包括:

  • 普通终结符(如 a, b, +, )
  • 结束符 $

四、为什么需要 Follow 集合?

LL(1) 分析中,你会遇到这种情况:

A → α | ε

当你看到 A,你需要决定:

到底用 α,还是用 ε?

决策规则

  • 如果当前输入符号 ∈ First(α) → 用 α
  • 如果当前输入符号 ∈ Follow(A) → 用 ε

关键点: Follow(A) 告诉你:「如果接下来这个符号是属于 Follow(A),说明 A 可以结束(选 ε)」


五、再来一个稍微正式点的例子

文法:

S → A B
A → a | ε
B → b

求 Follow(A)

看产生式:

S → A B

A 后面是 B,所以:

Follow(A) ⊇ First(B)

而:

First(B) = { b }

所以:

Follow(A) = { b }

含义解释

当你解析到 A:

  • 如果下一个输入是 b
  • 说明 A 应该「结束」(用 ε)

六、再总结一句「人话版本」

Follow(A) 的本质就是:

「如果你刚刚识别完 A,接下来可能看到什么符号?」


七、和 First 的区别(很多人容易混)

集合 含义
First(A) A 能推导出的「第一个符号」
Follow(A) A 后面可能出现的符号

八、一个更形象的比喻

把语法分析看成「拼句子」:

  • First(A):A 开头长啥样
  • Follow(A):A 后面能接啥

九、核心一句话总结

Follow 集合 =「A 结束后,允许接什么」


相关笔记