编译原理学习笔记(十一)错误处理
错误处理
说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。
1. 目标:编译程序对于语法和语义正确的源程序要正确地编译生成等价的目标代码;而对于错误的源程序不能一发现就停止,而是要能检查出错误的性质和出错位置,并使编译能继续下去,同时尽可能多而准确地发现错误和指出各种错误。
2. 编译器的错误处理能力
- 诊察各类错误的能力。
- 报错及时准确(出错位置,错误性质)。
- 一次编译找出错误的多少。
- 改正错误的能力。
- 遏制重复错误信息的能力。
3. 错误分类:语法错误、语义错误。
语法错误:程序结构不符合语法(包括词法)规则的错误。如漏掉分号、小数点写成逗号等错误。
语义错误:程序不符合语义规则或超越具体计算机系统的限制。如标识符先声明再使用、溢出错误等。
4. 错误诊察
(1)违反语法和语义规则以及超过编译系统限制的错误。由编译程序在语法和语义分析过程中诊察出来。(语义分析要借助符号表)
(2)下标越界、计算结果溢出以及动态存储数据区溢出等在目标程序运行时才能检测,因此由目标程序诊察。
对此,编译程序要生成相应的目标程序代码进行检查并处理。
5. 错误报告
(1)报告内容
- 出错位置:即源程序中出现错误的位置。
- 出错性质:可直接显示文字信息或者可给出错误编码。
(2)报告方式
- 分析以后在报告
- 边分析边报告
6. 错误处理
(1)错误改正:指编译诊察出错误以后,根据文法进行错误改正。实际做起来很难,尽量改正如缺少分号这样的小错误。
(2)错误局部化处理:发现错误后吧错误控制在局部范围,避免错误扩散,影响其他部分分析。
- 一般原则:直接跳过。
- 错误局部化处理的实现:递归下降分析法。
- 提高错误局部化程度的方法:合法后继符号集与定制符号集。
7. 目标程序运行时错误检测与处理
- 下标变量下标值越界
- 计算结果溢出
- 动态存储分配数据区溢出
一般处理方法:调用异常处理,打印错误信息和运行现场(寄存器和存储器中的值)等,然后停止程序运行。
引用说明
- 邵老师课堂PDF
- 《编译原理级编译程序构造》