c - 在 Lex/Yacc 解析中是否有捕获错误的经验法则?

标签 c compiler-construction yacc bison lex

我们应该在解析通用语言时尽早捕获错误(在 Lex 中)还是在更方便的地方为我们提供更多信息(在 Yacc 中)?各种语言如何解决这个问题?

最佳答案

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

  1. 词法分析器 捕获本应构成 token
  2. 的无效字符序列
  3. 语法分析工具(例如 Bison/Yacc)捕获构成语法和语句的无效标记序列。

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

在 AST 分析或中间代码生成中,非常狭窄的标记/语法范围之外的任何东西都(或应该处理)在这些工具之外。

考虑:

a.b();
ab();

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

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

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

运行时和编译时解析和语义之间的差异可能很微妙,并且因语言而异。

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

关于c - 在 Lex/Yacc 解析中是否有捕获错误的经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2191875/

相关文章:

c - 如何在 C 中将 fprintf 与动态分配的 unsigned char* 数组一起使用

compiler-construction - 如何推断强制?

c - 英特尔 mpicc 链接器错误未定义对 `_mm_idivrem_epi32' 的引用

c - Lex 和 yacc - 无法编译 y.tab.c 文件

bison - 如何获取启动规则的返回值

c - 使用 RPC 的文件传输(任何类型的文件)

c - 在屏幕上设置装饰 GtkWindow 的框架位置

c++ - 位域如何与字符类型一起使用?

java - Nooby Java 程序员对输出(构造函数)感到困惑

c - 如何解决在 Bison 中使用相同字符的两个不同运算符之间的歧义冲突