【问题标题】:Lexing Errors vs Parsing Errors词法错误与解析错误
【发布时间】:2019-12-11 03:22:14
【问题描述】:

我正在为一种比我记得在学校所做的更复杂的语言编写编译器。它仍然很简单,但是我遇到了关注点分离的问题。我猜编译器构造类牵着我们的手太多了……

我了解解析错误通常是句法错误。例如,像111a111 这样的字符串可能会被解析为NUMBER IDENTIFIER NUMBER,因为根据语法,该字符串中的每个构造都是有效的词法分析。所以词法分析器不会在这里出错,解析器在验证VALUE 产生式(例如)并发现标识符时会出错。

如果是这种情况,那么正则表达式可以匹配的任何内容都被认为是有效的词位,解析器会处理其他所有内容。

鉴于此,什么会构成词法分析器错误?我可以猜到任何不是有效词位的东西(例如,一个日文字母可能不会根据语法进行词法分析),但还有别的吗?从心理上讲,我正在尝试建立一个模型来区分词法分析器和解析器之间的关注点。

【问题讨论】:

    标签: compiler-construction


    【解决方案1】:

    无法标记化的输入的典型情况是未终止的字符串文字。当关闭分隔符不存在时,带有分隔 cmets 的语言(例如 C)的标记化也可能失败。

    个别语言也可能存在特殊的标记化错误,例如具有显式基数的数字常量中的数字超出范围。 (例如,7#715<em>N</em># 前缀表示“base N”的语言中。)

    在某些情况下,将这些异常情况作为“坏令牌”令牌传递给解析器会被证明是最方便的,而不是尝试重复错误恢复代码。 (尽管从未终止的字符串错误中恢复可能是不必要的,至少在允许多行字符串的语言中。)在其他情况下,例如错误的整数标记,错误恢复可能包括用错误的标记替换相同类型的有效标记;在这种情况下,词法分析器需要访问将错误与输入流相关联的机制。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 2013-02-11
      • 2018-11-07
      相关资源
      最近更新 更多