我们应该在解析通用语言时尽早捕获错误(在 Lex 中)还是在更方便的地方为我们提供更多信息(在 Yacc 中)?各种语言如何解决这个问题?
最佳答案
一般来说,错误越复杂,断言错误的代码就越复杂。词法分析器和解析器相当简单(在实践中),因此可以捕获简单的错误。
- 词法分析器 捕获本应构成 token 的无效字符序列
- 语法分析工具(例如 Bison/Yacc)捕获构成语法和语句的无效标记序列。
复杂 错误通常发生在运行时的其他地方或编译时的各种翻译中。示例可能包括引用不存在的函数/方法。闭包范围/绑定(bind)、对象和引用标识符、参数有效性、重载以及大量其他语言相关的东西。
在 AST 分析或中间代码生成中,非常狭窄的标记/语法范围之外的任何东西都(或应该处理)在这些工具之外。
考虑:
a.b();
ab();
两者都应该通过面向对象语言的词法分析器/解析器,其中两个语句都是有效的。 有错误吗?
如果语言是一种相当静态的语言并且标识符可以在编译时解析,您的编译器可能会在编译时断言这一点。
您可以将这两个语句替换为要在运行时 运行的 ID 解析代码,以产生运行时错误而不是编译器错误。
运行时和编译时解析和语义之间的差异可能很微妙,并且因语言而异。
错误通常会在已知是错误并且您拥有最多信息时被捕获。这因语言和实现而异。
关于c - 在 Lex/Yacc 解析中是否有捕获错误的经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2191875/