编译原理演示文稿5.ppt
《编译原理演示文稿5.ppt》由会员分享,可在线阅读,更多相关《编译原理演示文稿5.ppt(36页珍藏版)》请在三一办公上搜索。
1、第五章 符号表 在编译程序的工作过程中,经常需要收集和记录源程序中的一些信息,这些信息往往保存在称为符号表的表中,根据不同的需要可建立如常数表,标识符表各种用途的符号表等。由于每使用一个标识符就需要查表,在整个编译过程中编译程序对这些表格的操作是很频繁的。因此,如何提高填查表的效率直接影响到编译程序的工作效率。编译程序使用的数据结构从使用的目的来看,可分为查找型数据结构和分配型数据结构。查找型数据结构在编译程序中用于构造不同的信息表,保存源程序中不同实体的属性信息。这种结构的特点是每个实体的项只创建一次,但可以查询多次。因此,查询效率很重要。分配型数据结构主要用于处理嵌套结构的程序。其特点是分
2、配给实体的内存地址对实体用户是可知的。因此,不会对其进行查询操作,但分配和回收的速度及内存的使用效率却是十分重要的。这里结合查找型数据结构重点讨论符号表。,5.1 分配型数据结构5.1.1 栈 栈是一种先进后出,后进先出的数据结构;访问栈一般访问的是栈顶元素。栈在编译程序中也起着重要的作用,如递归过程(或函数)中说明的动态的局部变量(非静态变量),每进入一次如递归过程(或函数)就需分配相应的一块存储单元,而这种存储单元的分配却符合栈这种先进后出,后进先出特性。,例:设有PASCAL程序 program calc();var a,b,sum:integer;procedure add(var x
3、,y:integer);begin sum:=x+y;end;begin add(3,5);write(sum);end.,则编译语句 sum:=x+y 时过程add的符号和主程序calc的符号都在符号表中,当过程add编译后其符号没有意义,可以从符号表中退去,如图显示。,为了方便地入栈和退栈,把原来的栈顶元素的地址也放入符号表。如图:,如果一个层次的符号结构看作一个记录的话,有分配符号表和回收符号表的动作:分配时动作:(1)TOP:=TOP+1;/*分配存放原记录底的单元*/(2)TOP*:=RB;/*将原记录底放入栈中*/(3)RB:=TOP;/*RB指向新记录的底*/(4)TOP:=TO
4、P+n;/*将栈指针指向分配后的栈顶*/回收时动作:(1)TOP:=RB-1;/*恢复栈顶*/(2)RB:=RB*;/*将保存的原记录底取出*/,分配和收回示意图如下:,5.1.2 堆 堆是一种非线性结构,它允许随机分配和回收实体。分配请求返回的是指向所分配区域的指针,删除(回收)请求需提供指向回收区域的指针。堆不提供任何访问被分配实体的方式,它假设被分配实体的用户保留了指向分配区域的指针。例:执行以下C程序后堆的状态如图所示:int*ptr1,*ptr2;float*ptr3;ptr1=(int*)calloc(3,sizeof(int);ptr2=(int*)calloc(2,sizeof
5、(int);ptr3=(float*)calloc(3,sizeof(float);free(ptr2);,3个内存区在调用calloc后被分配出去,指针ptr1,ptr2,ptr3分别指向这些区域。free释放了ptr2指向的区域,这就产生了一个“洞”。每个要被分配的区域都假设在分配前包含length域。在使用堆这种数据结构中,反复在堆中分配,释放会造成不少空闲区(洞或碎片)。如何回收这些空闲区,进行合理再分配,以提高内存的利用率是评判内存管理的标准。要回收这些空闲区域,首先必须标明空闲区域,目前常用的技术有引用计数和回收集两种。在引用计数技术中,系统为每个内存区都关联一个引用计数器来指出引
6、用的次数。当新的用户访问该区域时,计数值增加,访问结束后减少。当计数值为0时表明该区域为空闲。这种技术易于执行,但开销会不断增大。回收集技术用两次扫描来辨别空闲区。第一次扫描所有已分配区的指针,标记那些已使用的内存区域;第二次扫描标出所有未标记区,确认它们为空闲区。该技术的开销不会逐渐增大。,为了管理空闲区,系统将空闲区组成空闲链,并设立了一个链头指针,每个空闲区域的第一个字为本区域的长度。第二个字为一个指针指向下一个空闲区。如图所示,以满足分配请求。还可以通过内存重整理,使若干个由链相联系的空闲区合并成一个连续的空闲区以提高内存的使用率。使用空闲链结构时,完成分配请求可采用首次适配法和最佳适
7、配法。,5.2 查找型数据结构 由于在语法分析中采用的是上下文无关的方法,而实际算法语言往往是上下文有关的。如:标识符的前说明后使用问题函数的参数个数和类型匹配。如何解决这些问题一般采用通过填查符号表来决定的。因此如何组织和查找符号表对编译程序的效率有着重大的影响。下面介绍以查找型数据结构的符号表。5.2.1 表的组织 在编译程序中符号表用来存放语言程序中出现的有关标识符(或其它基本符号,如:常量)的属性信息,这些信息反映了标识符的语义特征属性。这些信息可以在词法分析中加入也可以在语法分析中不断积累和更新,而且这些信息可以用在从词法分析到代码生成的各个阶段。,符号表功能可归结为:(1)收集单词
8、(符号)的属性.(2)语义合法性检查.(3)作为地址(内存空间)的分配依据.例:int a;float c100;goto loop loop:则在符号表中可能存在:,例:loop=5;例:c20=100;a=c10*5;1.查找型数据结构和符号表的项 查找型数据结构是由一系列的登记项组成的,每个登记项又有若干信息(称为属性)组成的。一个登记项可以有一个关键字和若干次关键字,根据不同的符号表的组织登记项又可以有固定部分和非固定部分。这些符号表通常含有以下属性:符号名 语言中的标识符可以是一个变量或常量的名字、一个函数或过程的名字以及标号的名字,它是识别字符常量、变量、函数、过程和标号的唯一标志
9、,如将符号名作为关键字则不允许出现相同命名的标识符。也有的语言允许函数的重载,也有的语言每个标识符有相应的作用域,这样重载的标识符就可以通过参数个数或类型,标识符说明的位置来以示区别。,(2)符号的类型 除过程外,函数、变量、常量标号都具有相应的类型属性,如基本数据类型字符型、整型、实型、布尔型和构造型类型数组、记录和枚举类型等。符号的类型直接影响到语义的正确性的检查和代码的生成。(3)符号的存储类别 符号的存储类别规定了符号的存储位置,如C语言中的动态变量、静态变量、寄存器变量和外部变量。对于存放在不同位置的数据所产生的代码显然是不同的。(4)符号的作用域 一个符号在程序中的作用范围,称为它
10、的作用域。一般来说,一个符号的定义位置决定了该符号的作用域。C语言,语言的外部变量作用域是整个程序,因此一个外部变量符号只能出现说明一次。另外,C语言的静态变量虽然它的生成期与外部变量一样,但它的作用域只是说明它的函数。函数的形式参数和函数内说明的变量的作用域为该函数内。分程序结构的作用域只在该分程序内。,例:int a;char a;float a;a=5;,(5)符号变量的存储分配信息 根据符号的存储类别定义和说明它们的位置,以及说明的次序确定每个变量应分配的存储区中的相对位置。(由于动态变量每进入一次需分配同样大小的存储单元)一个编译程序有两类存储区,即静态数据据区和动态数据区。a)静态
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 演示 文稿

链接地址:https://www.31ppt.com/p-5665741.html