编译-第08章-错误处理

编译-第8章-错误处理

本章先总体讲述了错误的分类,然后针对错误应该如何检查,如何报告

检查和报告出来的错误要如何处理,是改正还是跳过,对重复的问题防止信息冗余还要遏止重复信息

8.1 概述

  • 通过一次编译能够把源程序的所有错误检查出来
  • 检查出错误的性质和位置

五个编译器的错误处理能力:✌️课下补充一下

  • 检查出各类错误的能力
  • 准确地指出出错位置及错误性质的能力
  • 通过一次编译能将源程序中的错误尽可能都找出来的能力
  • 具有一定的错误改正的能力
  • 遏制重复错误信息的能力

8.2 错误的分类(针对第一个能力-检查出各类错误的能力)

从编译的角度:错误有两类:

  • 语法错误:语法,词法规则
    • $A[x,y\uparrow:=3,\uparrow1416+T\uparrow(T+H)]$
    • 三个语法错误:缺少’]’;‘,’应为’.’;缺少运算符
  • 语义错误:
    • 不符合语义规则
      • int型的用作string
    • 超越具体计算机系统的限制
      • 计算结果溢出

8.3 错误的检查与报告

错误检查

  1. 对于语法错误,在之前提到的词法分析和语法分析阶段就可以检查出来
  2. 对于语义错误,
    1. 有的是在编译时由语义分析程序检查出来,如同一个变量x被声明两遍
    2. 有的是只有在运行的时候才能检查出来,如计算结果越界,数组下标越界,动态分配存储区溢出,当目标程序运行时发现这些错误,就要调用异常处理子程序,所以说异常处理程序时编译系统的子程序

错误报告

当编译系统检查出错误,就要向用户报告错误的位置和性质

  1. 出错位置:行号和序号,设置行号和序号计数器
  2. 出错性质:文字信息和错误编码
  3. 报错(两种方式)
    1. 分析之后报错
    2. 边分析边打印

8.4 错误处理技术

两种方法:改正和局部化处理

8.4.1 错误改正

根据文法和对程序意图作猜测,但是很困难!!!

1
A := B-C*D+E)

很难判定是哪少了左括号

8.4.2 错误局部化处理

主要的处理方式

发现错误后吧错误限制在一个局部的范围内,避免错误扩散和影响程序其他部分的分析和检查

对于词法分析,检查出某一个词出错,直接把这个词报告,然后跳过这个词即可

对于语法分析,比较复杂,以下展开讲:

  • 以递归下降法分析为例
  • 在递归下降时,对于一段语句,如果检测到错误,直接跳转到 error()
  • 报告错误位置和性质,然后跳过一段源程序,一般跳到语句的右界符,从新语句开始分析
  1. 一般原则
    1. 当诊断到错误以后,就暂停对后面符号的分析,跳过错误所在的语法成分,继续往下分析
    2. ???那一个循环如果循环条件发生错误,循环体呢?所以尽量保证跳过的范围越小越好
    3. 分为语法和语义✌️
  2. 错误局部化处理的实现
    1. 递归下降法分析时直接跳到错误处理子程序
    2. 😭
  3. 😭
  4. 遏制重复错误信息

8.4.3