3

我们是否应该尽早(在 Lex 中)解析通用语言时发现错误,或者在哪里更方便并为我们提供更多信息(在 Yacc 中)?各种语言如何解决这个问题?

4

2 回答 2

3

一般来说,错误越复杂,断言错误的代码就越复杂。词法分析器和解析器相当简单(在实践中),因此可以捕获简单的错误。

  1. 词法分析器捕获应该构成令牌的无效字符序列
  2. 诸如 Bison/Yacc 之类的语法分析工具会捕获构成语法和语句的无效标记序列。

复杂错误通常发生在运行时的其他地方或编译时的各种翻译中。示例可能包括引用不存在的函数/方法。闭包范围/绑定、对象和引用标识符、参数有效性、重载以及大量其他与语言相关的东西。

非常狭窄的令牌/语法范围之外的任何内容都(或应该处理)在 AST 分析或中间代码生成中的那些工具之外。

考虑:

a.b();
ab();

对于两种语句都有效的面向对象语言,两者都应该通过词法分析器/解析器有错误吗?

  1. 如果语言是一种相当静态的语言并且可以在编译时解析标识符, 您的编译器可能会在编译时断言这一点。

  2. 您可以将这两个语句替换为要在运行时运行的 ID 解析代码,以产生运行时错误而不是编译器错误。

运行时和编译时分辨率和语义之间的差异可能是微妙的,并且因语言而异。

错误通常在已知为错误并且您拥有最多信息的地方被捕获。这因语言和实现而异。

于 2010-02-03T13:02:19.950 回答
0

错误处理应该在词法分析和解析期间进行。扫描器本身应尽早捕获诸如无效字符之类的令牌错误。但是诸如语法错误之类的错误无​​法被扫描仪捕获,因此这些错误会在解析器中进行处理。

于 2010-02-03T12:47:39.090 回答