📜  编译器中的错误检测和恢复

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

在编译的此阶段,将检测用户所犯的所有可能的错误,并以错误消息的形式将其报告给用户。定位错误并将其报告给用户的过程称为“错误处理过程”
错误处理程序的功能

  • 侦查
  • 正在汇报
  • 恢复

错误分类

编译时错误分为三种类型:-

词汇相位错误

这些错误是在词法分析阶段检测到的。典型的词汇错误是

  • 超出标识符或数字常量的长度。
  • 出现非法字符
  • 字符串不匹配
Example 1 : printf("Geeksforgeeks");$
This is a lexical error since an illegal character $ appears at the end of statement.

Example 2 : This is a comment */
This is an lexical error since end of comment is present but beginning is not present. 

错误恢复:
紧急模式恢复

  • 在这种方法中,一次从输入中除去连续的字符,直到找到一组指定的同步令牌为止。同步令牌是定界符,例如;或者 }
  • 优点是易于实现,并保证不会陷入无限循环
  • 缺点是跳过了大量输入而没有检查其他错误

句法相位错误

在语法分析阶段会检测到这些错误。典型的语法错误是

  • 结构错误
  • 缺少运算符
  • 拼写错误的关键字
  • 括号不平衡
Example : swicth(ch)
              {
                 .......
                 .......
              }

关键字switch错误地写为swicth。因此,发生“ Unidentified keyword / identifier”错误。

错误恢复:

  1. 紧急模式恢复
    • 在此方法中,一次删除输入中的连续字符,直到找到一组指定的同步令牌。同步令牌是诸如的符号;或者 }
    • 优点是它易于实现并且保证不会陷入无限循环
    • 缺点是跳过了大量输入而没有检查其他错误
  2. 语句模式恢复
    • 在此方法中,当解析器遇到错误时,它将对其余输入执行必要的更正,以使其余输入语句允许解析器提前解析。
    • 更正可以是删除多余的分号,用分号代替逗号或插入缺少的分号。
    • 在执行校正时,应格外小心,以免发生无限循环。
    • 缺点是很难处理在检测点之前发生实际错误的情况。
  3. 错误产生
    • 如果用户具有可能会遇到的常见错误的知识,则可以通过使用产生错误结构的错误产生来扩展语法来合并这些错误。
    • 如果使用了该选项,则在解析期间可以生成适当的错误消息,并可以继续解析。
    • 缺点是它难以维护。
  4. 整体校正
    • 解析器检查整个程序,并尝试找出最匹配的程序,并且没有错误。
    • 最接近的匹配程序具有较少的可从错误输入中恢复的令牌插入,删除和更改次数。
    • 由于时间和空间的复杂性高,该方法无法实际实施。

语义错误

这些错误是在语义分析阶段检测到的。典型的语义错误是

  • 操作数类型不兼容
  • 未声明的变量
  • 实际论点与正式论点不符
Example : int a[10], b;
                 .......
                 .......
                 a = b;

由于a和b的类型不兼容,因此会产生语义错误。

错误恢复

  • 如果遇到错误“未声明的标识符”则要从中恢复对应标识符的符号表条目。
  • 如果两个操作数的数据类型不兼容,则编译器会自动进行类型转换。