给定文法:S→AB,A→aA|ε,B→bB|c。其中 ε 表示空串。FIRST(S) 为()。
FIRST(A)={a, ε},说明从 S→AB 出发时,最左边既可能先出现 a,也可能由 A 推出空串。A 可空时还要继续查看 B,而 FIRST(B)={b,c}。因此 FIRST(S)={a,b,c}。B 不能推出 ε,所以 ε 不属于 FIRST(S)。
选项分析
错误。只看到了 A→aA,没有处理 A→ε 后应继续查看 B 的情况。
错误。ε 属于 FIRST(A),但 B 不可空,因此 S 不能整体推出 ε。
正确。A 提供 a,A 可空时 B 还能提供 b、c。
错误。只有 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 不可空,结果中不能保留 ε。