符号表管理技术.ppt
《符号表管理技术.ppt》由会员分享,可在线阅读,更多相关《符号表管理技术.ppt(20页珍藏版)》请在三一办公上搜索。
1、第7章 符号表管理技术,在编译的各个阶段经常要收集、使用出现在源程序中的各种信息,为了方便,通常把这些信息用一些表格进行记录、存储和管理,如常量表、数组信息表等等,这些表统称为符号表。符号表主要保存各类标识符的属性,它在翻译过程中有两个方面的重要作用 1)检查语义的正确性2)辅助生成代码 达到这两个目的的途径是通过插入和检索符号表中记录的标识符属性来实现的。这些属性(如名字、类型、维数等)在声明语句中可直接找到,有些可根据程序中标识符出现的上下文间接地获得。第三章介绍词法分析时提到,从字符串源程序中分离出标识符后,首先查保留字表,如果没有,则确认为标识符,词法分析输出标识符符号,同时还要记住该
2、标识符符号的属性值。在编译时,源程序中每出现一次标识符,就要与符号表打一次交道,主要工作是查表和存取操作,因此,与符号表的交互占据了大量的编译时间。所以,如何有效地操作符号表直接影响编译的效率。,7.1 何时建立和访问符号表,符号表可在词法分析时创建,也可在语义分析时创建。有的编译程序中,符号表在词法分析遍内创建,符号表此时只含有标识符的名字,其它属性要在语义分析阶段填入,而变量在符号表中的位置信息将作为标识符符号的属性出现,构成词法扫描器所产生的单词符号的一部分;语法分析阶段只检查源程序语法的正确性,一般不使用符号表;语义分析程序对该编码形式进行语义正确性分析,遇到声明语句时会填入有关标识符
3、的属性。在符号表中记录的标识符的属性信息会在代码生成阶段用于产生目标代码的指令序列。因此,直到语义分析和代码生成阶段,许多与变量有关的属性才能够相继填入符号表。有的编译程序,只在语义分析时才创建符号表,这样,词法分析只输出标识符符号,而标识符名字作为标识符符号的属性输出。这样,在语义分析阶段根据标识符的属性创建符号表记录,并同时填入其它的属性信息。总之,如果在词法分析阶段创建符号表,只能在符号表中将标识符的名字填入符号表,而其他属性则要在语义分析和代码生成阶段填入。如果在语义分析阶段创建符号表,那么与符号表打交道的就仅局限于语义分析和代码生成部分。,7.2 符号表的组织和内容,符号表的管理程序
4、应该具有快速查找、快速删除、易于使用、易于维护的特点。符号表具体包含那些内容,属性的种类和多少在一定程度上取决于程序设计语言的性质。同样,符号表的组织方式还要根据内存和存取速度的限制做相应的改变。符号表基本上都是由一些表项组成的二维表格,每个表项可分为两部分:第一部分是名字域,用来存放符号的名字;第二部分是属性域,用来记录与该名字相对应的各种属性和特征。,变量名 目标地址 类型 维数或过程的参数数目 变量声明的源程序行号 变量引用的源程序行号 以字母顺序列表的链域,表7.1 符号表示例,第7章 符号表管理技术,名字:名字必须常驻在表中,因为它是在语义分析和代码生成中识别一个具体标识符的依据。在
5、符号表的组织中,一个要解决的重要问题是标识符长度的可变问题。对标识符名字的处理要考虑语言中对标识符长度的规定是定长还是不定长。根据标识符的定义特点,通常采用的存储方法有两种:.定长存贮方法,即为标识符名字域规定一个宽度,标识符按左对齐方式存放在其中,特点是简单且存取速度快,缺点是空间利用率低,标识符长度不能超过名字域的宽度。.集中存贮方法,即开辟一个存放所有标识符的缓冲区,而在标识符名字域中只存放标识符在缓冲区中的偏移地址和标识符的长度。特点是存贮效率高,标识符无长度限制,但存取效率低。如图7.1所示。,ComputerX1FORM1,图7.1集中存贮方法符号表,第7章 符号表管理技术,目标地
6、址:标识符主要作为变量名字。程序中每个变量都必须有一个相应的目标地址,该地址是为该变量分配的内存地址(可能是相对的)。当声明一个变量时,就要为该变量分配内存地址,并将其分配的地址填入符号表中。当该变量在程序的其它处被引用时,可以从符号表中查询该地址,并填入存取该变量值的目标代码中。对于采用静态存储分配的语言(如FIRTRAN),分配的地址是按连续的顺序分配的。对于采用动态存储分配的语言,每个程序块内的变量连续分配,这是一个相对地址,运行时还要根据该程序块分配的数据区的起始地址和变量的相对地址计算出变量的绝对内存地址。如果标识符表示的是函数名或子程序名,则目标地址是该函数或子程序代码的开始地址。
7、如果是数组名,则应为数组模板的起始地址。类型:不同数据类型的变量占据不同大小的内存空间,另外类型检查是语义分析的一项重要工作,所以符号表中要保存每个标识符的数据类型,以便分配内存和进行类型检查。维数及参数个数:这两个属性对类型检查都是重要的。在数组引用时,其维数应当与数组声明中所定义的维数一致,类型检查阶段必须对这种一致性进行检查,另外,维数也用于数组元素地址的计算。过程调用时,实参个数也必须与形参个数一致。实际上,在符号表组织中,把参数的个数看成它的维数是很方便的,因此可以将两个属性合并成一个,另外这种方法也是协调的,因为对这两种属性所做的类型检查是类似的。,第7章 符号表管理技术,(交叉引
8、用表:是一个由编译程序提供的十分重要的程序设计辅助工具。该表包含前面已经讨论过的许多属性,加上声明该变量或首次引用该变量的语句行号以及所有引用该变量的语句行号。链域:列在符号表中的最后一个属性,通常称之为链域,其作用是为了便于产生按字母顺序排序的变量交叉引用表。如果编译程序不产生交叉引用表。则符号表中的链域以及语句的行号属性都可从表中删去。,原则上,一个编译程序使用一张符号表就够了,但是,在源程序中,由于不同种类的符号起着不同的作用,相应于各类符号所需记录的属性往往不同,因此,多数编译程序都是根据符号的不同种类,分别建立不同的符号表,如常数表、变量名表、数组信息表、过程信息表、保留字表、特殊符
9、号表、标准函数名表等等,这样处理起来更方便一些。从编译系统建造符号表的过程来划分,符号表可分为静态表和动态表两大类:一是静态表,即在编译前就已经构造好了的符号表,如保留字表、标准函数名表等。二是动态表,即在编译过程中根据需要构造的符号表,如变量表、数组信息表、过程信息表等等。,7.3 符号表上的操作,在符号表上最常执行的操作是插入和查找,这些操作根据所编译的语言是否具有显示声明而稍有不同。,1、强类型语言所谓强类型语言,即指所有变量都必须显式说明。插入操作发生在变量声明时,即处理一个变量声明语句的时候。在进行插入操作前,首先要查符号表,以确定符号表中无该变量记录,即变量不是重复声明。如果符号表
10、是有序表,则插入之前还要找到需插入变量的正确位置,以便将变量插入符号表的适当位置;如果符号表不是有序表,则可直接将变量附加在符号表尾部。查找符号表操作发生的次数很多。除了插入前要先查符号表外,每次变量引用时都要查找符号表。如果查到,那么查找出的信息将用于语义检查和代码生成,同时可根据变量的上下文对未声明(或预先声明的)变量的有关属性进行推测,发出错误或警告信息、或相应的改正信息;如果没有查到,说明存在变量没有声明就引用的错误,应报告相应的错误信息。,第7章 符号表管理技术,2、弱类型语言所谓弱类型语言,即允许对变量做隐式说明。插入和查询同时发生在每一次变量出现时,因为声明不是显式和强制的,所以
11、任一变量引用都需处理成首次引用。因为无法知道此变量是否已经存在于符号表中,所以对变量的引用都需先查表,如存在,则直接获取变量的全部属性,否则进行插入操作,而且需要从上下文中推测出隐式变量的全部属性。例如,程序中首次出现a=5和x=3.14时,可根据常量5和3.14确定为a为整型变量、x为实型变量。,对于具有块程序结构的语言,允许不同块之间的变量同名,这就要求每个程序块都有一个符号子表,一个程序块内的所有变量属性保存在一个子表中,这就允许不同程序块使用相同的变量名,而在一个程序块内,变量则不允许同名。这种情况下,符号表是一个栈式结构,而在进入块程序和离开块程序时,需要两种附加操作,即定位和重定位
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 符号 管理 技术

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