《编译原理课件Cha.ppt》由会员分享,可在线阅读,更多相关《编译原理课件Cha.ppt(25页珍藏版)》请在三一办公上搜索。
1、1,第9章 符号表,9.1 符号表的作用和地位9.2 符号的主要属性及作用9.3 符号表的组织9.4 分程序结构的符号表的组织9.5 结合实验,PL0编译器的符号表,9.1 符号表的作用和地位,(1)收集符号信息:在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,符号表中所登记的信息在编译的不同阶段都要用到。(2)语义分析的依据:在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。(3)目标代码生成阶段地址分配的依据:在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对一个多遍扫描的编译程序,不同遍所用的符
2、号表也往往各有不同。因为每遍所关心的信息各有差异。,一张符号表的每一项(或称入口才包含两大栏(或称区段、字域),即名字栏和信息栏。名字栏(NAME)信息栏(INFORMATION)第1项(入口1)第2项(入口2)第n项(入口n)信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,由于查填符号表一般是通过匹配名字来寮现的,因此,名字栏也称主栏。主栏的内容称为关键字(key word)。,在整个编译期间,对于符号表的操作大致可归纳为五类:往表中填入一个新的名字;对给定名字,查询名字是否已在表中;对给定名字,访问它的某些信息;对给定名字,更新它的某些信息;删除一个或一组无用的项。不同种类的表
3、格所涉及的操作往往也是不同的。上述五个方面只是一些基本的共同操作。,9.2 符号的主要属性(信息),几种通常都是需要的。1 符号名(变量名、过程名或函数名)2 符号的类型(数据类型int/float/char等)3 符号的存储类别(静态变量、参数等)4 符号的作用域及可视性 5 符号变量的存储分配信息 6 符号的其它属性 数组内情向量 记录 结构型的成员信息函数及过程的形参,9.3.1 符号表的总体组织,第一种:把属性种类完全相同的那些符号组在一起,构造出表项是分别为等长的多个符号表 第二种:把所有语言中的符号都组织在一张符号表中。组成一张包括了所有属性的庞大的符号表 第三种:折衷方式是根据符
4、号属性相似程度分类组织成若干张表,每张表中记录的符号都有比较多的相同属性。,编译程序按名字的不同种属分别使用许多符号表,如常数表、变量名表、过程名表等等。PROCEDURE INCWAP(M,N)BEGIN 10:KM1 MM4 NK END 经编译头三阶段后所产生的主要表格有:符号名表SNT、常数表CT、过程名表ENT、标号表LT和四元式表QT,符号名表SNT NAME INFORMATION(1)M 参数,整数,变量(2)N 参数,整数,变量(3)K 整数,变量常数表CT 值(VALUE)(1)1(2)4,过程名表ENT NAME INFORMATION(1)INCWAP 二目子程序,入口
5、QT(1)/*记录入口名INCWAP的入口地址 标号表LT LABLE INFORMATION(1)10 QT(4)/*记录了标号10对应的四元式序列号 四元式表QT,9.3.2 符号表项的排列,符号表作为一个多元组,表中元组的排列组织是构造符号表的重要成分。在编译程序的整个工作过程中,符号表被频繁地用来建立表项,找查表项,填充和引用表项的属性。因此表项的排列组织对该系统运行的效率起着十分重要的作用。在编译程序中,符号表项的组织传统上采用三种构造方法。即线性法,排序组织法及散列法。,9.3.3 关键字域的组织,符号表的关键字域(段)就是符号名称 第一种:等长关键字域(段)符号表 第二种:不等长
6、关键字段符号表采用关键字池的索引结构。(P216),其它域的组织,对于数组:维数、上下界值、计算下标量地址 所用的信息以及数组元素类型等对于记录(结构、联合):域的个数、每个域名、地址位移、类型等对于过程或函数:形参个数、所在层次、函数返 回值类型、局部变量所占空间大小等,9.4 分程序结构的符号表组织,对于具有分程序型结构的语言程序,不同层次分程序中定义的标识符号具有不同的作用域和不同的可视性规则。通常对于具有分程序结构的语言可用两种方式组织它们的符号表:(1)分表结构:对每个分程序建立一个独立的 分表结构的符号表;(2)单表结构:把各分程序符号组织在一张单 表结构的符号表中。,9.4.1
7、分表结构的组织管理,基本思想:每当编译程序扫描到一个分程序结构开始时,为该分程序建立一张符号表,在该分程序中定义的标识符,都被登录在该符号表中。而当编译程序扫描到一个分程序的结束时,编译程序释放为该分程序所建立的符号表。这种符号表的分表结构与源程序的分程序层次结构一一对应,9.4.2 单表结构的组织管理,基本思想:所有分程序中定义的标识符都集中在单张符号表中。为了实现分程序构造中标识符的作用域和可视性规则的要求,在符号表中可设立一个属性域用来登录符号所在分程序的层次。进入分程序时,层次要增加一层。在退出一个分程序时,层次降低一层,且需要把符号表中,所有在退出的分程序中登录的符号项清除。,例程序
8、说明部分为:CONST A=35,B=49;VAR C,D,E;PROCEDURE P;VAR G;,名字 类型 层次/值 地址 存储空间,Const(常量)无层次,对应符号表,说明部分的分析与处理(程序),说明类型的定义:object=(constant,variable,procedure)(定义纯量/枚举类型)名字表的定义 table:array0.txmax of record name:alfa;case kind:object of constant:(val:integer);variable,procedure:(level,adr,size:integer);,说明部分的分析
9、与处理,对每个过程说明的对象(变量,常量和过程)造名字表填写标识符的所在层次、属性和分配的相对位置。标识符的属性不同时,所需填入的信息也不同。登录信息由ENTER过程完成。,tx:table表的下标指针,是以值参数形式使用的。dx:计算每个变量在运行栈中相对本过程基地址的偏移量,放在table表中的adr域,生成目标代码时再放在code中的a域,变量定义语句的处理,语法::=var,;程序:if sym=varsym then begin getsym;vardeclaration;(*变量说明处理*)while sym=comma do begin getsym;vardeclaration
10、 end;if sym=semicolon then getsym else error(5)end;,变量说明处理,procedure vardeclaration;begin if sym=ident then begin enter(variable);getsym end else error(4)end(*vardeclaration*);,过程ENTER的实现,tx:table表的下标指针,是以值参数形式使用的。dx:计算每个变量在运行栈中相对本过程基地址的偏移量,放在table表中的adr域,生成目标代码时再放在code中的a域 procedure enter(k:object)
11、;begin(*enter object into table*)tx:=tx+1;with tabletx do(*开域语句*)begin kind:=k;(*表示tabletx.kind:=k;*)name:=id;(*表示tabletx.name:=id;*),过程ENTER的实现,case k of constant:begin if numamax then begin error(31);num:=0;end;val:=num;(*tabletx.val:=num;*)end;,过程ENTER的实现,variable:begin level:=lev;(*表示tabletx.level:=lev*)adr:=dx;(*表示tabletx.adr:=dx*)dx:=dx+1;end;procedur:level:=lev(*表示tabletx.level:=lev;*)end(*case*);end end(*enter*);,PL/0编译程序,Table表的下标指针tx补充说明:,主程序,BLOCK,第1次调用blockBLOCK(0,0,),0,0,.,BLOCK,BLOCK(LEV+1,TX,)(递归进入分程序),LEV,tx,LEV,tx,(6),6(9),1,tx是BLOCK的实际值参,