错误的诊察与校正
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、PL/0语言编译程序中参数错误的处理
1、校正法 对于一些易于校正的错误,如丢了逗号、分号、常量说明中把 等号错成赋值号等,则指出出错位置具体的错误性质和如何校正等信息。
如 CONST a:=3 在调用过程constdeclaration中,执行 procedure constdeclaration begin if sym=ident then begin getsym; if sym in [eql, be comes] then begin if sym=becomes then error (1); ┆ 指出错误性质1,即常数说明中的“=”写成“:=”
procedure test (s1, s2: symset; n: integer);
begin
if not (sym in s1)
then
begin
error (n);
s1:=s1+s2;
while not (sym in s1) do getsym
end
end (* test *);
其中的三个参数。
第三次:
begin (* block *) ┆ ┆ test (fsys, [ ], 8); listcode
在某个过程说明结束后,测验当前单词符号是否属于该过程说明的后继。
第二次:
begin (* block *) ┆ while sym=procsym do begin ┆ end; test (statbegsys+[ident], declbegsys, 7) ┆
在说明部分结束后,测试当前单词符号是否 为说明部分的后继符号。
S1:当语法分析进入或退出某一语法单元时,当前单词符号应属于的集合, 它可能是该语法单元的开始符号集合或后继符号集合。
S2:是补充单词符号集,若当前单词符号不属于S1则出错,为了把错误尽 量局限在一个局部的语法单位中,需跳过一些后面输入的单词符号,为了尽早 恢复语法分析继续正常工作,给出了补充单词符号集合S2。
是否因子开始符∥ while sym in facbegsys do begin ┆ test (tsys, facbegsys, 23) ∥测试当前符号是否
因子后继符∥ end
end (* factor *);
其中facbegsys是因子开始符号集。 fsys是因子后继符号集。
②参数fsys集合的内容
ident number (
then do
. ; ) rop end then do . ; ) rop + - end then do
因 子 ident number (
百度文库
. ; ) rop + - * / end thendo
*注:表2.3中‘rop’表示关系运算符集合,如 =,#,<,<=,>,>=。
2 、局部化法
①测试程序test过程 当语法分析进入某一语法单元时,则用测试程序 test检查当前单词符号是否属于该语法单元的开始 符号集合,若不是则出错。 当语法分析退出某一语法单元时,则用测试程序 test检查当前单词符号是否属于该语法单元的后继 符号集合,若不是,则出错。
下面是PL/0文法非终结符的开始符号与后继符号集合表。
另外,我们将在编译阶段就能发现的错误,称为静态 错;到目标代码运行时才能发现的错误称为动态错,如溢 出,动态数组的下标越界。
二、出错处理
• 主要有两种处理方法
1、校正法
试图对错误进行校正。 当编译程序发现错误时,给用户指出错误的性质、 错误的位置,以及如何校正等方面的信息。
2、局部化法
当发现错误时,跳过错误所在的语法单位,继续往 下分析。以便把错误限制在尽可能小的局部范围内。 只需给用户报告出错误位置,出错性质即可。
主程序中: ┆
declbegsys:=[constsym, varsym, procsym]; statbegsys:=[beginsym, callsym, ifsym, whilesym]; facbegsys:=[ident, number, lparen];
┆ block (0, 0, [period]+doclbegsys+statbegsys);
非终结符名
开始符号集合
后继符号集合
分程序
const var procedure ident if call begin while . ; read wite
语句
ident call begin if while read write
. ; end
条件 表达式
项
odd + - ( ident number +-( ident number
n:出错信息编号 test的功能: 测试当前单词符号是否属于S1,若不属于,则输出第n号错 误,并跳过后边输入的单词符号,直到所输入的单词符号属于S1或S2时为止。
如:procedure factor (fsys: symset) vari: integer; begin test (facbegsys, fsys,. 24); ∥测试当前单词符号
一、错误分类
• 对于源程序,由于种种原因,往往含有或多或少的 错误,因此,一个好的编译程序应具有较强的查错和 改错能力。
1、语法错误
指程序结构、单词和拼写不符合语法要求的规则。 都是在词法分析阶段和语法分析阶段发现的。
如 关键字拼写错误;某些语法成分未按语言的语法 规则编写等。
2、语义错误
•指程序不符合语义规则或超越具体计算机系统的限制。 包括以下几种类型: • 说明错:对变量未说明就引用,某些量被重复说明, 或不符合有关作用域的规定。 • 类型不相容错:某些运算的操作数的类型不相容,形 一实参在种属或类型上不相对应等。 • 对某些值超越限制错:如对各类变量数值范围的限制; 对数组维数、形参个数、循环嵌套数的限制。
实参对应形参
调用procedure block (len, tx::integer; fsys:symset);
参数fsys给出所要分析的语法单位的后继符号集合。
在block过程体中三次调用test过程, 第一次: begin (* block *) ┆ while sym=procsym do begin ┆ test (statbegsys+[ident, procsym], fsys, 6) ┆ end;