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 结束后,允许接什么」
相关笔记¶
- 与 First/Follow 一起用于 LL(1) 的完整脉络,见 自顶向下语法分析。