手机版

编译原理--符号表实验报告

发布时间:2024-11-17   来源:未知    
字号:

编译原理--符号表实验报告

山东大学威海分校信息工程学院软件工程系 编号: 信息工程学院软学号件工程专业

任课教师 贺红 指导教师贺红

实验地点 电子楼101 实验时间 2010-5-7 实验名称 自学第八章――符号表

同 组 人

预习报告(对实验主要内容的认识) 得分 姓名 谭鑫 院系

1、符号表的组织与作用

2、整理与查找

3、名字的作用范围

4、符号表的内容

实验内容(问题,思路,程序,结果) 得分

编译原理--符号表实验报告

1、什么是符号表?符号表有哪些重要作用?

答:编译过程中编译程序需要不断洪和反复查证出现在源程序中各种名字的属性和特征等有关信息。这些信息通常记录在一张或几张符号表中。符号表的每一项包含两部分:一部分是名字(标识符)一部分是此名字的有关信息。每个名字的有关信息一般指种属(如简单变量、数组、过程等)实、布尔等)等等。

作用:在编译的各个分析阶段,每当遇到一个名字都要查找符号表。如果发现一个新名字,或者发现已有名字的新信息,则要修改符号表,填入新名字和新信息。符号表中所登记的信息在编译的不同阶段都要用到。符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。在目标代码生成阶段,符号表是地址分配的依据。对于一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。

2、符号表的表项常包括哪些部分?各描述什么?

答:符号表的表项常包括名字栏和信息栏两部分。

名字栏描述的是名字,由于查填符号表一般是通过匹配名字来襀的,名字栏也称为主栏,主栏的内容称为关键字。

信息栏包含许多子栏和标志位,用来记录相应名字的种种不同属性。

3、符号有的组织方式有哪些?它的组织取决于哪些因素?

答:符号表的组织方式有两种:

① 让各栏所占的存储单元的长度都是固定的。

② 专门开辟一个信息表区,称为数组信息表(或内情向量表),将数组的

有关信息全部存入此表中。在符号表的地址栏中存入符号表与内情向量表连接的入口地址(即指针)。

它的组织取决于对存储空间利用率的考虑。例如,有些语言规定标识符的长度不得超过8个字符,则可采用第一种组织方式。而有许多语言对标识符的长度几乎不加限制,或者说,标识符的长度范围甚宽,则可采用第二种组织方式。

4、给出自适应线性表的查、填算法(注意修改自适应链)。

答:(1)从词法分析器中读出要查找的单词。

(2)并将链头指向刚才查到的那个项。若未找到,则前往(3)。

(3)填入新项,让链头指向填入的新项。

重复(1)~(3)步,直至所有单词均分析完毕。

编译原理--符号表实验报告

5、设计一个算法,它将按字典顺序输出二叉树上各结点的名字。

答:(1)将第一个碰到的名字作为“根”结点,它的左右指示器均置为null (2)将新结点与根结点的值作比较,小者放在右枝上,大者放在左枝上。如果根结点的左(右)枝已成子树,则转至(3)。

(3)让新结点与子树作比较,方法同(2)。

重复(1)~(3)步,直至新结点插入时成为叶子结点为止转至(4)。

(4)从叶子结点由右向左,由下至上输出各结点的名字。

一、符号表的组织和作用

1.1符号表的作用

一张符号表的每一项(或称入口)白喊两大栏(或称区段、字域),即名字栏和信息栏。

信息栏包含许多子栏和标志位,用来记录相应名字的种种不同属性,由于查填符号表一般是通过匹配名字来实现的,因此,名字栏也称主栏。主栏的内容称为关键字。

符号表中的每一项都是关于名字的说明。因此所保存的关于名字的信息取决与名字的用途,所以各表项的格式不一定统一。对每一项可以用一个记录表示。为了使表中的每个记录格式统一,可以在记录中设置指针,把某些信息放在表的外边,用指针指向存放另外信息的空间。

在整个编译期间,对于符号表的操作大致可归纳为五类:

对给定名字,查询名字是否已在表中;

往表中填入一个新的名字;

对给定名字,访问它的某些信息;

对给定名字,填写或更新它的某些信息;

删除一个或一组无用的项。

不同种类的表格所涉及的操作往往也是不同的。上述五个方面只是一些基本的共同操作。

2.2符号表的组织形式

总体组织和表项属性信息组织

第一种: 把属性种类完全相同的那些符号组织在一起,构造出表项是分别为等长的多个符号表

第二种: 把所有语言中的符号都组织在一张符号表中。组成一张包括了所有属性的庞大的符号表

第三种折衷方式是根据符号属性相似程度分类组织成若干张表,每张表中记录的符号都有比较多的相同属性。

编译程序按名字的不同种属分别使用许多符号表,如常数表、变量名表、过程名表等等。

SUBROUTINE INCWAP(M,N)

编译原理--符号表实验报告

10 K=M+1

M=M+4

N=K

RETURN

END

经编译头三阶段后所产生的主要表格有:符号名表SNT、常数表CT、入口名表ENT、标号表LT和四元式表QT

二.符号表的整理与查找

三种构造法和处理法,即线性查找、二叉树和杂凑技术。第一种办法最简单,但销路低。二叉树的查找效率高一些,然而实现上略困难一点。杂凑表的效率最高,可是实现上比较复杂而且要消耗一些额外的存储空间

2.1线性表

构造符号表最简单和最容易的办法是按关键字出现的顺序填写各个项。我们可以用一个一维数组或多个一维数组来存放名字及有关信息。当碰到一个新名时就按顺序将它填入表中,若需要了解一名字的有关信息,则就从第一项开始顺序查找。一张线性表的结构如图8.6所示。图中,指示器AVAILABLE总是指向空白区的首地址。

线性表中每一项的先后顺序是按先来者先填的原则安排的,编译程序不做任何整理次序的工作。如果是显式说明的程序设计语言,则根据各名字在说明部分出现的先后顺序填入表中(表尾);如果是隐式说明的程序设计语言,则根据各名字首次引用的先后顺序填入表中。当需要查找某个名字时,就从该表的第一项开始顺序查找,若一直查到AVAILABLE还未找到这个名字,就说明该名字不在表中。

对于一张含n项的线性表来说,欲从中查找一项,平均来说需要做n/2次的比较。显然使用这种方法效率很低。但由于线性表的结构简单而且节省存储空间,所以许多编译程序仍采用线性表。

2.2对折查找与二叉树

为了提高查表的速度,可以在造表的同时把表格中的项技名字的“大小”顺序整理排列。所谓名字的“大小”通常是指名字的内码二进值。例如,规定值小者在前,值大者在后。

对折查找的步骤:

假定表中已含有n项,要查找某项SYM时:

·首先把SYM和中项(即第[n/2]+l项)作比较,若相等,则宣布查到。

·若SYM小于中项,则继续在1~[n/2]的各项中去查找。

·若SYM大于中项,则就到[n/2]+2-n的各项中去查找。

这样一来,经一次比较就甩掉n/2项。当继续在 l~ [n/2](或[n/2]~n)的范围中查找时,我们同样采取首先同新中项作比较的办法。如果还查找不到,再把查找范围折半。显然,使用这种查找法每查找一项最多只须作1+log2N次比较(因此这种查找

编译原理--符号表实验报告

法也叫对数查找法)。

这种办法虽好,但对一遍扫描的编译程序来说,没有太大的用处。因为,符号表是边填边引用的,这意味着每填进一个新项都得做顺序化的整理工作,而这同样是极费时间的。

一种变通办法是把符号表组织成一棵二又树。也就是说,我们令每项是一个结点,每个结点附设两个指示器栏,一栏为LEFT(左枝),另一栏为RIGHT(右枝)。每个结点的主栏内码值被看成是代表该结点的值。对于这种二叉树,我们有一个要求用p就是,任何结点p右枝的所有结点值均应小于结点p的值,而左枝的任何结点值均应大于结点p的值。

二叉树的形成过程是:令第一个碰到的名字作为“根”结点,它的左、右指示器均置为null。当要加入新结点时,首先把它和根结点的值作比较,小者放在右枝上,大者放在左枝上。如果根结点的左(右)枝已成子树,则让新结点和子树的根再作比较。重复上述步骤,直至把新结点插入使它成为二叉树的一个端末结点(叶)为止。

2.3杂凑技术

于表格处理来说,根本问题在于如何保证查表与填表两方面的工作都能高效地进行。对于线性表来说,填表快,查表慢。而对于对折法而言,则填表慢,查表快。杂凑法是一种争取查表、填表两方面都能高速进行的统一技术。

方法:假定有一个足够大的区域,这个区域以填写一张含N项的符号表。我们希望构造一个地址函数H,对任何名字SYM,H(SYM)取值于0至N-l之间。这就是说,不论对SYM查表或填表,我们都希望能从H(SYM)获得它在表中的位置。例如,我们用无符号整数作为项名,令N=17,把H(SYM)定义为SYM/N的余数。那么,名字‘09’将被置于表中的第9项,‘34’将被置于表中的第0项,‘171’将被置于表中的第1项,如此等等。

对于地址函数H有两点要求:第一,函数的计算要简单、高效;第二,函数值能比较均匀地分布在0至N-l之间。例如,若取N为质数,把H(SYM)定义为SYM/N的余数就是一个相当理想的函数。

凑技术常常使用一张杂凑(链)表通过间接方式查填符号表。时时把所有相同杂凑值的符号名连成一串,便于线性查找。杂凑表是一个可容N个指示器值的一维数组,它的每个元素的初值全为null。符号表除了通常包含的栏外还增设一链接栏,它把所有持相同杂凑值的符号名连接成一条链。填入一个新的SYM过程是:

·首先计算出H(SYM)的值(在0与N-1之间)h,置P:=HASHTABLE[h](若未曾有杂凑值为h的项名填入过,则p=null);

·然后置 HASHTABLE[h]:=AVAILABLE,再把新名SYM及其链接指示器 LINK的值p填进AVAILABLE所指的符号表位置,并累增AVAILABLE的值使它指向下一个空项的位置。

使用这种办法的查表过程是,首先计算出H(SYM)=h,然后就指示器HASHTABLE[h]所指的项链逐一按序查找(线性查找)。

三、名字的作用范围

实现最近嵌套作用域规则的办法是,对每个过程指定一个唯一的编号,即过程的顺

编译原理--符号表实验报告

序号,以便跟踪过程里的局部名字。为了对每个过程进行编号,可以按照识别过程开头和结尾的语义规则,用语法制导翻译的方法实现。一个过程的编号(层次)作为本过程中说明的全部局部量的组成部分,即编号被看成是名字的一个组成部分。于是,在符号表中表示局部名字用一个二元组:<名字,过程编号>。这种办法意味着我们把整个符号表按不同的过程逻辑地划分为相应的不同段落。在查找每个名字时,先查对过程编号,确定所属的表区段落,然后,再从此段落中查对标识符。也就是说,对一个名宇查找符号表是:只有当表项中的名宇其字符逐个匹配,并且该记录相关的编号和当前所处理的过程的编号匹配时,才能确定查找成功。

3.1 FORTRAN的符号表组织

一个FORTRAN程序中由一个主程序段和若干过程段(子程序段或函数段)组成的。变量、数组和语句函数名的作用范围就是它们所处的那个程序段(它们在这个程序段被说明了的)。对于一个一遍扫描的编译程序,我们可以逐段产生其目标代码。于是,当一程序段处理完后,它的所有的局部名均无须继续保存在符号表中,需要继续留在符号表中的只是全局名,如外部过程名或公用区名。

在这种情形下,我们可以把现行段的局部名登记在表格区的一端,而把所有的全局名登记在表区的另一端,局部名表区域是一个可重复使用的区域。当一个程序段处理完之后,新的程序段又可在同一位置上建立新的局部名表。

每当编译程序碰到一个新名时就按其语义将它登记在符号表的某一端中。在填入新名时要注意的是:当AVAIL1和AVAIL2两指示器碰头时(值相等),编译程序就应报告表区已填满并禁止继续填进新项。当现行段处理完后,AVAIL1重置,指向局部名区的第一项。

对于一个优化的多“遍”扫描的FORTRAN编译程序而言,在处理完一个程序段之后应把它的局部名表保存在外存中(以便后续“遍”处理这段时使用)。这样,局部名区就可为处理下一程序段时使用。请注意:在这种情况下,必须用一个一维数组记录各段局部名表的开始位置(程序段的编号)。

对于FORTRAN编译程序,若仅仅从查填符号表这一点而言,本质上完全无须给每个程序段一个编号、因为,查表时我们总是对着全局名区或现行局部名区来查的。由于程序段没有嵌套性,故没有必要把程序段的编号作为名字的一部分。虽然以后我们仍将给每个程序段(乃至每个公用区)一个编号,但主要是为了进行地址分配而引进的。

3.2 Pascal的符号表组织

Pascal过程的结构是嵌套的,内层过程可以引用外层过程中说明过的名字。因此,在编译这种语言期间,每当进入一层过程时,要为在这层过程中新说明的标识符建立一张子符号表(在符号表内),而在退出此层过程时,则要删除(释放)相应的子符号表.使现行符号表与进入此过程之前的内容保持一致。由于过程是按层次嵌套的,如果多层嵌套(如n层),那么这些于符号表也是多层嵌套,并按序生成(即先产生子符号表1,最后产生子符号表n)。当第n层过程需要查找某一名字时,则先从子符号表n开始查找,如果未查到,再依次查子符号表n-l,n一2,…,1;如果在某层符号表1中首先出现该名字,这便是所要查找的结果。由此可见,采取这种办法,不同层次的同名标识符不会导致混乱。

编译原理--符号表实验报告

针对嵌套结构型程序设计语言(Pascal)的特点,可采用如下办法:

·将其符号表设计为栈符号表,当新的名字出现总是从栈顶填入。查找操作从符号表的栈顶往底部查(保证先查最近出现的名字)。因为程序是分层的,并且一个过程结束时将释放相应的子符号表,因此查找范围与线性表比相对要小一些。

·引入一个显示(DISPLAY)层次关系表,称为过程的嵌套层次表。其作用是为了描述过程的嵌套层次,指出当前正在活动着的各嵌套的过程(或函数)相应的子符号表在栈符号表中的起始位置(相对地址)。DISPIAY表也是一个栈,栈顶指针为level。当进入一个新过程时,level增加 1;每当退出一个过程时,level减 l。DISPLAY(level)总是指向当前正在处理的最内层的过程的子符号表在栈符号表中的起始位置。

·在符号表的信息栏中引入一个指针域(previous),用以链接它在同一过程内的前一域名字在表中的下标(相对位置)。每一层的最后一个域名字,其previous之值为0。这样,每当需要查找一个新名字时,就能通过DISPLAY找出当前正在处理的最内层的过程及所有外层的子符号表在栈符号表中的位置。然后,通过previous可以找到同一过程内的所有被说明的名字。

四、符号表的内容

符号表的信息栏中登记了每个名字的有关性质,如类型(整、实或布尔等)、种属(简单变量、数组、过程等)、大小(长度,即所需的存储单元字数)以及相对数(指分配给该名宇的存储单元的相对地址)。不同的程序语言对于名字性质的定义各有不同。现今多数程序语言中的名字或者是用说明语句规定其性质,或者采用某种隐含约定(如FORTRAN中凡以字符I,J,…N开头的标识符代表整型变量名)。有些程序语言,如ADL没有说明语句也没有隐含约定,因此,符号表的性质须到目标程序运行时才能确定下来。但编译时登记在符号表中的各名字的性质只能来自说明语句(包括隐含约定和标号定义)或其它引用情形。

对于变量名、数组名和过程名而言,它们的信息栏中一般要求有下列信息:

变量 类型(整、实、双实、布尔、字符、复、标号或指针等);

种属(简单变量、数组或记录结构等);

长度(所需的存储单元数);

相对数(存储单元相对地址);

若为数组,则记录其内情向量;

若为记录结构,则把它与其分量按某种形式联系起来;

形式参数标志;

若在 COMMON或 EQUVALENCE语句中(FORTRAN语言),把它和有关名字连接在一起;它的说明是否已处理过(即标志位“定义否”);

是否对这个变量进行过赋值(包括出现在输人名表中)的标志位。

过程 是否为程序的外部过程?

若为函数,类型是什么?

其说明是否处理过?

是否递归?

形式参数是些什么?为了与实在参数进行比较,必须把它们的种属、类型信息同过程名联系在一起。

编译原理--符号表实验报告

实验结论 得分

通过学习,我对符号表有了深入的了解。

教师评价 总分 实际得分

编译原理--符号表实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)