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

时间:2010-02-03 12:40:23

标签: c compiler-construction yacc bison lex

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

2 个答案:

答案 0 :(得分:3)

通常错误越复杂,用于声明错误的代码就越复杂。词典和解析器相当简单(在实践中),因此可以捕获简单的错误。

  1. Lexers 捕获构成令牌的无效字符序列
  2. 语法分析工具(如Bison / Yacc)会捕获构成语法和语句的无效令牌序列。
  3. 复杂错误通常发生在运行时的其他位置或编译时的各种转换中。示例可能包括引用不存在的函数/方法。关闭范围/绑定,对象和引用标识符,参数有效性,重载以及大量其他语言相关的东西。

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

    考虑:

    a.b();
    ab();
    

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

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

    2. 您可以使用ID解析代码替换两个语句,以便在运行时下运行,以产生运行时错误而不是编译器错误。

    3. 运行时和编译时解析和语义之间的差异可能很微妙,而且语言与语言之间存在很大差异。

      错误通常在已知为错误且您拥有最多信息时被捕获。这在语言和实现之间有所不同。

答案 1 :(得分:0)

错误处理应在词法分析和解析过程中完成。 应尽可能早地通过扫描程序本身捕获诸如无效字符之类的令牌错误。 但是扫描程序无法捕获语法错误等错误,因此可以在解析器中处理这些错误。