欢迎来到天天文库
浏览记录
ID:40336232
大小:715.50 KB
页数:55页
时间:2019-07-31
《编译原理实用教程 杨德芳 第10章 符号表和错误处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第10章符号表和错误处理本章学习目标为了检查语义的正确性和生成代码,需要知道源程序中所使用的各种标识符的属性。这些属性常常由编译程序集中起来并存放在一个标识符表或符号表中。本章的主要内容有:符号表的组织和内容符号表的构造和查找分程序的结构10.1符号表的组织和内容在编译的各个阶段经常要收集和使用出现在源程序中的各种信息,为了方便,通常把这些信息用一些表格进行记录、存储和管理,如常量表、数组信息表、保留字表和标识符表等,这些表统称为符号表。符号表主要保存各类标识符的属性,它在翻译过程中有两个方面的重要作
2、用,一是检查语义的正确性,二是辅助生成代码。也就是说在实现语义检查和代码生成时,需要不断插入和检索符号表中标识符的属性来实现。在进行词法分析时,从字符串源程序中分离出标识符后,首先检查保留字表,如果在保留字表中没有,就是标识符,词法分析程序就输出标识符符号,同时记住该标识符符号和属性值。在编译时,源程序中每出现一次标识符,就要和符号表打一次交道,主要工作是查表和存取操作,因此与符号表交互占据了大量的编译时间。所以如何有效地组织和快速查找符号表直接影响编译的效率。符号表可以在词法分析时创建,也可以在语义
3、分析时创建。在编译程序中,符号表在词法分析时创建,此时符号表中只含有标识符的名字,其他属性要在语义分析阶段填入。而变量在符号表中的位置信息将作为标识符符号的属性出现,构成词法分析器所产生的单词符号的一部分;语法分析阶段只检查源程序语法的正确性,一般不使用符号表;语义分析程序对该编码形式进行语义正确性分析,遇到声明语句时会填入有关标识符的属性。在符号表中的标识符的属性信息会在代码生成阶段用于产生目标代码。因此,直到语义分析和代码生成阶段,许多与变量有关的属性才能相继填入符号表。10.1.2符号表的组织在
4、编译程序中,符号表主要用来存放源程序中各种有用的信息。在编译阶段要不断对这些信息进行访问、增加和更新。因此,需要合理组织符号表使符号表占用尽量少的内存空间,同时还要提高访问符号表的效率。符号表中具体需要设计哪些属性也部分的取决于程序设计语言的特点。1.表的属性(1)标识符的名字。一个标识符可以是一个变量的名字、一个函数的名字或一个过程的名字。(2)符号的类型。除过程标识符之外的函数和变量都具有数据类型。(3)符号的存储类别。大多数语言的存储类别有两种方式,一种是公共存储区的变量,另一种是私有存储变量。
5、(4)符号的作用域及可视性。一个符号变量在程序中起作用的范围,称为作用域。一般来讲,定义该符号的位置及存储类关键字决定了该符号的作用域。但是在出现函数的形式参数和分程序的时候,就要考虑可视性的问题。关于变量的作用域和可视性可以结合C语言进行考虑。inta;intfunc(a,b)floata;intb;{…a/*此时的a为形式参数的a*/…}分程序的情况:…{inta;…{chara;…{floata;…}…a…//引用的是chara;//}}(5)符号变量的存储分配信息。通常一个编译程序有两类存储区
6、,即静态存储区和动态存储区。(6)符号表的其他属性符号表还有其它方面的重要信息。1)数组的内情向量在程序设计语言中,数组是一种重要的数据类型。编译程序处理数组主要是把数组的内情向量表登录在符号表中,这些属性信息确定了存储分配时数组占据多大的内存空间。2)记录结构型的成员信息。一个结构体类型的变量,是由若干成员项组成的,因此记录类型的变量在存储空间的大小是由它的成员项来决定。3)函数及过程的形参。函数和过程的形参作为函数或过程的局部变量,又是对外的接口。因此,形式参数的个数、排列次序和类型都必须反映在符
7、号表中。它还是过程调用和语义检查的依据。名字目标地址类型维数声明行引用行指针omputer02129,4,57X1410312,140FORM83246B2481051ANS521054M566062FIRST641073(1)名字。就是指标识符的名字属性。(2)目标地址。标识符主要做变量的名字,程序中每个变量都必须有一个相应的目标地址,该地址是为该变量分配的相对内存地址。当声明一个变量时,就要为该变量分配内存空间,并将其分配的地址填入符号表中。当该变量在程序的其他处被引用时,可以从符号表中查询该变量
8、,并填入存取该变量值的目标代码中。对于采用静态存储分配的语言如FORTRAN,地址是连续分配的。对于采用动态存储分配的语言,每个程序块的变量是连续分配的,这是一个相对地址。运行时还要根据该程序块分配的数据区的起始地址和变量的相对地址计算出该变量的绝对内存地址。如果标识符表示的是函数名,则目标地址就是该函数代码的起始地址,是数组名则为数组模板的起始地址。(3)类型。不同数据类型的变量占据不同大小的内存空间,另外类型检查是语义分析的一项重要工作,所以符号表中
此文档下载收益归作者所有