📜  编译器设计-错误恢复

📅  最后修改于: 2021-01-18 05:27:22             🧑  作者: Mango


解析器应该能够检测并报告程序中的任何错误。可以预期,当遇到错误时,解析器应该能够处理该错误并继续解析其余的输入。通常,解析器期望检查错误,但是在编译过程的各个阶段可能会遇到错误。程序在不同的阶段可能会出现以下几种错误:

  • 词法:某些标识符的名称输入错误

  • 句法:缺少分号或括号不平衡

  • 语义:不兼容的值分配

  • 逻辑:代码不可访问,无限循环

可以在解析器中实现四种常见的错误恢复策略来处理代码中的错误。

紧急模式

当解析器在语句中的任何地方遇到错误时,它都通过不处理从错误输入到定界符的输入(例如分号)来忽略语句的其余部分。这是最简单的错误恢复方法,并且还阻止了解析器发展无限循环。

陈述模式

当解析器遇到错误时,它会尝试采取纠正措施,以便语句的其余输入允许解析器提前解析。例如,插入缺少的分号,用分号等代替逗号。解析器设计人员在这里必须小心,因为一个错误的更正可能导致无限循环。

错误产生

编译器设计人员知道某些常见错误可能会在代码中发生。此外,设计人员可以创建要使用的增强语法,因为生成的产品在遇到这些错误时会生成错误的构造。

全局校正

解析器将从整体上考虑该程序,并尝试找出该程序要执行的操作,并尝试找出与其最接近的匹配项,这是没有错误的。当输入了错误的输入(语句)X时,它会为一些最接近的无错误语句Y创建一个解析树。这可能会使解析器在源代码中进行最小的更改,但是由于复杂性(时间和空间)这种策略,尚未付诸实践。

抽象语法树

解析树表示形式不容易被编译器解析,因为它们包含的细节比实际需要的要多。以下面的分析树为例:

解析树

如果仔细观察,我们发现大多数叶子节点是其父节点的单个子节点。在将其提供给下一阶段之前,可以消除该信息。通过隐藏额外的信息,我们可以获得如下所示的树:

抽象语法树

抽象树可以表示为:

抽象语法树表示

AST是具有最少不必要信息的编译器中的重要数据结构。 AST比解析树更紧凑,并且编译器可以轻松使用它。