某语言同时定义了运算符“>”“=”和“>=”。词法分析器扫描输入 a>=b,并采用最长匹配原则,则在读到“>=”时应当()。
最长匹配要求从当前位置开始,在能够形成合法词素的选择中取最长者。既然语言定义了 >=,扫描器读到 > 后不能立刻提交,还要继续看下一个字符;当 = 使其形成合法的两字符运算符时,应把 >= 作为一个词法单元输出。
选项分析
错误。只有语言没有定义 >=,或扫描规则明确要求拆分时,才会输出两个词法单元。
正确。>= 是从当前位置可匹配的最长合法运算符。
错误。词法分析不能随意丢弃构成合法运算符的输入字符。
错误。运算符的字符切分属于词法分析职责,语法分析接收的是词法单元序列。
本题为什么容易错
看到 > 已经合法就立即停,是把“到达接受状态”误解成“必须马上输出”。确定化有限自动机可能先经过接受状态再继续转移,最长匹配需要记住最近接受位置。
简短答案
词法分析为什么通常采用最长匹配原则,正确答案是 B(优先识别为一个“>=”词法单元)。最长匹配要求从当前位置开始,在能够形成合法词素的选择中取最长者。既然语言定义了 >=,扫描器读到 > 后不能立刻提交,还要继续看下一个字符;当 = 使其形成合法的两字符运算符时,应把 >= 作为一个词法单元输出。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 固定拆成“>”和“=”两个词法单元 | 本题干扰项 | 错误。只有语言没有定义 >=,或扫描规则明确要求拆分时,才会输出两个词法单元。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 优先识别为一个“>=”词法单元 | 本题正确答案 | 正确。>= 是从当前位置可匹配的最长合法运算符。 | 看到题干核心场景时优先联想到它 |
| 丢弃“=”,只保留“>” | 本题干扰项 | 错误。词法分析不能随意丢弃构成合法运算符的输入字符。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 交给语法分析器逐字符决定 | 本题干扰项 | 错误。运算符的字符切分属于词法分析职责,语法分析接收的是词法单元序列。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 固定拆成“>”和“=”两个词法单元:错误。只有语言没有定义 >=,或扫描规则明确要求拆分时,才会输出两个词法单元。
- 丢弃“=”,只保留“>”:错误。词法分析不能随意丢弃构成合法运算符的输入字符。
- 交给语法分析器逐字符决定:错误。运算符的字符切分属于词法分析职责,语法分析接收的是词法单元序列。
知识点详解
词法分析器常向前读取字符,直到当前路径无法继续匹配,再退回到最后一个接受状态并输出词法单元。这既保证了最长合法前缀,也避免把 >= 错拆成 > 和 =。最长匹配不表示无限吞字符,边界仍由词法模式决定;若两个规则匹配长度相同,还需要借助规则先后次序或关键字表决定类别。
备考速记
先尽量往前读,失败再退到最近一次合法位置。
运算符识别在运算符识别场景中的作用
运算符识别在本题中的核心价值,是解决“某语言同时定义了运算符“>”“=”和“>=”。词法分析器扫描输入 a>=b,并采用最长匹配原则,则在读到“>=”时应当()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 比较 = 与 ==、> 与 >=、+ 与 ++ 的识别结果。
- 给出自动机运行轨迹,判断扫描器回退到哪个接受状态。
- 考查关键字与标识符同长度冲突时的规则优先级。
运算符识别在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把运算符识别放到运算符识别场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
扫描器读到 > 时,其实已经有一个可交卷的答案,但它会先忍一下,再看一位。下一位 = 能把答案延长成合法的 >=,于是选择更长的那个。只有再往后读不能构成合法词素时,才回到最近一次可接受的位置。
考点定位
最长匹配也称最大吞噬原则:从当前输入位置选择能够被某个词法模式接受的最长前缀;若继续读取后失败,则回到最近的接受状态。
易错提醒
- 一进入接受状态就提交词法单元,没有继续尝试更长匹配。
- 把最长匹配理解成整行越长越好,而不是从当前扫描位置取最长合法前缀。
- 认为关键字和标识符冲突只靠最长匹配解决,忽略同长度规则还需要优先级。
备考提示
- 用 >、>=、>> 三个模式手动画扫描过程,记录每次到达接受状态的位置。
- 把“最长匹配”和“规则优先级”分开:前者先比长度,同长度冲突再按语言规则处理。
你可能还想了解
- 最长匹配和到达接受状态有什么区别?
- 词法分析器为什么需要记录最近接受位置?
- 关键字与标识符匹配长度相同时怎么处理?
- 最大吞噬原则会不会把两个词法单元错误合并?
本文小结
扫描 a>=b 时,读到 > 虽已合法,但继续读取 = 可以形成更长的合法运算符 >=,因此应输出一个 >= 词法单元。最长匹配比较的是当前位置开始的最长合法前缀。