符号表 NEW解析课件.ppt
《符号表 NEW解析课件.ppt》由会员分享,可在线阅读,更多相关《符号表 NEW解析课件.ppt(73页珍藏版)》请在三一办公上搜索。
1、主要内容,符号表的介绍说明语句的翻译数组元素的引用,符号表,符号表是连接声明与引用的桥梁。一个名字在声明时,相关信息被填写进符号表,而在引用时,根据符号表中的信息生成相应的可执行语句。如何有效记录各类符号的信息,以便于在编译的各个阶段对符号表进行快速、有效的查找、插入、修改、删除等操作,是符号表设计的基本目标之一。,符号表的管理贯穿整个编译过程,既涉及到前端,也涉及后端,尤其与后端的存储空间分配有密切联系。符号表的内容一般仅在编译时使用,如果名字的具体信息需要在运行时确定或使用,则符号表的部分内容还要保留并运行,例如动态数组和跟踪调试信息等。合理组织符号表的内容,以适应不同阶段的需要,也是符号
2、表设计需要考虑的问题之一。,符号表的作用,符号表用来存放程序设计语言中出现的有关标识符的属性和特征。符号表在整个编译期间的作用可归纳为以下几个方面:1、将标识符的名字及属性登陆到符号表中 在分析说明语句的时候,编译程序根据说明语句信息将标识符的相应属性,例如标识符的类型:实型、整型,布尔型等;标识符的种属:数组名,变量名,过程名,函数名等登录到符号表中。,2、辅助上下文语义的正确性检查 例如对运算对象和运算符进行类型检查,对变量进行先定义后使用检查等。通过符号表中的属性记录可进行上述语义检查。,作用域,public class Foo private int value=39;public i
3、nt test()int b=3;return value+b;public void setValue(int c)value=c;int d=c;c=c+d;value=c;public class Bar private int value=42;public void setValue(int c)value=c;,scope of value,scope of b,scope of c,scope of c,scope of value,scope of d,符号表,(Foo),(Test),(setValue),(setValue-block),符号表lookup,(Foo),(T
4、est),(setValue),(setValue-block),public void setValue(int c)value=c;int d=c;c=c+d;value=c;,Lookup(value),Symbol Table Lookup,(Foo),(Test),(setValue),(setValue-block),public void setValue(int c)value=c;int d=c;c=c+d;myValue=c;,Lookup(myValue),Error!,符号表操作,插入插入新的符号插入到当前作用域中查询lookup 在符号表中找到一个符号可能引起到父表中
5、查找当符号没有找到的时候报错符号表类似一个仓库,class,之一:可通过遍历AST构建符号表,MethodDecl,MethodDecl,ClassDecl,root,name=foo,name=setValue,name=test,(some details omitted),globals,foo,test,setValue,foo,test,method,setValue,method,b,var,c,var,block1,d,var,3、辅助目标代码生成 在目标代码生成阶段,符号表是数据存储分配的依据。要形成能运行的目标代码,需要对程序中应用的标识符分配存储单元,而存储单元的分配与标识
6、符属性相关,与属性相关的信息可通过查符号表获取。,符号表的生存期,符号表的建立可以开始于词法分析阶段,也可以放到语法、语义阶段,但符号表的使用有时会延续到目标代码的运行阶段。如数组下标地址计算的需要等。在词法分析的时候,仅把标识符的名字属性放到符号表中。其他属性都为空。,符号表中的内容,保存的信息:标识符的名字和与标识符有关的信息1、类型信息包括种类与属性种类:常量、变量、数组、标号或函数等属性:整型、实型、字符型、布尔型等。,数组(如果是数组的话)包括维数,界差,上下界,计算下标地址时涉及的常量等。这些信息放在数组信息向量表(内情向量表)中。函数或过程 包括参数的个数、类型、次序,是否允许递
7、归等。,2 地址码 常量或简单变量 一般是该量在数据区中所占单元的绝对地址或相对地址数组,是该数组在数据区中的首地址函数或过程 是该函数或过程的分程序入口地址 放在符号表中,3 层次信息 对于分程序嵌套或过程嵌套结构型程序设计语言,还应该包括每个标识符所属分程序(过程)的层次4 行号信息 有些程序设计语言需要保存标识符在源程序中的行号,包括说明行和引用行。,一个编译程序,从词法,语法,语义分析到代码生成的整个过程中,符号表是连冠上下文进行语义检查、语义处理、生成代码和存储分配的主要依据,因此符号表的组织直接关系到这些语义功能的实现和语义处理的时空效率。,符号表的总体组织:,1、编译程序按名字的
8、不同属性构造出多个符号表,如常量表、变量名表等。符号表结构相同,表项等长,不便管理。2、编译程序把语言中的所有名字组织在一张符号表中。符号表便于管理,但表结构复杂且表项不等长。3、折衷方式,即按名字属性相似程度分类构造出多个符号表。符号表管理复杂性折衷。,符号表的建立 线性法、二分法以及散列法。线性法是按名字出现的先后顺序建立符号表。二分法是建表时将名字栏按名字的大小顺序排列 散列法建表时是构造一个散列函数将所得的函数值求整或求余得到表项在表中的位置。,符号表的查找 符号表查找算法与该符号表的构造方法密切相关,即有顺序查找、折半查找和杂凑查找法。,说明语句的翻译,说明语句的作用是为可执行语句提
9、供信息,以便于其执行。对声明语句的处理,主要是将所需要的信息正确的填写进合理组织的符号表中。变量的类型定义与声明决定变量存储空间的是变量的数据类型。声明一个变量,实质上是声明此变量属于什么类型。编译器根据类型确定变量的存储空间。,说明语句说明语句的翻译:对每个局部名字,在符号表中建立相应的表项,填写有关的信息如类型、嵌套深度、相对地址等。相对地址:相对静态数据区基址或活动记录中局部数据区基址的一个偏移值。,说明部分的翻译,对于说明部分的翻译,需要考虑的问题包括:标识符的类型纪录。标识符对应的数据对象的地址分配。标识符的作用域问题。,过程中的说明语句 一个过程中的所有说明语句作为一个类集来处理。
10、用一个全程变量Offset来记录下一个数据在活动记录中的位置。P M D M offset:0/intializationD D;D D id:T enter(id.name,T.type,offset);offset:offset+T.width T integerT.type:integer;T.width:4 T realT.type:real;T.width:8 T arraynum of T1 T.typearray(num.val,T1.type);T.widthnum.val*T1.width T T1 T.type:pointer(T1.type);T.width:=4 图 计
11、算说明语句中名字的类型和相对地址,P M D M offset:0/intializationD D;D D id:T enter(id.name,T.type,offset);offset:offset+T.width T integerT.type:integer;T.width:4 T realT.type:real;T.width:8 T arraynum of T1 T.typearray(num.val,T1.type);T.widthnum.val*T1.width T T1 T.type:pointer(T1.type);T.width:=4,a:array 10 of int
12、eger;x:integer;,保留作用域信息(嵌套过程的声明)问题的提出 一般的语言中,标识符的作用在程序正文中有一个确定的范围。因此,同一个标识符在不同的程序正文中可能标识不同的对象,具有不同的性质,要求分配不同的存储空间。于是提出下面的问题:如何组织符号表,使得同一个标识符在不同的作用域中得到正确的引用而不产生混乱。编译程序分析说明语句时建立符号表,编译执行语句时查找符号表。Lookup(id)返回正确的 id.entry。,程序结构一组嵌套过程,为每个过程说明的局部名字建立一个符号表,所有正在翻译过程的符号表组成整个源程序的符号表。翻译语句部分时查找符号表,查找过程的符号表的路线相当于
13、当前被翻译过程的静态链。翻译时,实际上,为每一个过程维持一个符号表。这种符号表可用链表实现。当碰到过程说明Dproc id;D1;S时,就创建一张新的符号表,并且把在D1中的所有说明项都填入此符号表内。新表有一个指针指向刚好包围该嵌入过程的外围过程的符号表,由id表示的过程名字作为该外围过程的局部名字。,处理嵌套过程中的说明语句 PMD addwidth(top(tblptr),top(offset);pop(tblptr);pop(offset)M t=mktable(nil);push(t,tblptr);push(0,offset)DD1;D2 Dproc id;ND1;S ttop(t
14、blptr);addwidth(t,top(offset));pop(tblptr);pop(offset);enterproc(top(tblptr),id.name,t)D id:T enter(top(tblptr),id.name,T.type,top(offset));top(offset):=top(offset)T.width N tmktable(top(tblptr);push(t,tblptr);push(0,offset),(1)过程说明D-proc id;D1;S 引进一个新的过程,其过程名id局部于这个新过程的外围过程,因此这个id应该出现在外围过程的符号表中。(2)
15、在遇到过程说明D-proc id;D1;S 时应该暂停它的外围过程说明语句的处理;为新过程创建一个符号表。将D1中所说明的名字在这张新的符号表中登记,他们都是局部于这个新过程的。(3)外围过程中说明的名字全局于新过程,因此新过程的符号表中有一指针指向外围过程的符号表。,program sort var a,x procedure readarry var i begin end/readarry procedure exchange begin x=a end/exchange procedure quiksort var k,v function partition var i,j begi
16、n a.;.v exchange(i,j)end partition begin.end/sort,nil headeraxreadarryexchangequicksort,headeri,readarry,header,partition,headerkvpartition,headerij,exchange,quicksort,exchange,readarry,sort,嵌套过程的符号表,这个过程sort中说明了过程readarray,exchange,quicksort,因此在sort符号表中登记了这三个过程名,相应的指针指向新创建的符号表,而新建的符号表表头项中均有指针指向外围过程
17、sort符号表。在quicksort中又说明了partition过程名及指向相应符号表的指针,而partition符号表中则有指向外围过程quicksort符号表的指针。,(1)为了处理嵌套过程的说明语句,上述翻译方案中使用了tblptr栈和offset栈。处于栈顶的是指向当前正在处理的这一层过程的符号表的指针top(tblptr)和这一层过程空间下一个可用位置的相对位置top(offset)。因此初遇过程说明(即由M-或N-规也时),便有mktable(previous)创建一个符号表,指向这个符号表的指针及这个新过程的OFFSET(初值为0)推入栈顶,而这个新过程的外围过程(他们因新过程而
18、暂停处理,需待新过程退出后才能继续)则被压入栈顶以下。,(2)mktable(previous)为新过程创建新符号表,指向新符号表的指针则是它的返回值。指针参数previous指向直接嵌套外层过程(其实就是创建新过程时所在的过程)的符号表,它将被记录在新符号表表头的previous指针位置。表头位置还可存放嵌套深度及过程数据宽度等。(3)每遇到一个变量说明D-i:T,就在当前符号表【由top(tblptr)所指】中插入i的表项,这由 enter(table,name,type,offset)完成将名字为name,类型为type,相对地址为内容登记到由table所指示的符号表的新的表项中。当然在
19、这以后相对地址top(offset)的值应增加该名字的数据宽度T.width.,(4)当完成过程说明语句D-proc i:ND;S后这个过程说说明的局部变量所用的总的域宽已由top(offset)给出,应该记在这个过程的符号表表头中。这由addwidth(table,width)完成,同时从栈顶弹出top(tblptr),top(offset),即返回到外层过程,继续处理它的后续说明语句,并将退出的i过程作为外层过程的局部名记入外层过程的符号表中,这由enterproc(table,name,newtable)完成,即将i过程名、i过程的符号表指针记到table所指的外层过程符号表中。,pro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 符号表 NEW解析课件 符号 NEW 解析 课件
链接地址:https://www.31ppt.com/p-2163112.html