资源描述:
《编译-错误处理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、词法错误语法错误语义错误违反了语言的环境限制数组维数太大循环嵌套层数太多错误处理词法错误、语法错误和语义错误词法错误:不合法单词例:mian(){int3sum;…语法错误:源程序在语法上不符合文法例:A[x,y=B+*C超越系统限制:(计算机系统和编译系统)1.数据溢出错误,常数太大,计算结果溢出。2.符号表、静态存储分配数据区溢出。3.动态存储分配数据区溢出。语义规则标识符先说明后引用标识符引用要符合作用域规定过程调用时实参与形参类型一致参与运算的操作数类型一致下标变量的下标不能越界语义错误主要包括:程序不符合语义规则或超越具体计算机系统的限制错误处理方法有两种
2、:错误校正法:根据文法进行错误改正错误局部化法:把错误的影响限制在一个局部的范围,避免错误扩散和影响程序其他部分的分析错误局部化法词法分析:发现不合法字符,显示错误,并跳过该标识符(单词)继续往下分析。语法语义分析:跳过所在的语法成分(短语或语句),一般是跳到语句右界符,然后从新语句继续往下分析。错误局部化处理的实现(递归下降分析法)err:全局变量,存放错误信息。用递归下降分析时,如果发现错误,便将有关错误信息(字符串或者编号)送err,然后转错误处理程序;出错程序先打印或显示出错位置以及出错信息,然后跳出一段源程序,直到跳到语句的右界符或正在分析的语法成分的合法
3、后继符号为止,然后再往下分析。if_statement(){getsym();/*读下个单词符号*/C();/*表达式处理程序*/ifnotsym=“then”{err:=“缺then”;error();/*出错处理程序*/}else{getsym();statement();}ifsym=“else”{getsym();statement();}}ifthen[else];error(){printf(linecnt,err);dogetsym();while(sym!=“;”orsym!=“end”)}发现错误立
4、即跳到语句结尾处(语句右界符;或end),这样处理较粗糙,将跳过太多;上例中,缺then,就将跳过整个条件语句,使得then后的语句都被跳过而不分析,其中有错误就发现不了(3)提高错误局部化程度的方法若有错,则可跳到then若statement有错,则可跳到elseifthen[else];6.3PL/0编译程序的错误处理对于一些易于校正的错误,如丢了逗号、分号等,则指出出错位置,并加以校正。校正的方式就是补上逗号或分号。对某些错误编译程序难于确定校正的措施,为了使当前的错误不致影响整个程序的崩溃,把错误尽量局
5、限在一个局部的语法单位中这样就需跳过一些后面输入的单词符号,直到读入一个能使编译程序恢复正常语法分析工作的单词为止。通常在它的入口和出口处,调用一个测试程序TEST。当语法分析进入这样的语法单元前,可用测试程序检查当前单词符号是否属于它们开始符号的集合,若不是则出错。在语法单位分析结束时,调用test,检查当前符号是否属于调用该语法单位时应有的后继符号集合。若当前单词符号是属于所给集合,则语法分析正常进行,否则出错。开始符号集合symset=setofsymbol;declbegsys,statbegsys,facbegsys:symset;开始符号集合(*主程序*
6、)declbegsys:=[constsym,varsym,procsym];statbegsys:=[beginsym,callsym,ifsym,whilesym,readsym,writesym];facbegsys:=[ident,number,lparen];后继符号集合fsys作为参数:proceduretest(s1,s2:symset;n:integer);procedureblock(lev,tx:integer;fsys:symset);procedurestatement(fsys:symset);procedureexpression(fsy
7、s:symset);procedureterm(fsys:symset);procedurefactor(fsys:symset);在进入某个语法单位时或在语法单位分析结束时,调用TEST,检查当前单词是否属于该语法单元的开始符号或后跟符号集合。╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳╳TESTTEST开始符号集合与后继符号集合TEST测试过程流程图因子的处理过程例:因子的处理过程procedurefactor(fsys:symset);vari:integer;begin入口:test(facbegsys,fsys,24);whilesyminfacbegsysd