编译原理讲义 (第九章出错处理) 南京大学计算机系 赵建华
编译原理讲义 (第九章 出错处理) 南京大学计算机系 赵建华
错误种类 ·词法错误:在词法分析阶段就可以发现的错误。 ·语法错误:程序的书写不符合语法规则。 语义错误: 静态语乂错误:编译程序可以发现。 动态语乂错误:源程序虽然能够被编译和执行,但是结 果不对。一般是逻辑上的错误。 违反环境限制的错误:由于实现方面的问题,有些 编译器不接受语言的全集。同时语言本身也有限制。 比如:函数说明嵌套的深度,数组的最大层数
错误种类 • 词法错误:在词法分析阶段就可以发现的错误。 • 语法错误:程序的书写不符合语法规则。 • 语义错误: – 静态语义错误:编译程序可以发现。 – 动态语义错误:源程序虽然能够被编译和执行,但是结 果不对。一般是逻辑上的错误。 • 违反环境限制的错误:由于实现方面的问题,有些 编译器不接受语言的全集。同时语言本身也有限制。 比如:函数说明嵌套的深度,数组的最大层数
错误复原 编写程序的过程中,出现错误是不可避免的 编译程序在进行编译的时候,需要检査出程序 的错误。并且给出提示 ·当编译程序碰到源程序中的错误的时候,应该 设法从错误中复原,并继续扫描程序以给出更 多的提示信息、。更多的信息使得程序员能够更 加方便地修改程序 ·可能复原是错误的。所以一般来讲,编译程序 给出的第一个错误是可靠的,而其他的错误信 息可能是不准确的
错误复原 • 编写程序的过程中,出现错误是不可避免的。 • 编译程序在进行编译的时候,需要检查出程序 的错误。并且给出提示。 • 当编译程序碰到源程序中的错误的时候,应该 设法从错误中复原,并继续扫描程序以给出更 多的提示信息。更多的信息使得程序员能够更 加方便地修改程序。 • 可能复原是错误的。所以一般来讲,编译程序 给出的第一个错误是可靠的,而其他的错误信 息可能是不准确的
错误复原的要点 株连信息的遏制 株连信息是指由于源程序中的一个错误而导 致编译程序向用户报告很多相关的出错信息。 而这些信息是不真实的。 重复信息的遏制 是指源程序中的一个错误而反映在源程序的 多处
错误复原的要点 • 株连信息的遏制 – 株连信息是指由于源程序中的一个错误而导 致编译程序向用户报告很多相关的出错信息。 而这些信息是不真实的。 • 重复信息的遏制 – 是指源程序中的一个错误而反映在源程序的 多处
株连信息的例子 已经说明过程p(inta,intb);在使用的时 候写成了pab) 编译程序扫描的时候,首先发现“.”是 错误的,应为a不是结构类型的变量。然 后,发现b是错误的。最后发现p的参数 个数不同 ·这些信息都是由于将‘,’误写做‘而 引起的
株连信息的例子 • 已经说明过程p(int a, int b);在使用的时 候写成了p(a.b)。 • 编译程序扫描的时候,首先发现“.”是 错误的,应为a不是结构类型的变量。然 后,发现b是错误的。最后发现p的参数 个数不同。 • 这些信息都是由于将‘,’误写做‘.’而 引起的
重复信息的例子 如果用户忘了申明变量i(或者声明的时 候变量的拼写错误),而在程序中多出 使用i 编译程序在每次碰到对i使用的时候都 可能发现错误:变量i没有被定义。 这个错误信息将多次出现。而实际上这 个错误是唯一的
重复信息的例子 • 如果用户忘了申明变量i(或者声明的时 候变量的拼写错误),而在程序中多出 使用i。 • 编译程序在每次碰到对i的使用的时候都 可能发现错误:变量i没有被定义。 • 这个错误信息将多次出现。而实际上这 个错误是唯一的
语法错误提示信息(自顶向下) 在自顶向下的扫描过程中,如果扫描程 序碰到了非预期的符号输入,最简单的 提示方法就是: unexpected symbol:? 自顶向下的分析过程中,扫描程序能够 十分清楚地知道当前正在按照什么规 进行扫描,所以提示信息也可以给得更 加详细:在扫描??的时候碰到非预期的
语法错误提示信息(自顶向下) • 在自顶向下的扫描过程中,如果扫描程 序碰到了非预期的符号输入,最简单的 提示方法就是:unexpected symbol: ‘?’ • 自顶向下的分析过程中,扫描程序能够 十分清楚地知道当前正在按照什么规则 进行扫描,所以提示信息也可以给得更 加详细:在扫描???的时候碰到非预期的 符号??
语法错误提示信息(自底向上) 当栈顶状态为S,当前符号为a,而分析表中 AISa没有相应的值得时候,分析程序检查出 源程序的错误 简单的信息提示可以是:预期扫描{??}但是扫 描到了?。其中预期扫描的符号是指所有使 A[S,x」有定义的符号x。 通过分析S对应的项集,我们可以知道,当前 的分析程序试图规约到什么语法成分。那么提 示信息何以更加详细
语法错误提示信息(自底向上) • 当栈顶状态为S,当前符号为a,而分析表中 A[S,a]没有相应的值得时候,分析程序检查出 源程序的错误。 • 简单的信息提示可以是:预期扫描{???}但是扫 描到了?。其中预期扫描的符号是指所有使 A[S,x]有定义的符号x。 • 通过分析S对应的项集,我们可以知道,当前 的分析程序试图规约到什么语法成分。那么提 示信息何以更加详细
昔误的定位 在扫描程序检查到错误的时候,需要告 诉用户,其错误发生在源程序的什么位 置 简单的方法是:在进行词法分析的时候, 记录下每个词法单位(符号)的行和列 扫描程序碰到非预期的符号时,可以在 提示信息中给出该符号的位置
错误的定位 • 在扫描程序检查到错误的时候,需要告 诉用户,其错误发生在源程序的什么位 置。 • 简单的方法是:在进行词法分析的时候, 记录下每个词法单位(符号)的行和列。 扫描程序碰到非预期的符号时,可以在 提示信息中给出该符号的位置
昔误的复原 错误的复原是指编译程序遇到错误的时 候,在给出错误提示后试图越过当前的 错误继续扫描 常用的方法是:对于某个语法成分,如 果该语法成分有一个非常确定的符号作 为结束符号。那么当扫描这个语法成分 时发现错误,程序试图继续扫描到该结 束符号。并把这个符号之前的东西规约 成为相应的语法成分
错误的复原 • 错误的复原是指编译程序遇到错误的时 候,在给出错误提示后试图越过当前的 错误继续扫描。 • 常用的方法是:对于某个语法成分,如 果该语法成分有一个非常确定的符号作 为结束符号。那么当扫描这个语法成分 时发现错误,程序试图继续扫描到该结 束符号。并把这个符号之前的东西规约 成为相应的语法成分