编译-第8章-错误处理
本章先总体讲述了错误的分类,然后针对错误应该如何检查,如何报告
检查和报告出来的错误要如何处理,是改正还是跳过,对重复的问题防止信息冗余还要遏止重复信息
8.1 概述
- 通过一次编译能够把源程序的所有错误检查出来
- 检查出错误的性质和位置
五个编译器的错误处理能力:✌️课下补充一下
- 检查出各类错误的能力
- 准确地指出出错位置及错误性质的能力
- 通过一次编译能将源程序中的错误尽可能都找出来的能力
- 具有一定的错误改正的能力
- 遏制重复错误信息的能力
8.2 错误的分类(针对第一个能力-检查出各类错误的能力)
从编译的角度:错误有两类:
- 语法错误:语法,词法规则
- $A[x,y\uparrow:=3,\uparrow1416+T\uparrow(T+H)]$
- 三个语法错误:缺少’]’;‘,’应为’.’;缺少运算符
- 语义错误:
- 不符合语义规则
- int型的用作string
- 超越具体计算机系统的限制
- 计算结果溢出
- 不符合语义规则
8.3 错误的检查与报告
错误检查
- 对于语法错误,在之前提到的词法分析和语法分析阶段就可以检查出来
- 对于语义错误,
- 有的是在编译时由语义分析程序检查出来,如同一个变量x被声明两遍
- 有的是只有在运行的时候才能检查出来,如计算结果越界,数组下标越界,动态分配存储区溢出,当目标程序运行时发现这些错误,就要调用异常处理子程序,所以说异常处理程序时编译系统的子程序
错误报告
当编译系统检查出错误,就要向用户报告错误的位置和性质
- 出错位置:行号和序号,设置行号和序号计数器
- 出错性质:文字信息和错误编码
- 报错(两种方式)
- 分析之后报错
- 边分析边打印
8.4 错误处理技术
两种方法:改正和局部化处理
8.4.1 错误改正
根据文法和对程序意图作猜测,但是很困难!!!
1 | A := B-C*D+E) |
很难判定是哪少了左括号
8.4.2 错误局部化处理
主要的处理方式
发现错误后吧错误限制在一个局部的范围内,避免错误扩散和影响程序其他部分的分析和检查
对于词法分析,检查出某一个词出错,直接把这个词报告,然后跳过这个词即可
对于语法分析,比较复杂,以下展开讲:
- 以递归下降法分析为例
- 在递归下降时,对于一段语句,如果检测到错误,直接跳转到
error() - 报告错误位置和性质,然后跳过一段源程序,一般跳到语句的右界符,从新语句开始分析
- 一般原则
- 当诊断到错误以后,就暂停对后面符号的分析,跳过错误所在的语法成分,继续往下分析
- ???那一个循环如果循环条件发生错误,循环体呢?所以尽量保证跳过的范围越小越好
- 分为语法和语义✌️
- 错误局部化处理的实现
- 递归下降法分析时直接跳到错误处理子程序
- 😭
- 😭
- 遏制重复错误信息