我们是否应该尽早(在 Lex 中)解析通用语言时发现错误,或者在哪里更方便并为我们提供更多信息(在 Yacc 中)?各种语言如何解决这个问题?
问问题
786 次
2 回答
3
一般来说,错误越复杂,断言错误的代码就越复杂。词法分析器和解析器相当简单(在实践中),因此可以捕获简单的错误。
- 词法分析器捕获应该构成令牌的无效字符序列
- 诸如 Bison/Yacc 之类的语法分析工具会捕获构成语法和语句的无效标记序列。
复杂错误通常发生在运行时的其他地方或编译时的各种翻译中。示例可能包括引用不存在的函数/方法。闭包范围/绑定、对象和引用标识符、参数有效性、重载以及大量其他与语言相关的东西。
非常狭窄的令牌/语法范围之外的任何内容都(或应该处理)在 AST 分析或中间代码生成中的那些工具之外。
考虑:
a.b();
ab();
对于两种语句都有效的面向对象语言,两者都应该通过词法分析器/解析器。有错误吗?
如果语言是一种相当静态的语言并且可以在编译时解析标识符, 您的编译器可能会在编译时断言这一点。
您可以将这两个语句替换为要在运行时运行的 ID 解析代码,以产生运行时错误而不是编译器错误。
运行时和编译时分辨率和语义之间的差异可能是微妙的,并且因语言而异。
错误通常在已知为错误并且您拥有最多信息的地方被捕获。这因语言和实现而异。
于 2010-02-03T13:02:19.950 回答
0
错误处理应该在词法分析和解析期间进行。扫描器本身应尽早捕获诸如无效字符之类的令牌错误。但是诸如语法错误之类的错误无法被扫描仪捕获,因此这些错误会在解析器中进行处理。
于 2010-02-03T12:47:39.090 回答