文法中非终结符 A 有两个候选式 A→α|ε,且 α 不能推出 ε。为了使这两个候选式能够用一个向前看符号进行确定性选择,除基本条件外,还必须满足()。
选择 A→α 时依据向前看符号是否属于 FIRST(α);选择 A→ε 时则依据向前看符号是否属于 FOLLOW(A)。如果两个集合相交,同一个输入符号会同时支持两个候选式,预测分析器无法唯一决定,因此必须有 FIRST(α)∩FOLLOW(A)=∅。
选项分析
正确。FIRST(α) 与 FOLLOW(A) 不相交,才能让 α 和 ε 的选择入口彼此分离。
错误。两个集合相等会造成最严重的选择冲突。
错误。题干已说明 α 不能推出 ε,FIRST(α) 不应包含 ε。
错误。FOLLOW(A) 可以包含 $,尤其 A 可能出现在句型末尾时;这不妨碍文法成为 LL(1)。
本题为什么容易错
很多人只背“候选式 FIRST 集不相交”,遇到 ε 产生式就失效。ε 本身不会出现在输入中,选择它要借助 FOLLOW(A),所以判断条件自然要把 FOLLOW 集纳入。
简短答案
候选式含 ε 时,LL(1) 文法要满足什么条件,正确答案是 A(FIRST(α)∩FOLLOW(A)=∅)。选择 A→α 时依据向前看符号是否属于 FIRST(α);选择 A→ε 时则依据向前看符号是否属于 FOLLOW(A)。如果两个集合相交,同一个输入符号会同时支持两个候选式,预测分析器无法唯一决定,因此必须有 FIRST(α)∩FOLLOW(A)=∅。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| FIRST(α)∩FOLLOW(A)=∅ | 本题正确答案 | 正确。FIRST(α) 与 FOLLOW(A) 不相交,才能让 α 和 ε 的选择入口彼此分离。 | 看到题干核心场景时优先联想到它 |
| FIRST(α)=FOLLOW(A) | 本题干扰项 | 错误。两个集合相等会造成最严重的选择冲突。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| FIRST(α) 中必须包含 ε | 本题干扰项 | 错误。题干已说明 α 不能推出 ε,FIRST(α) 不应包含 ε。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| FOLLOW(A) 中不能包含结束符 $ | 本题干扰项 | 错误。FOLLOW(A) 可以包含 $,尤其 A 可能出现在句型末尾时;这不妨碍文法成为 LL(1)。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- FIRST(α)=FOLLOW(A):错误。两个集合相等会造成最严重的选择冲突。
- FIRST(α) 中必须包含 ε:错误。题干已说明 α 不能推出 ε,FIRST(α) 不应包含 ε。
- FOLLOW(A) 中不能包含结束符 $:错误。FOLLOW(A) 可以包含 $,尤其 A 可能出现在句型末尾时;这不妨碍文法成为 LL(1)。
知识点详解
LL(1) 中第一个 L 表示从左向右扫描输入,第二个 L 表示构造最左推导,1 表示只向前查看一个输入符号。对同一非终结符的不同候选式 α、β,通常要求 FIRST(α) 与 FIRST(β) 不相交。若其中一个候选式能推出 ε,还必须保证另一个候选式的 FIRST 集与该非终结符的 FOLLOW 集不相交。这样每个“非终结符、向前看符号”组合最多对应一条产生式。
备考速记
没有 ε,候选 FIRST 两两分开;有了 ε,再让非空 FIRST 避开 FOLLOW。
LL(1)文法 在FOLLOW集场景中的作用
LL(1)文法在本题中的核心价值,是解决“文法中非终结符 A 有两个候选式 A→α|ε,且 α 不能推出 ε。为了使这两个候选式能够用一个向前看符号进行确定性选择,除基本条件外,还必须满足()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 给出 FIRST 与 FOLLOW 集,直接判断某个非终结符是否存在选择冲突。
- 给出含 ε 的文法,判断能否构造无冲突预测分析表。
- 要求通过提取左公因子或消除左递归,把文法改造成更适合 LL(1) 分析的形式。
LL(1)文法 在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把LL(1)文法放到FOLLOW集场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
把分析器想成只看一个路标的司机。看到 FIRST(α) 里的符号,它应走 α;看到 FOLLOW(A) 里的符号,它应让 A 直接结束、选择 ε。如果同一个符号同时出现在两边,司机只看一眼就无法决定走哪条路,这正是 LL(1) 不允许的冲突。
考点定位
判断含 ε 候选式的 LL(1) 文法时,不能只检查不同候选式 FIRST 集互不相交,还要检查非空候选式的 FIRST 集与该非终结符 FOLLOW 集互不相交。
易错提醒
- 把 ε 当作预测分析器实际读取的输入字符。
- 只比较 FIRST(α) 与 FIRST(ε),没有使用 FOLLOW(A)。
- 误以为 FOLLOW 集出现结束符 $ 就不满足 LL(1)。
备考提示
- 先区分候选式是否可空;只要有候选式可空,就把 FOLLOW 条件单独写出来。
- 用预测分析表验证判断:如果同一个表格单元需要填两条产生式,就不是 LL(1)。
你可能还想了解
- LL(1) 中两个 L 和数字 1 分别表示什么?
- 为什么 ε 产生式要使用 FOLLOW 集选择?
- FIRST 集不相交就一定是 LL(1) 文法吗?
- 怎样用预测分析表验证 LL(1) 文法?
本文小结
A→α|ε 中,α 通过 FIRST(α) 选择,ε 通过 FOLLOW(A) 选择。为了让一个向前看符号只对应一个候选式,必须满足 FIRST(α)∩FOLLOW(A)=∅。