《表格模板-符号表的组织与管理 精品.ppt》由会员分享,可在线阅读,更多相关《表格模板-符号表的组织与管理 精品.ppt(64页珍藏版)》请在第一文库网上搜索。
1、1第第六六章章 符号表符号表6.1 符号表的作用符号表的作用6.2 符号表的组织符号表的组织6.3 符号表的建立和查找符号表的建立和查找2【学习目标】【学习目标】符号表作为编译系统的重要设施,贯穿于文法分析、检查和语符号表作为编译系统的重要设施,贯穿于文法分析、检查和语义处理的编译全过程。义处理的编译全过程。本章目的使学生深刻全面地了解符号表的地位和作用;本章目的使学生深刻全面地了解符号表的地位和作用;掌握符号表的组织和管理方法;以及编译过程中符号表的操作掌握符号表的组织和管理方法;以及编译过程中符号表的操作活动过程。活动过程。 3【学习指南】【学习指南】在编译程序中符号表用来存放源程序中出现
2、的有关名字的属在编译程序中符号表用来存放源程序中出现的有关名字的属性信息,这些信息集中反映了名字的语义特征属性。性信息,这些信息集中反映了名字的语义特征属性。符号表在编译全过程的地位和作用非常重要,是进行上下文符号表在编译全过程的地位和作用非常重要,是进行上下文合法性检查和语义处理及代码生成的依据。合法性检查和语义处理及代码生成的依据。符号表总体结构的设计和实现是与源语言的复杂性(包括词符号表总体结构的设计和实现是与源语言的复杂性(包括词法结构、语法结构的复杂性)有关,还与对于编译系统在时法结构、语法结构的复杂性)有关,还与对于编译系统在时间效率和空间效率方面的要求有关。间效率和空间效率方面的
3、要求有关。4【难重点】【难重点】u符号表总体组织的选择原则。符号表总体组织的选择原则。u变量的类型和存储类别等属性的重要性。变量的类型和存储类别等属性的重要性。u采用单表结构时采用单表结构时,如何解决分程序构造中同名名字声明的如何解决分程序构造中同名名字声明的可视性规则。可视性规则。采用分表结构适合哪种语言的编译系统。采用分表结构适合哪种语言的编译系统。56.1 符号表的作用符号表的作用在编译程序中符号表用来存放语言程序中出现的有关标识符在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性。的属性信息,这些信息集中反映了标识符的语义特征属性。1
4、.在词法分析及语法在分析过程中不断积累和更新表中的信在词法分析及语法在分析过程中不断积累和更新表中的信息;息;2.在词法分析到代码生成的各阶段,按各自的需要从表中获在词法分析到代码生成的各阶段,按各自的需要从表中获取不同的属性信息。取不同的属性信息。3.不论编译策略是否分趟,符号表的作用和地位是完全一致不论编译策略是否分趟,符号表的作用和地位是完全一致的。的。6根据编译程序工作阶段的不同划分,名字表中的各种信息将根据编译程序工作阶段的不同划分,名字表中的各种信息将在编译程序工作过程中的适当时候填入。在编译程序工作过程中的适当时候填入。u对于对于就建立符号表的编译程序,当扫描源程就建立符号表的编
5、译程序,当扫描源程序识别出一个单词序识别出一个单词(名字名字)时,就以此名字查找符号表;时,就以此名字查找符号表;若表中无此名的登记项,就将此名字填入符号表中;若表中无此名的登记项,就将此名字填入符号表中;至于与此名相关的其它信息,可视工作方便分别在语法分析、至于与此名相关的其它信息,可视工作方便分别在语法分析、语义分析及中间代码生成等阶段陆续填入。语义分析及中间代码生成等阶段陆续填入。,符号表中的信息可以用于语义检查;,符号表中的信息可以用于语义检查;,编译程序则利用符号表提供的信息选出恰当,编译程序则利用符号表提供的信息选出恰当的代码进行优化;的代码进行优化;,编译程序将依据符号表中的符号
6、名来分,编译程序将依据符号表中的符号名来分配目标地址。配目标地址。7几乎在编译程序工作的全过程中,都需要对符号表进行频繁几乎在编译程序工作的全过程中,都需要对符号表进行频繁地访问地访问(查表或填表查表或填表),其耗费的时间在整个编译过程中占有,其耗费的时间在整个编译过程中占有很大的比例。很大的比例。因此,因此,8符号表的作用符号表的作用1.收集符号属性收集符号属性2.上下文语义的合法性检查的依据上下文语义的合法性检查的依据3.作为目标代码生成阶段地址分配的依据作为目标代码生成阶段地址分配的依据9作用一:收集符号属性作用一:收集符号属性 编译程序扫描编译程序扫描收集有关标识符的属性,并在符号表收
7、集有关标识符的属性,并在符号表中建立符号的相应属性信息。中建立符号的相应属性信息。例如,编译程序分析到下述两个说明语句例如,编译程序分析到下述两个说明语句则在符号表中收集到关于符号则在符号表中收集到关于符号 x 的属性是一个整型变量,的属性是一个整型变量,y 是一个具有是一个具有 10 个元素的整型数组,个元素的整型数组,关于符号关于符号 w 的属性是浮点型简单变量。的属性是浮点型简单变量。 10作用二:上下文语义的合法性检查的依据作用二:上下文语义的合法性检查的依据 同一个标识符可能在程序的不同地方出现,而有关该符号的同一个标识符可能在程序的不同地方出现,而有关该符号的属性是在这些不同情况下
8、收集的。属性是在这些不同情况下收集的。特别是在特别是在多趟编译多趟编译及程序分段编译(在及程序分段编译(在 PASCAL 及及 C 中中以文件为单位)的情况下,更需检查标识符属性在上下文中以文件为单位)的情况下,更需检查标识符属性在上下文中的一致性和合法性。的一致性和合法性。通过符号表中属性记录可进行相应上下文的语义检查。通过符号表中属性记录可进行相应上下文的语义检查。11例如,在一个例如,在一个 C 语言程序中出现语言程序中出现编译过程首先在符号表中记录了标识符编译过程首先在符号表中记录了标识符 A 的属性是的属性是23个整型个整型元素的数组;元素的数组;而后在分析第二、第三这两个定义说明时
9、编译系统可通过符号表而后在分析第二、第三这两个定义说明时编译系统可通过符号表检查出标识符检查出标识符 A 的二次重定义冲突错误。的二次重定义冲突错误。本例还可以看到不论在后二句中本例还可以看到不论在后二句中 A 的其它属性与前一句是否完全的其它属性与前一句是否完全相同,只要标识符名重定义,就将产生重定义冲突的语义错误。相同,只要标识符名重定义,就将产生重定义冲突的语义错误。12作用三:目标代码生成阶段地址分配的依据作用三:目标代码生成阶段地址分配的依据 每个符号变量在目标代码生成时需要确定其在存储分配的位置每个符号变量在目标代码生成时需要确定其在存储分配的位置(主要是相对位置)。语言程序中的符
10、号变量由它被定义的存(主要是相对位置)。语言程序中的符号变量由它被定义的存储类别(如在储类别(如在 C、FORTRAN语言中)或被定义的位置(如分程语言中)或被定义的位置(如分程序结构的位置)来确定。序结构的位置)来确定。例如,在例如,在 C 语言中首先要确语言中首先要确定该符号变量是分配在公共区(定该符号变量是分配在公共区(extern)、文件静态区)、文件静态区(extern static)、函数静态区(函数中)、函数静态区(函数中static)、还)、还是函数运行时的动态区(是函数运行时的动态区(auto)等。)等。,决定该变量在某个区中所处的决定该变量在某个区中所处的具体位置,这通常使
11、用在该区域中相对区头的相对位置确定。具体位置,这通常使用在该区域中相对区头的相对位置确定。而有关区域的标志及相对位置都是作为该变量的语义信息被而有关区域的标志及相对位置都是作为该变量的语义信息被收集在该变量的符号表属性中。收集在该变量的符号表属性中。 13符号的主要属性及作用符号的主要属性及作用1.符号名符号名变量名、函数名、过程名等,重载信息变量名、函数名、过程名等,重载信息2.符号类型符号类型int、float等,函数的类型看返回值等,函数的类型看返回值3.符号的存储类型符号的存储类型Common、Static、Auto、Regist4.符号的作用域及可视性符号的作用域及可视性Public
12、、Private等等5.符号变量的存储分配信息符号变量的存储分配信息静态存储区、动态存储区静态存储区、动态存储区6.符号的其他属性符号的其他属性数组内情向量、结构成员信息、函数及过程的形参数组内情向量、结构成员信息、函数及过程的形参141、符号名、符号名 每个标识符通常由若干个字符(非空格字符)组成的字符串来每个标识符通常由若干个字符(非空格字符)组成的字符串来表达。表达。符号表中设置一个符号名域,存放该标识符,该域通常就是符符号表中设置一个符号名域,存放该标识符,该域通常就是符号表的号表的关键字域关键字域。15通常在语言程序中标识符字符串是一个变量、函数或过程的通常在语言程序中标识符字符串是
13、一个变量、函数或过程的唯唯一标志一标志,因此在符号表中符号名作为表项之间的唯一区别一般,因此在符号表中符号名作为表项之间的唯一区别一般不允许重名。从而该符号名与它在符号表中的位置建立起一一不允许重名。从而该符号名与它在符号表中的位置建立起一一对应之关系,使得我们可以用一个符号在表中的位置(通常是对应之关系,使得我们可以用一个符号在表中的位置(通常是一个整数)来替换该符号名。一个整数)来替换该符号名。通常把一个标识符在符号表中的位置的整数值称之谓该通常把一个标识符在符号表中的位置的整数值称之谓该标识符标识符的内部代码的内部代码。在经过分析处理的语言程序中标识符不再是一个字符串而是一在经过分析处理
14、的语言程序中标识符不再是一个字符串而是一个整数值,这不但便于识别比较而且缩短了表达的长度。个整数值,这不但便于识别比较而且缩短了表达的长度。16根据语言的定义,程序中出现的根据语言的定义,程序中出现的重名标识符重名标识符定义将按照该标识定义将按照该标识符在程序中的作用域和可视性规则进行相应的处理。符在程序中的作用域和可视性规则进行相应的处理。而在符号表运行过程中,而在符号表运行过程中,。在一些允许操作重载在一些允许操作重载(operator over load)的语言中,函的语言中,函数名、过程名是可以重名的,对于这类重载的标识符要通过它数名、过程名是可以重名的,对于这类重载的标识符要通过它们
15、的参数个数和类型以及函数返回值类型来区别,以达到它们们的参数个数和类型以及函数返回值类型来区别,以达到它们在符号表中的唯一性。在符号表中的唯一性。 172、符号的类型、符号的类型 标识符中除标识符中除之外函数和变量标识符都具有数据类之外函数和变量标识符都具有数据类型(型(data type)属性。)属性。对于函数的数据类型指的是该函数值的数据类型。对于函数的数据类型指的是该函数值的数据类型。基本数据类型有整型、实型、字符型、逻辑型(布尔型)及基本数据类型有整型、实型、字符型、逻辑型(布尔型)及位组型等,位组型等,。18随着程序设计语言的发展,语言中变量的类型也得到了扩充,随着程序设计语言的发展
16、,语言中变量的类型也得到了扩充,目前大多数语言已定义了在基本数据类型基础上扩充的目前大多数语言已定义了在基本数据类型基础上扩充的。复合数据类型有数组类型、记录结构类型等,它们都是由基本复合数据类型有数组类型、记录结构类型等,它们都是由基本数据类型组合而成的。数组或记录结构中的每个基本元素可以数据类型组合而成的。数组或记录结构中的每个基本元素可以是基本数据类型,也可以是其它任何一种组合式数据类型,构是基本数据类型,也可以是其它任何一种组合式数据类型,构成嵌套式数据类型定义。作为存储变量地址的指针类型所指向成嵌套式数据类型定义。作为存储变量地址的指针类型所指向的变量同样可以是基本数据类型,也可以是其它任何一种组合的变量同样可以是基本数据类型,也可以是其它任何一种组合式数据类型。定义一个变量的基本数据类型或它的组合类型都式数据类型。定义一个变量的基本数据类型或它的组合类型都是符号表中表示标识符属性的重要信息。是符号表中表示标识符属性的重要信息。符号表中设置一个符号类型域,存放该符号的类型。对复合数符号表中设置一个符号类型域,存放该符号的类型。对复合数据类型,通常还需要设置该类型的扩展成分,以