符号表-NEW解析课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《符号表-NEW解析课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 符号 NEW 解析 课件
- 资源描述:
-
1、主要内容 符号表的介绍 说明语句的翻译 数组元素的引用符号表 符号表是连接声明与引用的桥梁。一个名字在声明时,相关信息被填写进符号表,而在引用时,根据符号表中的信息生成相应的可执行语句。 如何有效记录各类符号的信息,以便于在编译的各个阶段对符号表进行快速、有效的查找、插入、修改、删除等操作,是符号表设计的基本目标之一。 符号表的管理贯穿整个编译过程,既涉及到前端,也涉及后端,尤其与后端的存储空间分配有密切联系。符号表的内容一般仅在编译时使用,如果名字的具体信息需要在运行时确定或使用,则符号表的部分内容还要保留并运行,例如动态数组和跟踪调试信息等。合理组织符号表的内容,以适应不同阶段的需要,也是
2、符号表设计需要考虑的问题之一。符号表的作用 符号表用来存放程序设计语言中出现的有关标识符的属性和特征。 符号表在整个编译期间的作用可归纳为以下几个方面: 1、将标识符的名字及属性登陆到符号表中 在分析说明语句的时候,编译程序根据说明语句信息将标识符的相应属性,例如标识符的类型:实型、整型,布尔型等;标识符的种属:数组名,变量名,过程名,函数名等登录到符号表中。 2、辅助上下文语义的正确性检查 例如对运算对象和运算符进行类型检查,对变量进行先定义后使用检查等。 通过符号表中的属性记录可进行上述语义检查。作用域public class Foo private int value = 39; pub
3、lic int 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 valuescope of bscope of cscope of cscope of valuescope of d符号表SymbolKindTypePropertiesvaluevarI
4、nttestmethod- intsetValuemethodint - void SymbolKindTypePropertiesbvarintSymbolKindTypePropertiescvarintSymbolKindTypePropertiesdvarint(Foo)(Test)(setValue)(setValue-block)符号表lookupSymbolKindTypePropertiesvaluevarinttestmethod- intsetValuemethodint - void SymbolKindTypePropertiesbvarintSymbolKindTyp
5、ePropertiescvarintSymbolKindTypePropertiesdvarint(Foo)(Test)(setValue)(setValue-block)public void setValue(int c) value = c; int d = c; c = c + d; value = c; Lookup(value)Symbol Table LookupSymbolKindTypePropertiesvaluevarinttestmethod- intsetValuemethodint - void SymbolKindTypePropertiesbvarintSymb
6、olKindTypePropertiescvarintSymbolKindTypePropertiesdvarint(Foo)(Test)(setValue)(setValue-block)public void setValue(int c) value = c; int d = c; c = c + d; myValue = c; Lookup(myValue)Error !符号表操作 插入 插入新的符号 插入到当前作用域中 查询lookup 在符号表中找到一个符号 可能引起到父表中查找 当符号没有找到的时候报错 符号表类似一个仓库class之一:可通过遍历AST构建符号表MethodDe
7、clStmtMethodDeclClassDeclrootname=fooname=setValuename=testVarDeclid=bStmtBlockStmtStmtVarDeclid=d(some details omitted)SymbolkindglobalsSymbolkindfooSymboltestSymbolsetValuefootestmethodsetValuemethodbvarcvarSymbolblock1dvar 3、辅助目标代码生成 在目标代码生成阶段,符号表是数据存储分配的依据。要形成能运行的目标代码,需要对程序中应用的标识符分配存储单元,而存储单元的分配
8、与标识符属性相关,与属性相关的信息可通过查符号表获取。符号表的生存期 符号表的建立可以开始于词法分析阶段,也可以放到语法、语义阶段,但符号表的使用有时会延续到目标代码的运行阶段。如数组下标地址计算的需要等。 在词法分析的时候,仅把标识符的名字属性放到符号表中。其他属性都为空。符号表中的内容 保存的信息: 标识符的名字和与标识符有关的信息 1、类型信息 包括种类与属性 种类:常量、变量、数组、标号或函数等 属性:整型、实型、字符型、布尔型等。 数组(如果是数组的话) 包括维数,界差,上下界,计算下标地址时涉及的常量等。这些信息放在数组信息向量表(内情向量表)中。 函数或过程 包括参数的个数、类型
9、、次序,是否允许递归等。 2 地址码 常量或简单变量 一般是该量在数据区中所占单元的绝对地址或相对地址 数组,是该数组在数据区中的首地址 函数或过程 是该函数或过程的分程序入口地址 放在符号表中 3 层次信息 对于分程序嵌套或过程嵌套结构型程序设计语言,还应该包括每个标识符所属分程序(过程)的层次 4 行号信息 有些程序设计语言需要保存标识符在源程序中的行号,包括说明行和引用行。 一个编译程序,从词法,语法,语义分析到代码生成的整个过程中,符号表是连冠上下文进行语义检查、语义处理、生成代码和存储分配的主要依据,因此符号表的组织直接关系到这些语义功能的实现和语义处理的时空效率。符号表的总体组织:
10、 1、编译程序按名字的不同属性构造出多个符号表,如常量表、变量名表等。符号表结构相同,表项等长,不便管理。 2、编译程序把语言中的所有名字组织在一张符号表中。符号表便于管理,但表结构复杂且表项不等长。 3、折衷方式,即按名字属性相似程度分类构造出多个符号表。符号表管理复杂性折衷。 符号表的建立 线性法、二分法以及散列法。 线性法是按名字出现的先后顺序建立符号表。 二分法是建表时将名字栏按名字的大小顺序排列 散列法建表时是构造一个散列函数将所得的函数值求整或求余得到表项在表中的位置。 符号表的查找 符号表查找算法与该符号表的构造方法密切相关,即有顺序查找、折半查找和杂凑查找法。说明语句的翻译 说
11、明语句的作用是为可执行语句提供信息,以便于其执行。对声明语句的处理,主要是将所需要的信息正确的填写进合理组织的符号表中。 变量的类型定义与声明 决定变量存储空间的是变量的数据类型。声明一个变量,实质上是声明此变量属于什么类型。编译器根据类型确定变量的存储空间。说明语句说明语句 说明语句的翻译:对每个局部名字,在符号表中建立相应的表项,填写有关的信息如类型、嵌套深度、相对地址等。 相对地址:相对静态数据区基址或活动记录中局部数据区基址的一个偏移值。说明部分的翻译 对于说明部分的翻译,需要考虑的问题包括: 标识符的类型纪录。 标识符对应的数据对象的地址分配。 标识符的作用域问题。 过程中的说明语句
12、过程中的说明语句 一个过程中的所有说明语句作为一个类集来处理。用一个全程变量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
13、 T.type:pointer(T1.type); T.width := 4 图 计算说明语句中名字的类型和相对地址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.t
14、ype:pointer(T1.type); T.width := 4a: array 10 of integer;x : integer;保留作用域信息保留作用域信息( (嵌套过程的声明嵌套过程的声明) ) 问题的提出 一般的语言中,标识符的作用在程序正文中有一个确定的范围。因此,同一个标识符在不同的程序正文中可能标识不同的对象,具有不同的性质,要求分配不同的存储空间。于是提出下面的问题:如何组织符号表,使得同一个标识符在不同的作用域中得到正确的引用而不产生混乱。编译程序分析说明语句时建立符号表,编译执行语句时查找符号表。Lookup(id)返回正确的 id.entry。 程序结构 一组嵌套过
15、程,为每个过程说明的局部名字建立一个符号表,所有正在翻译过程的符号表组成整个源程序的符号表。翻译语句部分时查找符号表,查找过程的符号表的路线相当于当前被翻译过程的静态链。翻译时,实际上,为每一个过程维持一个符号表。这种符号表可用链表实现。当碰到过程说明当碰到过程说明Dproc idDproc id;D1D1;S S时,就创建一张新的符时,就创建一张新的符号表,并且把在号表,并且把在D1D1中的所有说明项都填入此中的所有说明项都填入此符号表内。新表有一个指针指向刚好包围该符号表内。新表有一个指针指向刚好包围该嵌入过程的外围过程的符号表,由嵌入过程的外围过程的符号表,由idid表示的表示的过程名字
16、作为该外围过程的局部名字。过程名字作为该外围过程的局部名字。处理嵌套过程中的说明语句 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(tblptr); addwidth(t,top(offset)); pop(tblptr);pop(offset); enterproc(top(tblptr),id.name,t) D id:T enter(top(tblptr),id
17、.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)在遇到过程说明D-proc id; D1; S 时应该暂停它的外围过程说明语句的处理;为新过程创建一个符号表。将D1中所说明的名字在这张新的符号表中登记,他们都是局部于这个新过程的。(3)外围过程中说明的名字全局
18、于新过程,因此新过程的符号表中有一指针指向外围过程的符号表。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 begin a. ; .v exchange(i,j) end partition begin . end /sortnil headeraxreadarryexchangequicksort h
19、eaderireadarry headerpartition headerkvpartition headerijexchangequicksortexchangereadarrysort嵌套过程的符号表 这个过程sort中说明了过程readarray, exchange, quicksort, 因此在sort符号表中登记了这三个过程名,相应的指针指向新创建的符号表,而新建的符号表表头项中均有指针指向外围过程sort符号表。在quicksort中又说明了partition过程名及指向相应符号表的指针,而partition符号表中则有指向外围过程quicksort符号表的指针。 (1)为了处理嵌
20、套过程的说明语句,上述翻译方案中使用了tblptr栈和offset栈。处于栈顶的是指向当前正在处理的这一层过程的符号表的指针top(tblptr)和这一层过程空间下一个可用位置的相对位置top(offset)。因此初遇过程说明(即由M-或N-规也时),便有mktable(previous)创建一个符号表,指向这个符号表的指针及这个新过程的OFFSET(初值为0)推入栈顶,而这个新过程的外围过程(他们因新过程而暂停处理,需待新过程退出后才能继续)则被压入栈顶以下。 (2)mktable(previous)为新过程创建新符号表,指向新符号表的指针则是它的返回值。指针参数previous指向直接嵌套
21、外层过程(其实就是创建新过程时所在的过程)的符号表,它将被记录在新符号表表头的previous指针位置。表头位置还可存放嵌套深度及过程数据宽度等。 (3)每遇到一个变量说明D-i:T,就在当前符号表【由top(tblptr)所指】中插入i的表项,这由 enter(table, name, type, offset)完成将名字为name, 类型为type,相对地址为内容登记到由table所指示的符号表的新的表项中。当然在这以后相对地址top(offset)的值应增加该名字的数据宽度T.width. (4) 当完成过程说明语句D-proc i:ND;S后这个过程说说明的局部变量所用的总的域宽已由t
展开阅读全文