乐兴错误与解析错误

时间:2019-12-10 18:11:10

标签: compiler-construction

我正在编写一种比我在学校记得更复杂的语言的编译器。它仍然很简单,但是我遇到了关注点分离的问题。我猜编译器构造课程实在太难了...

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

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

鉴于此,什么将构成词法分析器错误?我可以猜测不是有效词素的任何内容(例如,根据语法语法,日语字母可能没有词法),但是还有其他内容吗?从精神上讲,我正在尝试建立一个模型,该模型应该将词法分析器和解析器之间的关注点分开。

1 个答案:

答案 0 :(得分:2)

不能被标记化的输入的经典情况是未终止的字符串文字。当缺少结束定界符时,带有定界注释的语言(例如C)的标记也会失败。

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

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