给定文法:S→AB,A→a,B→b|ε,S 为开始符号,以 $ 表示输入结束符。FOLLOW(A) 为()。
在产生式 S→AB 中,A 后面是 B,因此 FIRST(B) 中除 ε 外的 b 要加入 FOLLOW(A)。同时 B 可以推出 ε,A 也可能成为整个 S 推导串的末尾,所以还要把 FOLLOW(S) 加入 FOLLOW(A)。S 是开始符号,FOLLOW(S) 包含 $,故 FOLLOW(A)={b,$}。
选项分析
错误。只处理了 B 能以 b 开头,没有处理 B→ε 后 A 位于句尾的情况。
错误。只继承了 FOLLOW(S),漏掉 FIRST(B) 中除 ε 外的 b。
正确。b 来自 FIRST(B)-{ε},$ 来自 B 可空时继承的 FOLLOW(S)。
错误。a 是 A 自己能够产生的终结符,不是推导完成后可能紧跟在 A 后面的符号。
本题为什么容易错
FIRST 关心“能从谁开头”,FOLLOW 关心“谁可能跟在后面”。不少同学计算 FOLLOW(A) 时仍盯着 A→a,结果把 a 错放进集合。
简短答案
后继符号可以为空时,FOLLOW 集怎么计算,正确答案是 C({b, $})。在产生式 S→AB 中,A 后面是 B,因此 FIRST(B) 中除 ε 外的 b 要加入 FOLLOW(A)。同时 B 可以推出 ε,A 也可能成为整个 S 推导串的末尾,所以还要把 FOLLOW(S) 加入 FOLLOW(A)。S 是开始符号,FOLLOW(S) 包含 $,故 FOLLOW(A)={b,$}。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| {b} | 本题干扰项 | 错误。只处理了 B 能以 b 开头,没有处理 B→ε 后 A 位于句尾的情况。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| {$} | 本题干扰项 | 错误。只继承了 FOLLOW(S),漏掉 FIRST(B) 中除 ε 外的 b。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| {b, $} | 本题正确答案 | 正确。b 来自 FIRST(B)-{ε},$ 来自 B 可空时继承的 FOLLOW(S)。 | 看到题干核心场景时优先联想到它 |
| {a, b, $} | 本题干扰项 | 错误。a 是 A 自己能够产生的终结符,不是推导完成后可能紧跟在 A 后面的符号。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- {b}:错误。只处理了 B 能以 b 开头,没有处理 B→ε 后 A 位于句尾的情况。
- {$}:错误。只继承了 FOLLOW(S),漏掉 FIRST(B) 中除 ε 外的 b。
- {a, b, $}:错误。a 是 A 自己能够产生的终结符,不是推导完成后可能紧跟在 A 后面的符号。
知识点详解
FOLLOW(A) 是在某个句型中可能立即出现在非终结符 A 右侧的终结符集合。开始符号的 FOLLOW 集包含结束符号 $。对于 X→αAβ,FIRST(β) 中除 ε 外的元素应加入 FOLLOW(A);如果 β 能推出 ε,FOLLOW(X) 也要加入 FOLLOW(A)。FOLLOW 集通常需要反复迭代,直到所有集合不再变化。它不包含 ε,因为 ε 不是实际输入符号,不能出现在 A 后面被分析器读取。
备考速记
FOLLOW 不看 A 生成什么,要看 A 后面站着谁;后面能空,就继承左部的 FOLLOW。
FOLLOW集 在可空后缀场景中的作用
FOLLOW集在本题中的核心价值,是解决“给定文法:S→AB,A→a,B→b|ε,S 为开始符号,以 $ 表示输入结束符。FOLLOW(A) 为()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 开始符号位于推导末尾,考查 $ 的传播。
- 后缀包含多个可空非终结符,连续继承 FOLLOW 集。
- 结合 FIRST/FOLLOW 判断 ε 产生式应填入预测分析表的哪些列。
FOLLOW集 在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把FOLLOW集放到可空后缀场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
FOLLOW 题不要顺着 A 自己的产生式找,要回到“A 在谁的右边出现”。这里 A 后面站着 B,所以 b 能跟在 A 后面;但 B 还会消失,一旦它消失,A 就成了 S 的最后一个符号,于是输入结束标记 $ 也可能紧跟 A。两条来源都要收下。
考点定位
若产生式形如 X→αAβ,应把 FIRST(β)-{ε} 加入 FOLLOW(A);当 β 可空或 A 位于产生式末尾时,还要把 FOLLOW(X) 加入 FOLLOW(A)。
易错提醒
- 忘记开始符号的 FOLLOW 集应包含输入结束符 $。
- 后继符号可空时,没有继续继承左部非终结符的 FOLLOW 集。
- 把 ε 加入 FOLLOW 集;FOLLOW 集只包含终结符和结束标记,不包含 ε。
备考提示
- 计算 FOLLOW 前先把每个非终结符在产生式右部出现的位置圈出来。
- 遇到 Aβ 结构时先看 FIRST(β),再检查 β 是否可空,分两步处理。
你可能还想了解
- FOLLOW 集为什么不包含 ε?
- 开始符号的 FOLLOW 集为什么包含 $?
- 产生式右部后缀可空时怎样传播 FOLLOW 集?
- FIRST 集与 FOLLOW 集计算顺序有什么要求?
本文小结
A 后面的 B 可以先产生 b,所以 b 属于 FOLLOW(A);B 又可以推出 ε,此时 A 位于 S 推导串末尾,还要继承 FOLLOW(S) 中的 $。因此 FOLLOW(A)={b,$}。