《编译原理与技术》课件-第6章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《编译原理与技术》课件-第6章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理与技术 编译 原理 技术 课件
- 资源描述:
-
1、编译原理与技术编译原理与技术第第6章章符号表的组织和管理符号表的组织和管理 编译原理与技术编译原理与技术2主要内容主要内容u符号表的作用符号表的作用 u符号表的主要属性及其作用符号表的主要属性及其作用 u符号表的组织结构符号表的组织结构 u名字的作用范围名字的作用范围编译原理与技术编译原理与技术36.1 符号表的作用符号表的作用 u登记符号属性值登记符号属性值在源程序的各个分析阶段,编译程序根据标在源程序的各个分析阶段,编译程序根据标识符的声明信息收集它属性的有关值,并把识符的声明信息收集它属性的有关值,并把它们存放在符合表中。它们存放在符合表中。每种语言规则定义了不同的符号属性;即使每种语言
2、规则定义了不同的符号属性;即使是同一个语言,不同的编译程序也可能会定是同一个语言,不同的编译程序也可能会定义并且收集不同的属性信息。义并且收集不同的属性信息。现代编程语言中一般包括常数声明、变量声现代编程语言中一般包括常数声明、变量声明、类型声明和过程明、类型声明和过程/函数声明等四类声明。函数声明等四类声明。对于每类声明,编译程序要收集、存储和应对于每类声明,编译程序要收集、存储和应用的属性完全不同。用的属性完全不同。编译原理与技术编译原理与技术46.1 符号表的作用符号表的作用例例6.1 C语言的变量声明语言的变量声明short int a;float b=0.0;把标识符把标识符a声明为
3、短整数型,把声明为短整数型,把b声明为浮点声明为浮点类型,而且初始化为类型,而且初始化为0。那么,编译程序对每。那么,编译程序对每个变量要记录它的类型,以便执行类型检查个变量要记录它的类型,以便执行类型检查和分配存储,比如短整型变量和分配存储,比如短整型变量i占占2个字节;个字节;要记录它在存储器中的位置(相对位移或绝要记录它在存储器中的位置(相对位移或绝对地址),以便目标程序运行时访问;若像对地址),以便目标程序运行时访问;若像b有初始值,则还需要记录这个初始值。有初始值,则还需要记录这个初始值。编译原理与技术编译原理与技术56.1 符号表的作用符号表的作用例例6.2 下面是计算阶乘下面是计
4、算阶乘n!的的C语言的函数声明:语言的函数声明:int factory(int n)int t;if(n=0)|n=1)t=1;else t=n factory(n1);return t;对于函数对于函数factory要记录的属性包括:函数的名称,各要记录的属性包括:函数的名称,各种变量如参数、返回值、局部变量及其类型,同时还种变量如参数、返回值、局部变量及其类型,同时还要记录函数的调用信息,以便在函数体执行完毕以后要记录函数的调用信息,以便在函数体执行完毕以后返回到调用点,特别是对这种允许递归调用的函数,返回到调用点,特别是对这种允许递归调用的函数,要为每次调用保留上面提到的所有信息。要为每
5、次调用保留上面提到的所有信息。编译原理与技术编译原理与技术66.1 符号表的作用符号表的作用u查找符号的属性查找符号的属性 符号表存放了源程序中的各种类型的信息,比如数值、符号表存放了源程序中的各种类型的信息,比如数值、变量类型、参数传递的地址等,在分析和翻译源程序变量类型、参数传递的地址等,在分析和翻译源程序的过程中会被不断地查询。的过程中会被不断地查询。例如,对于上述的变量声明,如果源程序有代码例如,对于上述的变量声明,如果源程序有代码a+b时,就需要查找、计算表达式中运算数的类型时,就需要查找、计算表达式中运算数的类型和值,以便计算出表达式。和值,以便计算出表达式。又如,在源程序中如果出
6、现了函数调用又如,在源程序中如果出现了函数调用factory(6),编译程序就需要查找到编译程序就需要查找到factory的声明,找到实参的声明,找到实参6的的地址并传给形参地址并传给形参n,执行函数,执行函数factory的体,并返回值,的体,并返回值,等。等。编译原理与技术编译原理与技术76.1 符号表的作用符号表的作用u检查符号的合法性检查符号的合法性 1.例如,对于上述声明,代码例如,对于上述声明,代码 a=a+b,C语言的编语言的编译将检查变量译将检查变量a和和b的类型,把表达式的类型,把表达式a+b的结果转的结果转换成短整型,仅取整数部分进行赋值。换成短整型,仅取整数部分进行赋值。
7、2.在其它强类型语言,如在其它强类型语言,如Pascal和和Ada,表达式运算数,表达式运算数的类型必须一致,不能进行隐式类型转换,对于这的类型必须一致,不能进行隐式类型转换,对于这样的表达式样的表达式a+b,编译程序在语义分析的过程中将,编译程序在语义分析的过程中将发现并报告类型错误的信息。发现并报告类型错误的信息。3.又如,面向对象语言的继承性和多态性允许同一个又如,面向对象语言的继承性和多态性允许同一个消息在不同的环境中调用不同的方法(函数),即消息在不同的环境中调用不同的方法(函数),即调用同名但在不同的类中实现的方法。这就需要编调用同名但在不同的类中实现的方法。这就需要编译或者运行时
8、在方法的符号表中查询在参数、返回译或者运行时在方法的符号表中查询在参数、返回数以及方法方面名字一致的实现。数以及方法方面名字一致的实现。编译原理与技术编译原理与技术86.1 符号表的作用符号表的作用u作为目标代码生成阶段地址分配的依据作为目标代码生成阶段地址分配的依据 标识符由它定义的存储类型或它在程序中的位置来确定。标识符由它定义的存储类型或它在程序中的位置来确定。首先是要确定变量存储的区域。例如,在首先是要确定变量存储的区域。例如,在Java语言中,整数的语言中,整数的类型(以及所占用的字节)有类型(以及所占用的字节)有byte(1个字节)、个字节)、short(2个字个字节)、节)、in
9、t(4个字节)以及个字节)以及long(8个字节),而个字节),而float类型占类型占4个个字节,字节,double类型占类型占8个字节。又如,对寄存器变量,编译将尽个字节。又如,对寄存器变量,编译将尽可能地把它们保留在机器的寄存器当中,以提高运行速度;而可能地把它们保留在机器的寄存器当中,以提高运行速度;而对在一个文件中定义的外部变量,它们要在不同的源程序文件对在一个文件中定义的外部变量,它们要在不同的源程序文件之间访问,需要编译程序把它们放在所有源程序文件都可以方之间访问,需要编译程序把它们放在所有源程序文件都可以方便寻找到的存储器的位置。便寻找到的存储器的位置。其次,要根据标识符出现的
10、顺序,决定标识符在某个存储区域其次,要根据标识符出现的顺序,决定标识符在某个存储区域中的具体位置,而有关区域的标志及其相对位置都是作为该标中的具体位置,而有关区域的标志及其相对位置都是作为该标识符的语义信息存放在它的符号表中的。识符的语义信息存放在它的符号表中的。编译原理与技术编译原理与技术96.2 符号表的主要属性及其作用符号表的主要属性及其作用不同的符号类别包含了不同的属性,由于它不同的符号类别包含了不同的属性,由于它们的信息不同,也就导致了符号表的组织有们的信息不同,也就导致了符号表的组织有较大的差别。例如,数量类型的变量名字和较大的差别。例如,数量类型的变量名字和过程名字:过程名字:l
11、对于一个变量名要记录其类型(如整型、实型、对于一个变量名要记录其类型(如整型、实型、布尔型等)、占用的存储字节以及相对与某个基布尔型等)、占用的存储字节以及相对与某个基准位置的相对位置;准位置的相对位置;l对一个过程名要记录的属性包括参数的个数及其对一个过程名要记录的属性包括参数的个数及其类型,该过程是否有返回值,过程中的变量声明,类型,该过程是否有返回值,过程中的变量声明,甚至过程声明(如果像甚至过程声明(如果像Pascal语言允许嵌套过程语言允许嵌套过程声明)等信息。声明)等信息。编译原理与技术编译原理与技术106.2 符号表的主要属性及其作用符号表的主要属性及其作用符号名符号名符号种属符
12、号种属符号类型符号类型存储类别存储类别作用域作用域存储分配信息存储分配信息其它属性其它属性符号名符号名 l符号名可以是变量名、函数名(操作名)、类型名、类对象名等符号名可以是变量名、函数名(操作名)、类型名、类对象名等l每个符号名通常由若干个(非空)的字符组成的字符串来表达,在每个符号名通常由若干个(非空)的字符组成的字符串来表达,在语言中它们通常是一个变量、函数或对象的位移标志,因此在符号语言中它们通常是一个变量、函数或对象的位移标志,因此在符号表中的符号名作为表项的唯一区别一般是不允许重名的。表中的符号名作为表项的唯一区别一般是不允许重名的。l符号名与它在符号表中的位置建立起一一对应的关系
13、,这使得我们符号名与它在符号表中的位置建立起一一对应的关系,这使得我们可以用一个符号在表中的位置来代替该符号名、访问其信息。通常可以用一个符号在表中的位置来代替该符号名、访问其信息。通常把一个标识符在符号表中的位置值称为该标识符的内部代码。把一个标识符在符号表中的位置值称为该标识符的内部代码。l在经过分析处理的源程序中,标识符不再是一个字符串而是一个表在经过分析处理的源程序中,标识符不再是一个字符串而是一个表示内部码的整数值,这不但便于识别,而且也可以压缩存储和表达示内部码的整数值,这不但便于识别,而且也可以压缩存储和表达的长度。的长度。编译原理与技术编译原理与技术116.2 符号表的主要属性
14、及其作用符号表的主要属性及其作用 符号名符号名l语言中的符号名通常用标识符来表示。根据语言的定义,程序中出语言中的符号名通常用标识符来表示。根据语言的定义,程序中出现的重名标识符定义将按照该标识符在程序中的作用域和可视规则现的重名标识符定义将按照该标识符在程序中的作用域和可视规则进行相应的处理。而在程序的运行过程中,符号表中的符号名始终进行相应的处理。而在程序的运行过程中,符号表中的符号名始终是唯一的标志。是唯一的标志。l在一些允许操作重载、类继承的语言中,函数名、操作名允许重名,在一些允许操作重载、类继承的语言中,函数名、操作名允许重名,对于重载操作的标识符,它们可以通过参数的个数与类型以及
15、返回对于重载操作的标识符,它们可以通过参数的个数与类型以及返回值的类型来区别;而对于操作的继承,编译器可以构造继承图,同值的类型来区别;而对于操作的继承,编译器可以构造继承图,同时保存类结构,这样就可以为每个操作和属性找到唯一的定义。时保存类结构,这样就可以为每个操作和属性找到唯一的定义。l例如,对应不同的参数类型,可以定义几个求和重载函数:例如,对应不同的参数类型,可以定义几个求和重载函数:int sum(int a,int b)double sum(double a,double b)float sum(float a,float b,float c)l当某个函数中调用到重载函数时,编译器
16、根据实参的类型和个数去当某个函数中调用到重载函数时,编译器根据实参的类型和个数去调用相应的函数。调用相应的函数。编译原理与技术编译原理与技术126.2 符号表的主要属性及其作用符号表的主要属性及其作用符号种属符号种属 l由于语言中符号所拥有的属性可能不同,其组织就可以采用不同由于语言中符号所拥有的属性可能不同,其组织就可以采用不同的数据结构,可以用符号的种属来区别每个符号的基本划分。的数据结构,可以用符号的种属来区别每个符号的基本划分。l根据不同的语言,符号的种属可以包括:简单变量、结构型变量、根据不同的语言,符号的种属可以包括:简单变量、结构型变量、数组、过程、类型、类等。数组、过程、类型、
17、类等。l可以依据符号种属的划分来组织符号表,一种方式是为每个种属可以依据符号种属的划分来组织符号表,一种方式是为每个种属的标识符建立一张表,这样,可以对符号表类似地安排组织结构、的标识符建立一张表,这样,可以对符号表类似地安排组织结构、进行同样的操作;另外一种方式把所有种属的标识符统一安排在进行同样的操作;另外一种方式把所有种属的标识符统一安排在一张表中,根据符号的种属进行条件判断,对不同种属的特殊型一张表中,根据符号的种属进行条件判断,对不同种属的特殊型执行不同的存储安排和操作。执行不同的存储安排和操作。符号名符号名符号种属符号种属符号类型符号类型存储类别存储类别作用域作用域存储分配信息存储
18、分配信息其它属性其它属性编译原理与技术编译原理与技术136.2 符号表的主要属性及其作用符号表的主要属性及其作用符号类型符号类型 l现代程序语言中的一个重要构造就是数据类型(类型),它现代程序语言中的一个重要构造就是数据类型(类型),它是变量标识符的重要属性,函数的数据类型指的是该函数返是变量标识符的重要属性,函数的数据类型指的是该函数返回值的数据类型。回值的数据类型。l现代语言通常都有如下的基本类型:整型、实型、字符型、现代语言通常都有如下的基本类型:整型、实型、字符型、布尔型、逻辑型等;布尔型、逻辑型等;l符号的类型属性从源程序中该符号的定义中得到符号的类型属性从源程序中该符号的定义中得到
19、l变量符号的数据类型属性不但决定了该变量的数据在存储器变量符号的数据类型属性不但决定了该变量的数据在存储器中的存储格式,也规定了可以对该变量施加的操作运算。中的存储格式,也规定了可以对该变量施加的操作运算。符号名符号名符号种属符号种属符号类型符号类型存储类别存储类别作用域作用域存储分配信息存储分配信息其它属性其它属性编译原理与技术编译原理与技术146.2 符号表的主要属性及其作用符号表的主要属性及其作用符号类型符号类型 l目前的大多数语言都在基本类型的基础上定义复合数据类型,目前的大多数语言都在基本类型的基础上定义复合数据类型,如数组、集合和记录。如数组、集合和记录。l许多语言还允许程序员自己
20、定义数据类型。这些复合类型的许多语言还允许程序员自己定义数据类型。这些复合类型的基本元素可以是基本类型,也可以是复合类型。基本元素可以是基本类型,也可以是复合类型。l作为存储变量地址的指针类型所指向的变量可以是基本的数作为存储变量地址的指针类型所指向的变量可以是基本的数据类型,也可以是其它任何一种复合数据类型。据类型,也可以是其它任何一种复合数据类型。符号名符号名符号种属符号种属符号类型符号类型存储类别存储类别作用域作用域存储分配信息存储分配信息其它属性其它属性每一个变量的类型是符号表中标识符属性的重要信息。每一个变量的类型是符号表中标识符属性的重要信息。编译原理与技术编译原理与技术156.2
21、 符号表的主要属性及其作用符号表的主要属性及其作用存储类别存储类别 l大多数程序语言对变量的存储类别采用两种方式。大多数程序语言对变量的存储类别采用两种方式。l一种是用关键字指定,例如,在一种是用关键字指定,例如,在FORTRAN语言中用语言中用COMMON来来定义公共存储区域,允许不同程序段都可以访问这些数据;又如,定义公共存储区域,允许不同程序段都可以访问这些数据;又如,C和和C+语言规定语言规定static定义的变量属于文件的静态存储变量或属定义的变量属于文件的静态存储变量或属于函数内部的静态存储变量,这些变量在编译时分配存储空间,如于函数内部的静态存储变量,这些变量在编译时分配存储空间
22、,如果定义时没有初值,编译器还需要将它们初始化为果定义时没有初值,编译器还需要将它们初始化为0。l另一种方式是根据定义变量的声明在程序中的位置来决定。例如,另一种方式是根据定义变量的声明在程序中的位置来决定。例如,C+规定在一个文件中定义的变量缺省为外部的,即程序的公共存规定在一个文件中定义的变量缺省为外部的,即程序的公共存储变量;而在函数体内缺省存储类别关键字所定义的变量是内部变储变量;而在函数体内缺省存储类别关键字所定义的变量是内部变量,是属于该函数体所独有的私有存储变量,因而是动态地分配存量,是属于该函数体所独有的私有存储变量,因而是动态地分配存储空间。储空间。l区别符号存储类型地属性是
23、编译过程中语义处理、检查和存储分配区别符号存储类型地属性是编译过程中语义处理、检查和存储分配的重要依据。的重要依据。l符号的存储类别同时还决定了符号变量的作用域、可见性和它的生符号的存储类别同时还决定了符号变量的作用域、可见性和它的生命周期等性质命周期等性质。符号名符号名符号种属符号种属符号类型符号类型存储类别存储类别作用域作用域存储分配信息存储分配信息其它属性其它属性编译原理与技术编译原理与技术166.2 符号表的主要属性及其作用符号表的主要属性及其作用作用域作用域 l一个标识符在程序中起作用的范围称为其作用域一个标识符在程序中起作用的范围称为其作用域。l一般来说,定义一个符号的位置及存储类
24、型就决定了该符号一般来说,定义一个符号的位置及存储类型就决定了该符号的作用域,就是它可以出现的场合,可以在程序中作为参数、的作用域,就是它可以出现的场合,可以在程序中作为参数、表达式的运算数等被引用。表达式的运算数等被引用。lC语言中外部变量的作用域是整个程序,一个外部符号的定语言中外部变量的作用域是整个程序,一个外部符号的定义在整个策划能够许中只能出现一次,为了方便使用和编译,义在整个策划能够许中只能出现一次,为了方便使用和编译,同名标识符的其它说明可以多次出现。同名标识符的其它说明可以多次出现。lFORTRAN语言中的语言中的COMMON变量的作用域则不是整个程变量的作用域则不是整个程序,
25、而只能在定义这个序,而只能在定义这个COMMON块的函数或过程中引用。块的函数或过程中引用。l面向对象语言,如面向对象语言,如C+,的每个类都引入了一个独立的类域。,的每个类都引入了一个独立的类域。符号名符号名符号种属符号种属符号类型符号类型存储类别存储类别作用域作用域存储分配信息存储分配信息其它属性其它属性编译原理与技术编译原理与技术176.2 符号表的主要属性及其作用符号表的主要属性及其作用作用域与可见性作用域与可见性 l标识符的标识符的可见性可见性从另外一个角度说明其有效性,它与作用域从另外一个角度说明其有效性,它与作用域有一定一致性。有一定一致性。l标识符的作用域包含可见范围,但是,可
展开阅读全文