编译原理--符号表实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东大学威海分校信息工程学院软件工程系
网络安全 实验报告
编号:
姓名谭鑫院系信息工程学院软
件工程专业
学号 20078001232
任课教师贺红指导教师贺红
实验地点电子楼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次比较(因此这种查找