符号表管理和错误处理

上传人:平*** 文档编号:47698195 上传时间:2018-07-04 格式:PPT 页数:26 大小:135.35KB
返回 下载 相关 举报
符号表管理和错误处理_第1页
第1页 / 共26页
符号表管理和错误处理_第2页
第2页 / 共26页
符号表管理和错误处理_第3页
第3页 / 共26页
符号表管理和错误处理_第4页
第4页 / 共26页
符号表管理和错误处理_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《符号表管理和错误处理》由会员分享,可在线阅读,更多相关《符号表管理和错误处理(26页珍藏版)》请在金锄头文库上搜索。

1、*1*编 译 原 理*S.PO.P语义分析、生成中间代码生成目标程序代码优化语法分析程序词法分析程序错 误 处 理符 号 表 管 理*2*编 译 原 理*第6章 符号表管理和错误处理1. 明确符号表的作用、内容、组织 2. 明确错误处理的两种方法:错误校正和局部化处理教学目标*3*编 译 原 理* 6.1 符号表管理 6.2 错误处理 6.3 PL/0编译程序的错误处理教学内容*4*编 译 原 理*编译程序中使用最多的数据结构是表 源程序中的各种信息,以便查询或修改 在这些表中,尤以符号表最为重要 生存期最长 使用最为频繁 6.1 符号表管理*5*编 译 原 理*6.1.1 符号表的作用和内容

2、 作用: (1)收集符号的各种信息 (2)语义检查的依据 (3)目标代码生成阶段地址分配的依据 内容:名字栏信息栏 *6*编 译 原 理*6.1.2 符号表的组织 操作: (1)向表中填入一个新标识符。 (2)对于给定一个标识符: 查找是否在表中; 访问它在表中的相关信息; 在表中填写或更新它的某些信息。 (3)更新或删除一个或一组无用的项。*7*编 译 原 理*6.1.2 符号表的组织 符号表的总体组织: (1)多张 (2) 一张 (3)前两种的折中符号表项的组织: (1)线性组织 (2)排序组织 (3)散列组织:效率高,为多数编译程序采用*8*编 译 原 理*Hash表的基本思想是:p为符

3、号表设置一个足够大的空间Mp为符号构造一个散列函数Hash(Ki),使得0 Hash(Ki) M-1,i=1,2,np这样查找Ki时,Hash(Ki)就决定了Ki在符号表中 的位置 *9*编 译 原 理*构造Hash函数的方法:p将标识符中的每个字符转换为一个非负整数p将得到的各个整数组合成一个整数(可以将第一 个、中间的和最后一个字符值加在一起,也可以将 所有字符的值加起来)p将结果数调整到0M-1范围内,可以利用取模的方 法,Ki%M(M为素数)*10*编 译 原 理*解决地址冲突的方法:由于用户定义标识符的随机性,Hash函数值在0M-1范围内 不一定唯一若两个标识符具有相同的函数值,则

4、可用开放地址法或链地 址法解决冲突,有关内容可以参考数据结构的教材。*11*编 译 原 理*词法错误 语法错误 语义错误 违反了语言的环境限制 数组维数太大 循环嵌套层数太多6.2 错误处理*12*编 译 原 理*词法错误、语法错误和语义错误词法错误:不合法单词 例:mian( )int 3sum;语法错误:源程序在语法上不符合文法 例:Ax , y =B+*C*13*编 译 原 理*超越系统限制:(计算机系统和编译系统) 1. 数据溢出错误,常数太大,计算结果溢出。 2. 符号表、静态存储分配数据区溢出。 3. 动态存储分配数据区溢出。语义规则1. 标识符先说明后引用 2. 标识符引用要符合

5、作用域规定 3. 过程调用时实参与形参类型一致 4. 参与运算的操作数类型一致 5. 下标变量的下标不能越界语义错误主要包括:程序不符合语义规则或超越具体计算机系统的限制*14*编 译 原 理*错误处理方法有两种: 错误校正法:根据文法进行错误改正 错误局部化法:把错误的影响限制在一个局部的范围,避免 错误扩散和影响程序其他部分的分析*15*编 译 原 理*错误局部化法词法分析:发现不合法字符,显示错误,并跳过该标识符(单词)继续往下分析。语法语义分析:跳过所在的语法成分(短语或语句),一般是跳到语句右界符,然后从新语句继续往下分析。*16*编 译 原 理*错误局部化处理的实现(递归下降分析法

6、)err: 全局变量,存放错误信息。用递归下降分析时,如果发现错误,便将有关 错误信息(字符串或者编号)送err,然后转错 误处理程序; 出错程序先打印或显示出错位置以及出错信息 ,然后跳出一段源程序,直到跳到语句的右界符 或正在分析的语法成分的合法后继符号为止,然 后再往下分析。*17*编 译 原 理*if_ statement( ) getsym( ); /*读下个单词符号*/C( ) ; /*表达式处理程序*/if not sym=“then”err :=“缺then” ; error( ); /*出错处理程序*/else getsym( );statement( );if sym=“e

7、lse”getsym( );statement( ); if then else;error( )printf(linecnt, err);dogetsym( );while(sym!=“;” or sym!=“end” )发现错误立即跳到语句结尾 处(语句右界符 ; 或end),这 样处理较粗糙,将跳过太多; 上例中,缺then,就将跳过整个 条件语句,使得then后的语句 都被跳过而不分析,其中有错 误就发现不了*18*编 译 原 理*(3) 提高错误局部化程度的方法设 S1: 合法后继符号集 (某语法成分的后继符号)S2: 停止符号集 (跳读必须停止的符号集)error(S1,S2 )p

8、rintf(linecnt, err);dogetsym( );while(sym not in S1 or not in S2 )若有错,则可跳到then 若statement有错,则可跳到elseif then else;*19*编 译 原 理*6.3 PL/0编译程序的错误处理错误局部化处理遵循以下两条原则。 (1)镇定原则 (2)关键字原则在进入某个语法单位时,调用test检查当前符号是否属 于该语法单位的首符号集。若不属于,则滤去首符号和 后继符号集合外的所有符号。 在语法单位分析结束时,调用test,检查当前符号是否 属于调用该语法单位时应有的后继符号集合。若不属于 ,则滤去后继符

9、号和首符号集合外的所有符号。 *20*编 译 原 理*test过程有三个参数:s1、s2、n S1:可允许的下一个符号集合,如果当前符 号不在此集合中,当即得到一个错误号; S2:另加的停止符号集合,在某上出错状态 下,可恢复语法分析继续正常工作的补充单词 符号集合; 整数n,表示有关错误的诊断号。*21*编 译 原 理* 在进入某个语法单位时,调用TEST滤去 开始符号前的所有符号。 在语法单位分析结束时,调用TEST滤去 当前符号到后继符号之间的所有符号。TEST TEST*22*编 译 原 理*开始符号集合与后继符号集合*23*编 译 原 理*TEST测试过程流程图*24*编 译 原 理

10、*void factor(fsys) struct node *fsys; void expression();int m=0,n=0,i;char *tempset =“rpsren“,NULL;struct node *temp;temp=(struct node*)malloc(sizeof(struct node);while(tempsetm!=NULL)temp-pan+=tempsetm+;temp-pan=NULL;test(facbegsys,fsys,24); /* 24:表达式的开始符不能是此符号*/ while(in(sym,facbegsys)=1)if(strcmp

11、(sym,“ident“)=0)i=position(id);if(i=0) error(11);else switch(tablei.kind)因子的处理过程*25*编 译 原 理*case constant: gen(lit,0,tablei.val); break;case variable:gen(lod,lev-tablei.level,tablei.adr); break;case procedur: error(21); break; getsym(); else if (strcmp(sym,“number“)=0)if(numAMAX)error(31); num=0;gen

12、(lit,0,num);getsym(); else if (strcmp(sym,“lparen“)=0)getsym();expression(add(temp,fsys);if (strcmp(sym,“rparen“)=0) getsym();else error(22); test(fsys,facbegsys,23); /*23:因子后的非法符号*/ *26*编 译 原 理*编译程序在其工作过程中使用最多的数据结构是表, 在这些表中,符号表最为重要,它的生存期最长、使 用最频繁。掌握符号表的作用、内容、组织(多采用散列法)明确错误处理的两种方法:错误校正和局部化处理了解局部化处理方法的实现小结

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号