📜  编译器设计中的错误处理

📅  最后修改于: 2021-06-28 07:22:45             🧑  作者: Mango

错误处理过程的任务是检测每个错误,将其报告给用户,然后制定一些恢复策略并实施它们以处理错误。在整个过程中,程序的处理时间不应太慢。错误是符号表中的空白条目。

错误的类型或来源–错误有两种:运行时错误和编译时错误:

  1. 运行时错误是在程序执行期间发生的错误,通常是由于不利的系统参数或无效的输入数据而发生的。缺少足够的内存来运行应用程序或与另一个程序发生内存冲突以及逻辑错误就是这种情况的示例。当执行的代码未产生预期的结果时,将发生逻辑错误。逻辑错误最好通过精心的程序调试来处理。
  2. 在执行程序之前,编译时错误会在编译时增加。这样的示例就是语法错误或文件引用丢失,导致程序无法成功编译。

编译时错误的分类–

  1. 词法:这包括标识符,关键字或运算符的拼写错误
  2. 语法:缺少分号或括号不平衡
  3. 语义的:值分配不兼容或运算符和操作数之间的类型不匹配
  4. 逻辑:代码不可访问,无限循环。

查找错误或报告错误–可行前缀是解析器的属性,该语法允许及早检测语法错误。

  • 目标:在不进一步消耗不必要输入的情况下尽快检测到错误
  • 方法:输入的前缀与字符串中任何字符串的前缀不匹配时,立即检测错误
    语。
  • 例如: for( ; ),这将报告一个错误,因为括号内有两个分号。

错误恢复–
编译器的基本要求是简单地停止并发出一条消息,然后停止编译。以下是一些常见的恢复方法。

  1. 紧急模式恢复:这是错误恢复的最简单方法,并且还可以防止解析器在恢复错误时形成无限循环。解析器一次丢弃一个输入符号,直到找到一组指定的(如结束符,分号)同步令牌之一(通常是语句或表达式终止符)为止。当同一语句中很少有多个错误时,这已足够。示例:考虑错误的表达式-(1 + + 2)+3。紧急模式恢复:向前跳到下一个整数,然后继续。野牛:使用特殊的终端错误来描述要跳过的输入量。
    E->int|E+E|(E)|error int|(error) 
  2. 相位电平恢复:对输入进行本地校正以修复错误。但是在这种策略中,纠错是困难的。
  3. 错误产生:编译器设计人员知道某些常见的错误,可能会在代码中发生。也可以使用增强语法,因为当遇到这些错误时它们会生成错误的构造。示例:写5x而不是5 * x
  4. 全局更正:其目的是在将错误的输入字符串转换为有效字符串,进行尽可能少的更改。该策略的实施成本很高。

下一篇相关文章–编译器中的错误检测和恢复