软件设计师 · 高频练习

包含空产生式时,文法的 FIRST 集怎么求?

中级 单选题 第 835 题 中等 软件设计师编译原理FIRST集空产生式上下文无关文法
题目

给定文法:S→AB,A→aA|ε,B→bB|c。其中 ε 表示空串。FIRST(S) 为()。

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

FIRST(A)={a, ε},说明从 S→AB 出发时,最左边既可能先出现 a,也可能由 A 推出空串。A 可空时还要继续查看 B,而 FIRST(B)={b,c}。因此 FIRST(S)={a,b,c}。B 不能推出 ε,所以 ε 不属于 FIRST(S)。

选项分析

A

错误。只看到了 A→aA,没有处理 A→ε 后应继续查看 B 的情况。

B

错误。ε 属于 FIRST(A),但 B 不可空,因此 S 不能整体推出 ε。

C

正确。A 提供 a,A 可空时 B 还能提供 b、c。

D

错误。只有 A、B 都可空时,ε 才会进入 FIRST(S)。

本题为什么容易错

FIRST 集计算不是把产生式右部所有符号的 FIRST 集一次性全并起来,而是从左向右遇到“可空”才继续。漏看可空属性和无条件加入 ε,是两种相反但都很常见的错误。

先看结论

简短答案

包含空产生式时,文法的 FIRST 集怎么求,正确答案是 C({a, b, c})。FIRST(A)={a, ε},说明从 S→AB 出发时,最左边既可能先出现 a,也可能由 A 推出空串。A 可空时还要继续查看 B,而 FIRST(B)={b,c}。因此 FIRST(S)={a,b,c}。B 不能推出 ε,所以 ε 不属于 FIRST(S)。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
{a} 本题干扰项 错误。只看到了 A→aA,没有处理 A→ε 后应继续查看 B 的情况。 看到该词不要急着选,先判断是否真正解决题干问题
{a, ε} 本题干扰项 错误。ε 属于 FIRST(A),但 B 不可空,因此 S 不能整体推出 ε。 看到该词不要急着选,先判断是否真正解决题干问题
{a, b, c} 本题正确答案 正确。A 提供 a,A 可空时 B 还能提供 b、c。 看到题干核心场景时优先联想到它
{a, b, c, ε} 本题干扰项 错误。只有 A、B 都可空时,ε 才会进入 FIRST(S)。 看到该词不要急着选,先判断是否真正解决题干问题
本题易混淆选项怎么区分
  • {a}:错误。只看到了 A→aA,没有处理 A→ε 后应继续查看 B 的情况。
  • {a, ε}:错误。ε 属于 FIRST(A),但 B 不可空,因此 S 不能整体推出 ε。
  • {a, b, c, ε}:错误。只有 A、B 都可空时,ε 才会进入 FIRST(S)。
复习

知识点详解

FIRST(α) 表示从符号串 α 能够推导出的所有串中,可能出现在最前面的终结符集合;若 α 能推出空串,还要把 ε 放入集合。对 α=X1X2…Xn,应先加入 FIRST(X1) 中除 ε 外的元素;若 X1 可空,再看 X2,依次类推。只有 X1 到 Xn 全部可空,FIRST(α) 才包含 ε。FIRST 集是构造预测分析表和判断 LL(1) 文法的基础,计算时最关键的不是背集合,而是把“可空链”处理完整。

备考速记

FIRST 从左往右看,前面能空才后移;不是全都能空,最后就不留 ε。

FIRST集 在上下文无关文法场景中的作用

FIRST集在本题中的核心价值,是解决“给定文法:S→AB,A→aA|ε,B→bB|c。其中 ε 表示空串。FIRST(S) 为()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。

拓展

同类题怎么考

  • 给出多条产生式,计算某个非终结符或符号串的 FIRST 集。
  • 在构造 LL(1) 预测分析表前,先判断哪些非终结符能够推出 ε。
  • 把 FIRST 集与 FOLLOW 集结合,判断含 ε 候选式是否产生选择冲突。
FIRST集 在软件设计师软考中的考法

软考选择题通常不会只考概念定义,还会把FIRST集放到上下文无关文法场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。

解题思路

这题最容易漏掉 b、c。老师在黑板上通常会先给 A 贴一个“可空”标记:A 不只会生成 a 开头的串,也可能什么都不生成。既然 A 可以让开,S 的第一个终结符就可能来自 B。最后再问一句:B 能不能也让开?不能,所以 ε 到这里就停住。

考点定位

计算符号串 FIRST(X1X2…Xn) 时,如果前面的非终结符可以推出 ε,就要继续把后一个符号的 FIRST 集并入;只有所有符号都可空,结果中才包含 ε。

易错提醒

  • 看到产生式右部有 A,就只抄 FIRST(A)。
  • 把 FIRST(A) 中的 ε 直接带入 FIRST(S),没有检查后续 B 是否可空。
  • 把非终结符 B 本身写进 FIRST 集,而不是写 B 能首先产生的终结符。

备考提示

  • 先单独标记每个非终结符是否可空,再计算符号串的 FIRST 集。
  • 草稿上用箭头从左向右走,只有当前符号可空时才跨到下一个符号。

你可能还想了解

  • FIRST 集的定义是什么?
  • 非终结符可以推出 ε 时为什么要继续向后看?
  • 什么时候 FIRST 集中需要保留 ε?
  • FIRST 集与 LL(1) 预测分析表有什么关系?

本文小结

A 可以推出 ε,所以计算 FIRST(S) 时不能只看 A,还要继续查看 B;A 提供 a,B 提供 b、c,因此 FIRST(S)={a,b,c}。B 不可空,结果中不能保留 ε。