第五章符号表组织与管理.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章符号表组织与管理

第五章:符号表的组织和管理 符号表的作用 符号表的主要属性及其作用 符号表的组织结构 名字的作用范围 5.1 符号表的作用 符号表是编译程序中的一个重要的数据结构,它象源程序的一个数据字典,存储了源程序中每个名字及其属性,使用在编译的各个阶段。 (1) 登记符号属性值 在源程序的各个分析阶段,编译程序根据标识符的声明信息收集它属性的有关值,并把它们存放在符合表中。 每种语言规则定义了不同的符号属性;即使是同一个语言,不同的编译程序也可能会定义并且收集不同的属性信息。现代编程语言中一般包括常数声明、变量声明、类型声明和过程/函数声明等四类声明。对于每类声明,编译程序要收集、存储和应用的属性完全不同。 例 C语言的变量声明 short int a; float b = 0.0; 把标识符a声明为短整数型,把b声明为浮点类型,而且初始化为0。那么,编译程序对每个变量要记录它的类型,以便执行类型检查和分配存储,比如短整型变量i占2个字节;要记录它在存储器中的位置(相对位移或绝对地址),以便目标程序运行时访问;若像b有初始值,则还需要记录这个初始值。 (2) 查找符号的属性 符号表存放了源程序中的各种类型的信息,比如数值、变量类型、参数传递的地址等,在分析和翻译源程序的过程中会被不断地查询。 例如,对于上述的变量声明,如果源程序有代码 a + b时,就需要查找、计算表达式中运算数的类型和值,以便计算出表达式。 又如,在源程序中如果出现了函数调用factory (6),编译程序就需要查找到factory的声明,找到实参6的地址并传给形参n,执行函数factory的体,并返回值等。 (2)检查符号的合法性 例如,对于上述声明,代码 a = a + b,C语言的编译将检查变量a和b的类型,把表达式a + b的结果转换成短整型,仅取整数部分进行赋值。 在其它强类型语言,如Pascal和Ada,表达式运算数的类型必须一致,不能进行隐式类型转换,对于这样的表达式a + b,编译程序在语义分析的过程中将发现并报告类型错误的信息。 又如,面向对象语言的继承性和多态性允许同一个消息在不同的环境中调用不同的方法(函数),即调用同名但在不同的类中实现的方法。这就需要编译或者运行时在方法的符号表中查询在参数、返回数以及方法方面名字一致的实现。 (3) 作为目标代码生成阶段地址分配的依据 标识符由它定义的存储类型或它在程序中的位置来确定。 首先是要确定变量存储的区域。例如,在Java语言中,整数的类型(以及所占用的字节)有byte(1个字节)、short(2个字节)、int(4个字节)以及long(8个字节),而float类型占4个字节,double类型占8个字节。又如,对寄存器变量,编译将尽可能地把它们保留在机器的寄存器当中,以提高运行速度;而对在一个文件中定义的外部变量,它们要在不同的源程序文件之间访问,需要编译程序把它们放在所有源程序文件都可以方便寻找到的存储器的位置。 其次,要根据标识符出现的顺序,决定标识符在某个存储区域中的具体位置,而有关区域的标志及其相对位置都是作为该标识符的语义信息存放在它的符号表中的。 5.2 符号表的主要属性及其作用 不同的符号类别包含了不同的属性,由于它们的信息不同,也就导致了符号表的组织有较大的差别。例如,数量类型的变量名字和过程名字: 对于一个变量名要记录其类型(如整型、实型、布尔型等)、占用的存储字节以及相对与某个基准位置的相对位置; 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言允许嵌套过程声明)等信息。 不同的程序语言规定了符号的不同性质以及语法、语义和规则,几种基本的符号属性。 (1)符号名 语言中的符号名通常用标识符来表示。根据语言的定义,程序中出现的重名标识符定义将按照该标识符在程序中的作用域和可视规则进行相应的处理。而在程序的运行过程中,符号表中的符号名始终是唯一的标志。 在一些允许操作重载、类继承的语言中,函数名、操作名允许重名,对于重载操作的标识符,它们可以通过参数的个数与类型以及返回值的类型来区别;而对于操作的继承,编译器可以构造继承图,同时保存类结构,这样就可以为每个操作和属性找到唯一的定义。 例如,对应不同的参数类型,可以定义几个求和重载函数: int sum ( int a, int b) double sum ( double a, double b) float sum(float a, float b, float c) 当某个函数中调用到重载函数时,编译器根据实参的类型和个数去调用相应的函数。 (2)符号种属 由于语言中符号所拥有的属性可能不同,其组织就可以采用不同

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档