编译原理 符号表5.ppt
《编译原理 符号表5.ppt》由会员分享,可在线阅读,更多相关《编译原理 符号表5.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第9 9章符号表管理和错误处理章符号表管理和错误处理1.1.明确符号表的作用、内容、组织明确符号表的作用、内容、组织2.2.明确错误处理的两种方法:错误校正和局部化处理明确错误处理的两种方法:错误校正和局部化处理教学目标教学目标9.1 9.1 符号表管理符号表管理9.2 9.2 错误处理错误处理教学内容教学内容编译程序中使用最多的数据结构是表编译程序中使用最多的数据结构是表源程序中的各种信息,以便查询或修改源程序中的各种信息,以便查询或修改在这些表中,尤以在这些表中,尤以符号表符号表最为重要最为重要生存期最长生存期最长使用最为频繁使用最为频繁 9.19.1符号表管理符号表管理9.1.1 符号
2、表的作用和内容符号表的作用和内容 作用:作用:(1)收集符号的各种信息)收集符号的各种信息(2)语义检查的依据)语义检查的依据(3)目标代码生成阶段地址分配的依据)目标代码生成阶段地址分配的依据 内容:内容:名字栏信息栏名字栏信息栏 9.1.2 符号表的组织符号表的组织 操作:操作:(1)向表中填入一个新标识符。)向表中填入一个新标识符。(2)对于给定一个标识符:)对于给定一个标识符:查找是否在表中;查找是否在表中;访问它在表中的相关信息;访问它在表中的相关信息;在表中填写或更新它的某些信息。在表中填写或更新它的某些信息。(3)更新或删除一个或一组无用的项。)更新或删除一个或一组无用的项。9.
3、1.2 符号表的组织符号表的组织 符号表的总体组织:符号表的总体组织:(1)多张)多张(2)一张一张 (3)前两种的折中)前两种的折中符号表项的组织:符号表项的组织:(1)线性组织)线性组织(2)排序组织)排序组织 (3)散列组织)散列组织:效率高,为多数编译程序采用效率高,为多数编译程序采用Hash表的基本思想是:表的基本思想是:p为符号表设置一个足够大的空间为符号表设置一个足够大的空间Mp为符号构造一个散列函数为符号构造一个散列函数Hash(Ki),使得使得0 Hash(Ki)M-1,i=1,2,np这样查找这样查找Ki时,时,Hash(Ki)就决定了就决定了Ki在符号表中在符号表中的位置
4、的位置 构造构造Hash函数的方法:函数的方法:p将标识符中的每个字符转换为一个非负整数将标识符中的每个字符转换为一个非负整数p将得到的各个整数组合成一个整数(可以将第一将得到的各个整数组合成一个整数(可以将第一个、中间的和最后一个字符值加在一起,也可以将个、中间的和最后一个字符值加在一起,也可以将所有字符的值加起来)所有字符的值加起来)p将结果数调整到将结果数调整到0M-1范围内,可以利用取模的方范围内,可以利用取模的方法,法,Ki%M(M为素数)为素数)解决地址冲突的方法:解决地址冲突的方法:由于用户定义标识符的随机性,由于用户定义标识符的随机性,Hash函数值在函数值在0M-1范围内范围
5、内不一定唯一不一定唯一若两个标识符具有相同的函数值,则可用开放地址法或链地若两个标识符具有相同的函数值,则可用开放地址法或链地址法解决冲突,有关内容可以参考址法解决冲突,有关内容可以参考数据结构数据结构的教材。的教材。词法词法错误错误语法语法错误错误语义语义错误错误违反了语言的环境限制违反了语言的环境限制数组维数太大数组维数太大循环嵌套层数太多循环嵌套层数太多6.26.2错误处理错误处理词法错误、语法错误和语义错误词法错误:不合法单词词法错误:不合法单词例:mian()int 3sum;语法错误:语法错误:源程序在语法上不符合文法源程序在语法上不符合文法例:例:Ax,y =B+*C超越系统限制
6、:超越系统限制:(计算机系统和编译系统计算机系统和编译系统)1.数据溢出错误,常数太大,计算结果溢出。数据溢出错误,常数太大,计算结果溢出。2.符号表、静态存储分配数据区溢出符号表、静态存储分配数据区溢出。3.动态存储分配数据区溢出。动态存储分配数据区溢出。语义规则语义规则1.标识符先说明后引用标识符先说明后引用2.标识符引用要符合作用域规定标识符引用要符合作用域规定3.过程调用时实参与形参类型一致过程调用时实参与形参类型一致4.参与运算的操作数类型一致参与运算的操作数类型一致5.下标变量的下标不能越界下标变量的下标不能越界语义错误主要包括:语义错误主要包括:程序不符合语义规则程序不符合语义规
7、则或或 超越具体计算机系统的限制超越具体计算机系统的限制错误处理方法有两种:错误处理方法有两种:错误校正法:错误校正法:根据文法进行错误改正根据文法进行错误改正错误局部化法:错误局部化法:把错误的影响限制在一个局部的范围,避免把错误的影响限制在一个局部的范围,避免错误扩散和影响程序其他部分的分析错误扩散和影响程序其他部分的分析错误局部化法错误局部化法词法分析:词法分析:发现不合法字符,显示错误,并跳发现不合法字符,显示错误,并跳 过该过该标识符标识符(单词单词)继续往下分析。继续往下分析。语法语义分析:语法语义分析:跳过所在的语法成分跳过所在的语法成分(短语或语短语或语 句句),一般是,一般是
8、跳到语句右界符跳到语句右界符,然后从新语句继续往下分析。然后从新语句继续往下分析。错误局部化处理的实现(递归下降分析法)错误局部化处理的实现(递归下降分析法)err:全局变量,存放错误信息。全局变量,存放错误信息。用递归下降分析时,如果发现错误,便将有关用递归下降分析时,如果发现错误,便将有关错误信息(错误信息(字符串或者编号字符串或者编号)送)送err,然后转错然后转错误处理程序;误处理程序;出错程序先打印或显示出错位置以及出错信息,出错程序先打印或显示出错位置以及出错信息,然后跳出一段源程序然后跳出一段源程序,直到跳到语句的右界符或直到跳到语句的右界符或正在分析的语法成分的合法后继符号为止
9、正在分析的语法成分的合法后继符号为止,然后然后再往下分析。再往下分析。if_ statement()getsym();/*读下个单词符号读下个单词符号*/C();/*表达式处理程序表达式处理程序*/if not sym=“then”err:=“缺缺then”;error();/*出错处理程序出错处理程序*/else getsym();statement();if sym=“else”getsym();statement();if then else;error()printf(linecnt,err);do getsym();while(sym!=“;”or sym!=“end”)发现错误立即
10、跳到语句结尾发现错误立即跳到语句结尾处处(语句右界符语句右界符 ;或或end),这这样处理较粗糙样处理较粗糙,将跳过太多;将跳过太多;上例中上例中,缺缺then,就将跳过整就将跳过整个条件语句个条件语句,使得使得then后的语后的语句都被跳过而不分析句都被跳过而不分析,其中有其中有错误就发现不了错误就发现不了(3)提高错误局部化程度的方法提高错误局部化程度的方法设设 S1:合法后继符号集合法后继符号集(某语法成分的后继符号某语法成分的后继符号)S2:停止符号集停止符号集 (跳读必须停止的符号集跳读必须停止的符号集)error(S1,S2)printf(linecnt,err);do getsy
11、m();while(sym not in S1 or not in S2)若若有错有错,则可跳到则可跳到then若若statement有错有错,则可跳到则可跳到elseif then else;编译程序在其工作过程中使用最多的数据结构是编译程序在其工作过程中使用最多的数据结构是表表,在这些表中,在这些表中,符号表符号表最为重要,它的生存期最长、使最为重要,它的生存期最长、使用最频繁。用最频繁。掌握符号表的作用、内容、组织(多采用掌握符号表的作用、内容、组织(多采用散列法散列法)明确错误处理的两种方法:明确错误处理的两种方法:错误校正和局部化处理错误校正和局部化处理了解局部化处理方法的实现了解局
12、部化处理方法的实现小结小结第第1010章章目标程序运行时的存储组织目标程序运行时的存储组织1.1.全面了解目标程序运行时存储区的整体布局;每种存全面了解目标程序运行时存储区的整体布局;每种存储区的组织方式和管理方法;储区的组织方式和管理方法;2.2.参数传递的几种方式参数传递的几种方式教学目标教学目标第十章 目标程序运行时的存储组织10.1 10.1 数据空间的使用与管理数据空间的使用与管理数据空间的使用和管理方法分成二种:数据空间的使用和管理方法分成二种:1)静态存储分配静态存储分配2)动态存储分配动态存储分配栈式动态存储分配栈式动态存储分配堆式动态存储分配堆式动态存储分配如果一个名字的性质
13、通过说明语句或隐式隐式或显显式式规则而定义,则称这种性质是“静态”确定的。在编译时就能编译时就能确定目标程序运行中所需所需的全部数据空间数据空间的大小大小,并安排好安排好目标程序运行时的全部数据空间全部数据空间,确定确定每个数据对象数据对象的存储位置存储位置,这种分配策略为静态存储分配静态存储分配。10.1.1 静态存储分配静态存储分配 动态存储管理技术有两种方式:动态存储管理技术有两种方式:栈式(栈式(stack)堆式(堆式(heap)10.1.2 动态存储分配动态存储分配 如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。因为对于这种
14、程序在编译时无法知道在编译时无法知道它在运行时需要多大的存储空间,它所需要的数据空间的大小需待程序运行时动态地确定。若一个数组所需的存储空间的大小在编译时就已知道,则称它为确定数组,否则称为可变数组。栈式动态存储分配策略适用于栈式动态存储分配策略适用于PASCALPASCAL,C/C+C/C+,ALGOLALGOL之类之类具有具有递归结构递归结构的语言的实现。的语言的实现。将整个程序的数据空间设计为一个栈。在具有递归结构的程将整个程序的数据空间设计为一个栈。在具有递归结构的程序中,当调用一个过程时,所需的数据空间分配在栈顶,当序中,当调用一个过程时,所需的数据空间分配在栈顶,当过程结束时释放空
15、间。过程结束时释放空间。栈式动态存储分配栈式动态存储分配过程所需数据空间包括两部分:(1)生存期在本过程这次活动中的)生存期在本过程这次活动中的数据对象数据对象(2)用以管理过程活动的)用以管理过程活动的记录信息记录信息。即当一次过程调用出现。即当一次过程调用出现时,调用该过程的那个过程的活动即被中断,当前机器的时,调用该过程的那个过程的活动即被中断,当前机器的状态信息,诸如程序计数器(返回地址)、寄存器的值等,状态信息,诸如程序计数器(返回地址)、寄存器的值等,都必须保留在栈中。当控制从调用返回时,便根据栈中记都必须保留在栈中。当控制从调用返回时,便根据栈中记录的信息恢复机器状态,使该过程的
16、活动继续录的信息恢复机器状态,使该过程的活动继续如果一个程序语言提供用户自由地申请数据空间和退还数如果一个程序语言提供用户自由地申请数据空间和退还数据空间的机制,如据空间的机制,如+中的中的newnew,deletedelete等机制,或者不仅等机制,或者不仅有过程而且有进程的程序结构的情况下,空间的使用未必有过程而且有进程的程序结构的情况下,空间的使用未必服从服从“先申请后释放,后申请先释放先申请后释放,后申请先释放”的原则,那么栈式的原则,那么栈式的动态分配方案就不适用了。的动态分配方案就不适用了。通常使用一种称为堆式的动态存储分配方案。通常使用一种称为堆式的动态存储分配方案。堆式动态存储
17、分配定长块管理定长块管理变长块管理变长块管理堆式动态储分配的实现堆式动态储分配的实现定长块管理定长块管理 堆式动态存储分配最简单的实现是按堆式动态存储分配最简单的实现是按定长块定长块进行。进行。(1 1)初始化时,)初始化时,将堆存储空间分成长度相等的若干块将堆存储空间分成长度相等的若干块,每块中指定一个链域,按照邻块的顺序把所有块链成每块中指定一个链域,按照邻块的顺序把所有块链成一个链表,用指针一个链表,用指针availableavailable指向链表中的指向链表中的第一块第一块。(2 2)分配时每次都分配指针)分配时每次都分配指针availableavailable所指的块,然后所指的块
18、,然后availableavailable指向相邻的下一块。指向相邻的下一块。(3 3)归还时,把所归还的块插入链表。考虑插入方便,)归还时,把所归还的块插入链表。考虑插入方便,可以把所归还的块插在可以把所归还的块插在availableavailable所指的块之前,然后所指的块之前,然后availableavailable指向新归还的块。指向新归还的块。变长块管理变长块管理可以根据需要,分配长度不同的存储块,可以随要求而变可以根据需要,分配长度不同的存储块,可以随要求而变(1 1)按这种方法,初始化时存储空间是一个整块。按照)按这种方法,初始化时存储空间是一个整块。按照用户的需要,分配时先是
19、从一个整块里分割出满足需要的用户的需要,分配时先是从一个整块里分割出满足需要的一小块,以后,归还时,如果新归还的块能和现有的空间一小块,以后,归还时,如果新归还的块能和现有的空间能合并,则合并成一块;能合并,则合并成一块;(2 2)如果不能和任何空闲块合并,则可以)如果不能和任何空闲块合并,则可以把空闲块链成把空闲块链成一个链表一个链表。再进行分配时,从。再进行分配时,从空闲块链表空闲块链表中找出满足需要中找出满足需要的一块,或者整块分配出去,或者从该块上分割一小块分的一块,或者整块分配出去,或者从该块上分割一小块分配出去。配出去。首次满足法最优满足法最差满足法?若空闲块表中有若干个满足需要的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 符号表5 编译 原理 符号
限制150内