软件设计师 · 高频练习

词法分析为什么通常采用最长匹配原则?

中级 单选题 第 844 题 中等 软件设计师编译原理词法分析最长匹配运算符识别
题目

某语言同时定义了运算符“>”“=”和“>=”。词法分析器扫描输入 a>=b,并采用最长匹配原则,则在读到“>=”时应当()。

A 固定拆成“>”和“=”两个词法单元
B 优先识别为一个“>=”词法单元
C 丢弃“=”,只保留“>”
D 交给语法分析器逐字符决定
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
B
答案解析

最长匹配要求从当前位置开始,在能够形成合法词素的选择中取最长者。既然语言定义了 >=,扫描器读到 > 后不能立刻提交,还要继续看下一个字符;当 = 使其形成合法的两字符运算符时,应把 >= 作为一个词法单元输出。

选项分析

A

错误。只有语言没有定义 >=,或扫描规则明确要求拆分时,才会输出两个词法单元。

B

正确。>= 是从当前位置可匹配的最长合法运算符。

C

错误。词法分析不能随意丢弃构成合法运算符的输入字符。

D

错误。运算符的字符切分属于词法分析职责,语法分析接收的是词法单元序列。

本题为什么容易错

看到 > 已经合法就立即停,是把“到达接受状态”误解成“必须马上输出”。确定化有限自动机可能先经过接受状态再继续转移,最长匹配需要记住最近接受位置。

先看结论

简短答案

词法分析为什么通常采用最长匹配原则,正确答案是 B(优先识别为一个“>=”词法单元)。最长匹配要求从当前位置开始,在能够形成合法词素的选择中取最长者。既然语言定义了 >=,扫描器读到 > 后不能立刻提交,还要继续看下一个字符;当 = 使其形成合法的两字符运算符时,应把 >= 作为一个词法单元输出。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
固定拆成“>”和“=”两个词法单元 本题干扰项 错误。只有语言没有定义 >=,或扫描规则明确要求拆分时,才会输出两个词法单元。 看到该词不要急着选,先判断是否真正解决题干问题
优先识别为一个“>=”词法单元 本题正确答案 正确。>= 是从当前位置可匹配的最长合法运算符。 看到题干核心场景时优先联想到它
丢弃“=”,只保留“>” 本题干扰项 错误。词法分析不能随意丢弃构成合法运算符的输入字符。 看到该词不要急着选,先判断是否真正解决题干问题
交给语法分析器逐字符决定 本题干扰项 错误。运算符的字符切分属于词法分析职责,语法分析接收的是词法单元序列。 看到该词不要急着选,先判断是否真正解决题干问题
本题易混淆选项怎么区分
  • 固定拆成“>”和“=”两个词法单元:错误。只有语言没有定义 >=,或扫描规则明确要求拆分时,才会输出两个词法单元。
  • 丢弃“=”,只保留“>”:错误。词法分析不能随意丢弃构成合法运算符的输入字符。
  • 交给语法分析器逐字符决定:错误。运算符的字符切分属于词法分析职责,语法分析接收的是词法单元序列。
复习

知识点详解

词法分析器常向前读取字符,直到当前路径无法继续匹配,再退回到最后一个接受状态并输出词法单元。这既保证了最长合法前缀,也避免把 >= 错拆成 > 和 =。最长匹配不表示无限吞字符,边界仍由词法模式决定;若两个规则匹配长度相同,还需要借助规则先后次序或关键字表决定类别。

备考速记

先尽量往前读,失败再退到最近一次合法位置。

运算符识别在运算符识别场景中的作用

运算符识别在本题中的核心价值,是解决“某语言同时定义了运算符“>”“=”和“>=”。词法分析器扫描输入 a>=b,并采用最长匹配原则,则在读到“>=”时应当()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。

拓展

同类题怎么考

  • 比较 = 与 ==、> 与 >=、+ 与 ++ 的识别结果。
  • 给出自动机运行轨迹,判断扫描器回退到哪个接受状态。
  • 考查关键字与标识符同长度冲突时的规则优先级。
运算符识别在软件设计师软考中的考法

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

解题思路

扫描器读到 > 时,其实已经有一个可交卷的答案,但它会先忍一下,再看一位。下一位 = 能把答案延长成合法的 >=,于是选择更长的那个。只有再往后读不能构成合法词素时,才回到最近一次可接受的位置。

考点定位

最长匹配也称最大吞噬原则:从当前输入位置选择能够被某个词法模式接受的最长前缀;若继续读取后失败,则回到最近的接受状态。

易错提醒

  • 一进入接受状态就提交词法单元,没有继续尝试更长匹配。
  • 把最长匹配理解成整行越长越好,而不是从当前扫描位置取最长合法前缀。
  • 认为关键字和标识符冲突只靠最长匹配解决,忽略同长度规则还需要优先级。

备考提示

  • 用 >、>=、>> 三个模式手动画扫描过程,记录每次到达接受状态的位置。
  • 把“最长匹配”和“规则优先级”分开:前者先比长度,同长度冲突再按语言规则处理。

你可能还想了解

  • 最长匹配和到达接受状态有什么区别?
  • 词法分析器为什么需要记录最近接受位置?
  • 关键字与标识符匹配长度相同时怎么处理?
  • 最大吞噬原则会不会把两个词法单元错误合并?

本文小结

扫描 a>=b 时,读到 > 虽已合法,但继续读取 = 可以形成更长的合法运算符 >=,因此应输出一个 >= 词法单元。最长匹配比较的是当前位置开始的最长合法前缀。