软件设计师 · 高频练习

后继符号可以为空时,FOLLOW 集怎么计算?

中级 单选题 第 836 题 中等 软件设计师编译原理FOLLOW集结束符号可空后缀
题目

给定文法:S→AB,A→a,B→b|ε,S 为开始符号,以 $ 表示输入结束符。FOLLOW(A) 为()。

A {b}
B {$}
C {b, $}
D {a, b, $}
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
C
答案解析

在产生式 S→AB 中,A 后面是 B,因此 FIRST(B) 中除 ε 外的 b 要加入 FOLLOW(A)。同时 B 可以推出 ε,A 也可能成为整个 S 推导串的末尾,所以还要把 FOLLOW(S) 加入 FOLLOW(A)。S 是开始符号,FOLLOW(S) 包含 $,故 FOLLOW(A)={b,$}。

选项分析

A

错误。只处理了 B 能以 b 开头,没有处理 B→ε 后 A 位于句尾的情况。

B

错误。只继承了 FOLLOW(S),漏掉 FIRST(B) 中除 ε 外的 b。

C

正确。b 来自 FIRST(B)-{ε},$ 来自 B 可空时继承的 FOLLOW(S)。

D

错误。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,$}。