第5章 符号表.ppt

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 符号表

第五章 符号表 内容 符号表概述 符号表的内容和用途 设计符号表时需要考虑的几个问题 符号表的创建与使用 符号表的数据结构与算法 5.1 概述 例5-1 C程序的符号定义 #define ERROR -1 #define OK 1 bool check_ok(int i_arg) { if(i_arg==ERROR) return false; else if(i_arg==OK) return true; } int main(void) { bool result; result=false; result=check_ok(ERROR); } 从上例可以看出,对名字的引用和定义在程序中通常并不同时出现在一个地方。例如,对变量result的定义被放在了main函数的开始处,而对result的使用则在其定义后出现了两次。由于这一原因,在对变量result进行使用时,需要查阅该变量在前面的定义。 编译器在处理所遇到的符号时,将其存入符号表。在使用该符号的地方,即可通过符号的名字,从表中查找该符号的相关信息。 5.2 符号表的内容、用途与创建过程 符号表中的符号的主要用途,是给编译器的各模块、算法提供辅助信息的 符号及其所表示的信息 对于一个符号来说,要确定需要记录多少与之相关的信息是与该符号所表示的语言要素包含的信息量密切相关 check_ok函数的信息表示如下: #define BOOL_TYPE 1 #define INT_TYPE 2 #define NAME_STRING struct function_information { int return_type; /*返回值类型。这里可以是 BOOL_TYPE或INT_TYPE*/ int number_of_argument; /*参数个数*/ struct argument_information *pArgList; /*形式参数链表的第一个元素*/ char? *function_name; /*用来记录函数的名字*/ int address; /*本函数第一条指令的地址*/ }; ? 符号表的用途 类型匹配 变量、函数参数等的类型 类型定义(记录特定类型的构成) C语言的typedef,C++等的类定义和继承 地址映射 用于生成代码时,为变量分配地址空间 临时变量和代码优化 生成记录中间结果的临时变量 代码优化时,查询符号表,对存储空间的分配进行调整和优化 5.3 设计符号表时需考虑的几个问题 查询与创建 由于符号通常只定义一次或几次,而引用却很多,因此符号表设计时,应当更多考虑查询时的性能,对创建新条目时的性能要求相对较低 单个符号表和多个符号表 多个表管理复杂,但结构更为清晰,便于对不同类型的符号进行专门处理,以提高效率 层次化与线性表 线性表效率高,但不便于表示层次化作用域 符号表的存在时间 对大多数编译型语言来说,符号表只是编译器在编译时使用的辅助信息表。因此,编译出来的可执行程序中,可以不包含符号表。 然而,对于允许进行独立模块编译乃至动态加载模块的情况(C、C++可以有静态链接库,Linux等环境下允许使用动态链接库),则必须保留库接口相关的部分符号表信息。 为方便对程序进行调试,符号表也可根据需要保留下来(通常是作为独立的符号表文件保存的)。 5.4 符号表的创建和使用 符号表的创建并不是由单个阶段独立完成的,而是在几个阶段中逐渐建立和完善起来的 符号表的创建及其在语义分析中的使用 例如例5.1的情况 第1步,识别函数定义 遇到 ( 时,已经识别出type和id,且可确认识别到的是一个函数。 第2步,识别出参数 遇到 ) 时,识别出i_arg,放入临时符号表。 第3步,填写符号表 归约出func_head时,为check_ok函数填写符号表。同时把i_arg信息也填入其中。 函数体内部符号定义和使用 局部变量的定义,需要在符号表中记录(需要考虑嵌套符号表的情况) 内部遇到对i_arg的访问时,需要查表,以检查其作用域、名称、类型等。 内部遇到对其他函数调用时,查找符号表,对其存在性、形参/实参类型匹配等情况进行检查 符号表在内存分配和代码生成阶段也会频繁使用 内存分配时,根据作用域范围、变量类型等,对各变量分配适当的存储空间 代码生成、优化等阶段,则需要扫描符号表,对各种变量的使用方式进行分析与优化。

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档