- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章 符号表
编译器的语义分析阶段的任务是:将变量的定义与它们的各个使用联系起来,检查每一个表达式是否有正确的类型,并将抽象语法转换为更简单的、适合于生成机器代码的表示。
语义分析阶段的一个主要的工作是符号表的管理,符号表(symbol table)也称为环境(environment),其作用是将标识符映射到它们的类型和存储位置。在处理类型、变量和函数的声明时,这些标识符便与其在符号表中的“含义”相绑定。每当发现标识符的使用(即非声明性出现)时,便在符号表中查看它们的含义(即类型检查)。
编译器的一个基本功能是记录源程序中使用的标识符并收集与每个标识符相关的各种属性信息。标识符的属性信息表明了该标识符的存储位置,类型,作用域(在哪段程序中有效)等信息。当一个标识符是过程名时,它的属性信息还包括诸如参数的个数与类型,每个参数的传递方法(如传地址方式)以及返回值的类型等信息。
符号表是一个数据结构。每个标识符在符号表中都有一条记录,记录的每个域对应于该标识符的一个属性。这种数据结构允许我们快速地找到每个标识符的记录,并在该记录中快速地存储和检索信息。
当源程序中的一个标识符被词法分析器识别出来时,词法分析器将在符号表中为该标识符建立一条记录。但是标识符的属性一般不能在词法分析中确定。例如,在如下的Pascal源程序的声明
var position, initial, rate: real;
中,当position, initial, rate被词法分析器识别时,它们的数据类型(real)还是未知的。
标识符的属性信息将由词法分析以后的各阶段陆续写入符号表,并以各种方式被使用。例如,当进行语义分析和中间代码生成时,我们需要知道标识符是哪种类型,以便检查源程序是否正确地使用了这些标识符,并在它们之上生成正确的操作。代码生成器将赋予标识符的存储位置信息写入符号表,而且代码生成器还要使用符号表中标识符的存储位置信息。
在这一章中我们主要针对简单C语言的编译器给出符号表的设计及实现。
5.1 符号类型与定义
1.VarInfo
名称
类型
说明
var_name
string
变量名
var_type
string
变量类型(只支持int和用户自定义类型)
var_modifier
string
变量修饰符。0:protected 1:public 2:private
isarray
int
数组标记。0表示简单变量,1表示数组变量
arraysize
int
数组大小。仅当isarray等于1时有效
rva
int
含义较复杂,请见下面的说明
表5.1 VarInfo的设计
Rva:是Relative virtual address的简写。在不同的上下文中有不同的含义,如 REF _Ref135061531 \h \* MERGEFORMAT 表 5.2所示。
全局变量
相对于全局变量起始位置偏移(全局变量一般从0开始)
局部变量
局部变量声明相对于第一个的偏移(函数的第一个局部变量rva为0)
函数参数
参数声明相对于第一个的偏移(函数的第一个参数rva从0开始)
catch块参数
无意义
实际上由于catch块参数当作局部变量处理了,catch块参数rva是从当前函数最后一个局部变量的rva+1
处开始编号。
成员变量
成员变量声明相对于第一个成员(包括从父类继承来的成员)的偏移,从0开始
表5.2 rva在不同上下文中的含义
2.FunInfo
FunInfo是全局函数和成员函数的主类。函数声明包括:函数名、返回类型、参数个、参数列表、局部变量的个数(这里同时可以表示出局部变量所占空间的大小)以及局部变量列表入口地址(需要在代码生成的时候进行填写)。
名称
类型
说明
fun_id
int
函数标识符
fun_name
string
函数名
ret_type
string
0:void 1:int 2:user_defined_type
para_size
int
这里表示的是所有局部变量所占空间的大小;数组的时候可能占多个空间
paravar_list
Hashtable
用来列出所有的参数变量的位置
local_size
int
Hashtable
localvar_list
entry_addr
int
入口地址
表5.3 FunInfo的设计
5.2符号表的生成
1.准备工作---生成语法分析树
在前面已经介绍了符号类型与定义,在这个部分里面我们还要讨论的问题是如何根据输入的抽象语法树生成符号表。
为了讨论的方便,我们采用自顶向下,逐步求精的方法,逐步介绍各个生成符号表中比较重要的模块。
首先要介绍的是analyze.cs这个文件,Analyze.Main这个函数是analyze的主入口,它的流程如下所
您可能关注的文档
最近下载
- 糖尿病视网膜病变的诊断与治疗.ppt VIP
- 劳动课洗衣服教案.pdf VIP
- 2022年版中小学义务教育《语文新课程标准》第一学段“表达与交流”课程要求解读.pptx VIP
- 体验中国传统手工艺.pptx VIP
- 子藏 笔记 后山谈丛-宋-陈师道.docx VIP
- 胎心监护(共70张课件).pptx VIP
- 2022版语文新课标:第一学段“表达与交流”课程要求解读.pdf VIP
- 2025人教版八年级上册英语 Unit 4 Amazing Plants and Animals 第1课时教案 .docx
- 《局域网组建实例教程》课件第10章.pptx VIP
- 精编李佳行政法讲义资料.pdf VIP
文档评论(0)