编译原理 第九章 错误处理

第九章 错误处理

9.1 概述

编译器的必备功能之一:错误处理

正确的源程序:通过编译,生成目标代码

错误的源程序:通过编译,发现并指出错误

编译器的错误处理能力

  • 诊察错误的能力
  • 报错及时准确(出错位置、错误性质)
  • 一次编译找出错误的多少(一般只找出20个)
  • 改正错误的能力(如word会自动更正拼写错误)
  • 遏制重复错误信息的能力

9.2 错误的分类

语法错误语义错误

语法错误:程序结构不符合语法(包括词法)规则的错误

语义错误:程序不符合语义规则超越具体计算机系统的限制

超越系统限制:

  • 数据溢出错误,常数太大,计算结果溢出
  • 符号表、静态存储分配数据区溢出
  • 动态存储分配数据区溢出
  • 0作为分母

9.3 错误的诊察和报告

错误诊察

1.违反语法和语义规则以及超过编译系统限制的错误。由编译程序在语法和语义分析过程中诊察出来。语义分析要借助符号表

2.下标越界、计算结果溢出以及动态存储数据区溢出等在目标程序运行时才能检测,因此由目标程序诊察出来。编译程序要生成相应的目标程序代码进行检查并处理

错误报告

1.出错位置:即源程序中出现错误的位置

2.出错性质:文字信息/错误编码

3.报告错误:分析以后再报告(设置一个保存错误信息的数据区)/边分析边报告

9.4 错误处理技术

1.错误改正:指编译诊察出错误以后,根据文法进行错误改正。

2.错误局部化处理:指当编译程序发现错误后,尽可能将把错误的影响限制在一个局部的范围,避免错误扩散和影响程序其它部分的分析。

一般原则:诊断到错误后,跳过错误所在的语法成分然后继续往下分析。

错误局部化处理的实现(递归下降分析法):先打印错误信息,跳到语句右界符或正在分析的语法成分的合法后继符号为止,然后再往下分析。即跳过局部的错误,去分析之后的语句。

显然,如果跳过的局部语句太大,错误处理的效率就不高了。

因此需要提高错误局部化程度的方法

设S1:合法后继符号集(跳到这个地方继续往后分析)

S2:停止符号(跳读必须停止的符号集,一个部分分析完了必须停止)

3.目标程序运行时错误检测与处理

  • 下标变量下标值越界
  • 计算结果溢出
  • 动态存储分配数据区溢出

在编译时生成检测该类错误的代码(VScode确实会报错)。

一般处理方法:当目标程序运行检测到这类错误时,就调用异常处理,打印错误信息和运行现场,然后停止程序运行

posted @ 2020-11-28 20:22  QingYuAn_Wayne  阅读(639)  评论(0)    收藏  举报