- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ch9-符号表
第九章 符号表 作用一:收集符号属性 作用二:上下文语义的合法性检查的依据 作用三:作为目标代码生成阶段地址分配的依据 9.2 符号的主要属性及作用 1、符号名 2、符号的类型 3、符号的存储类别 4、符号的作用域及可视性 影响变量可视性的因素: 作用域+函数的形式参数+分程序结构 怎样确定符号的作用域和可视性? 5、符号变量的存储分配信息 6、符号的其它属性 9.3 符号表的组织 按照属性完全相同的方式组织符号 2、 符号表项的排列 线性组织 排序组织及二分法 散列组织 散列冲突与解决冲突方法: 3、关键字域的组织 单表结构 进入第二层分程序后单表结构的符号表情况 进入第三层分程序后单表结构的符号表情况 进入第四层分程序后单表结构的符号表情况 图9.4 折衷方式组织的符号表 第三类符号之符号表 符号表作为一个多元组,表中元组之间的排列组织是构造符号表的重要成分。 在编译程序的整个工作过程中,符号表被频繁地用来建立表项、查找表项,填充和引用表项的属性。因此,表项的排列组织对该系统运行的效率起着十分重要的作用。 符号表项的组织主要采用三种构造方法: 线性法 二分法 散列法 特点:按照符号被扫描到的先后顺序建立符号表中的表项。 例如: 排序组织的符号表:在符号表中的表项按其符号的字符代码串(可以看成一个整数值)的值的大小从大到小 (或从小到大)排列的。 符号查找:二分法。 散列表中的表项位置是由对表项的符号值(即字符代码串)进行某种函数操作(通常称为“杂凑”)所得到的函数值来确定的。这种函数通常被称为杂凑函数。所得到的函数值与该表项在表中位置的对应关系是通过对函数值的“求整”以及相对于表长的“求余”得到的。 为了提高效率降低算法复杂度,通常希望杂凑函数的值本身就是整数。 假设选定杂凑函数fhash,对符号代码值杂凑运算之后得到杂凑值是Vhash,可表示为: vhash=fhask(<符号代码值>) 通常符号表的长度不可能是任意长,而vhash值可能是任意的整数。散列表的表长通常是一个定值N,为使每一个符号都能散列到这样的符号表中,对于决定该符号散列位置的杂凑值需作进一步的处理。采用符号的杂凑值对符号表表长求余的处理后,就可使该符号的位置散列到符号表中了。设符号的散列位置Lhash,则有 Lhash=mod(Vhash,N) 一个具有符号代码值为vsymbol的表项散列见右图所示。 Lhash=mod(fhash(vsymbol),N) 散列冲突:不同符号散列到同一表项位置的现象,称它为散列冲突。 解决冲突方法: 1)表长N取一个素数-可以解决部分由于“求余”操作 所产生的冲突,但不是解决冲突的根本方法。 2)多次散列 杂凑函数的选取是构造散列表的关键。 在编译程序中,符号表的关键字域就是符号本身,可以是语言的保留字,操作符号或标识符(包括变量名,函数名,记录结构标志等)。 语言的词法定义中,对符号有严格定义: 保留字与操作符的名字定义具有唯一确定拼写方法。 标识符通常只规定最大字符个数,甚至是任意个数,但同时规定了涉及到外部有关接口(文件名,函数名等)的外部区分规则及编译程序内部区分规则。 例如在c语言的ANSI标准中规定了外部名必须至少能由前6个字符唯一地区分,并规定了内部名必须至少能由前31个字符唯一地区分。规定外部规则的目的是考虑到与操作系统、汇编程序及其它需要联系的系统之间的匹配,而规定内部规则的目的是考虑到编译程序本身对标识符的识别和区分。 从上面讨论可看到,编译程序中标识符的内部规则是符号表关键字组织的基础和依据。用户程序中的标识符,考虑用户的习惯和程序的可读性,标识符的长度是从1到内部规则规定长度之间任意字符个数。 为使得符号表中存放标识符的关键字段等长,可设置关键字段为标识符的最大长度。 譬如上述C语言的关键字段长度可以是32个(其中31个是存放名字,余一个是存放字符串结束标志“ ”的,这是c语言处理所需要的)。 等长关键字组织方法: 关键字池的索引结构方法: 在此结构中,关键字池可以是一个字符数组,也可以是一个字符串空间。 若关键字池是字符数组,符号表中关键字段可以是一个整型数值段,整型值表示该关键字在池中位置的下标。若关键字是一个字符串,则符号表中关键字段可以是一个指向字符的指针。 9.4 符号表的管理 在编译程序工作过程中,符号表所起的作用反映了符号表的行为特征,符号表的行为通常主要是: 符号表的初始化 符号的登录-动态进行 符号的查找-动态进行 分程序结构的符号表层次管理-动态进行。 1、符号表的初始化 符号表的初始化:在
文档评论(0)