词法分析错误与解析错误

Lexing Errors vs Parsing Errors

我正在为一种比我记得在学校做的更复杂的语言编写编译器。它仍然很简单,但我 运行 陷入关注点分离的问题。我猜编译器构造 class 牵着我们的手太多了...

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

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

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

无法标记化输入的典型情况是未终止的字符串文字。当缺少结束分隔符时,带有分隔注释的语言(例如 C)的标记化也会失败。

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

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