首页 > 解决方案 > 词法错误与解析错误

问题描述

我正在为一种比我记得在学校做的更复杂的语言编写编译器。它仍然很简单,但是我遇到了关注点分离的问题。我猜编译器构建类牵着我们的手太多了……

我了解解析错误通常是语法错误。例如,类似的字符串111a111可能会被解析为NUMBER IDENTIFIER NUMBER因为该字符串中的每个构造都是根据语法的有效词法分析。所以词法分析器不会在这里出错,解析器在验证VALUE产品(例如)并发现标识符时会出错。

如果是这种情况,那么正则表达式可以匹配的任何内容都被认为是有效的词位,解析器会处理其他所有内容。

鉴于此,什么会构成词法分析器错误?我可以猜到任何不是有效词位的东西(例如,一个日文字母可能不会根据语法进行词法分析),但还有别的吗?在精神上,我正在尝试建立一个模型,我应该将词法分析器和解析器之间的关注点分开。

标签: compiler-construction

解决方案


无法标记化的输入的经典案例是未终止的字符串文字。当没有结束分隔符时,带有分隔注释的语言(例如 C)的标记化也可能失败。

个别语言也可能有特殊的标记化错误,例如具有显式基数的数字常量中的数字超出范围。(例如7#715,在N#前缀表示“base N ”的语言中。)

在某些情况下,将这些异常情况作为“坏令牌”令牌传递给解析器会被证明是最方便的,而不是尝试重复错误恢复代码。(尽管从未终止的字符串错误中恢复可能是不必要的,至少在允许多行字符串的语言中。)在其他情况下,例如错误的整数标记,错误恢复可能包括用错误的标记替换相同类型的有效标记; 在这种情况下,词法分析器需要访问将错误与输入流相关联的机制。


推荐阅读