第八章符号表2.0.ppt
《第八章符号表2.0.ppt》由会员分享,可在线阅读,更多相关《第八章符号表2.0.ppt(57页珍藏版)》请在三一办公上搜索。
1、第6章 符号表,1,第6章 符号表,2,扫描源程序,遇到一个名字就检索表,若它是一个新的名字,就填表,在调用词法语法分析程序时,还要把有关的信息填入(如标号的链,定义否),语义分析时,用它来检查名字的使用是否与它们原先的说明一致,如GOTO L,L 为标号;代码生成时,需要了解必须给名字分配多少,以及哪一种存储;,第6章 符号表,3,为了便于查错和改错,可以记录前面是否已经打印过象“变量A未定义”这样的出错信息,以免重复。对于多遍扫描的编译器,不同遍的表也往往不同。本章主要讨论:设计表的主要问题是登记项的格式,表的组织和访问的方法,访问的格式,存放的位置(主存或者辅存)。,第6章 符号表,4,
2、6.1.1 符号表项的域理论上,符号表只是一个具有名字域和信息域这2个域的表,大致结构如下:,第一项(入口1),第二项(入口2),第n项(入口n),第6章 符号表,5,我们要求它具备以下几种功能:1,确定一个给定的名字是否在表中;2,填入新的名字;3,访问所给名字的有关信息;4,对给定的名字,填写和更新它的有关息;5,删除一个或者一组名字,第6章 符号表,6,6.1.2 分表语言中,名字表示各种类型的对象:变量名,过程名,常数,域名(结构),标号等,由于各种类型的名字因用法不同,栏目及所需的空间相差很大,因此往往独立建表,由此带来的负面影响是:导致零头太多。如果登记项格式可以变化,则另外一个表
3、也可以;如果禁止把关键字作为标识符,则应把关键字先进表,标函也进表.,第6章 符号表,7,6.1.3 符号表内容的细目 1,表示名字的字符串+编号,如果多个程序块或过程中可以使用同一标识符,则必须指出这个名字属于哪一个程序块或过程;2,名字的属性(包括类型和种类)以及识别名字用途的信息(标号,形参,数组)3,参数(维数,下标的上下界)4,描述分配给名字存储单元的位置的偏移量,第6章 符号表,8,6.1.4 符号表登记项的建立 a,符号表名字何时建立:1,词法分析。当识别了一个标识符时,它可以建 立,不能填充种类,类型等;install 子程序返回($ID,符号表指针);2,但是当一个名字在同一
4、个程序块或过程中,可用作标号、实型变量、域名时,词法只能返回($ID,TOKEN),由语法分析程序为标识符建表,第6章 符号表,9,b,这些信息在不同的时刻插入符号表:1,遇到显式说明时,把属性插入;2,语法可以隐含的说明变量的某种用途,如标号后的:,所以和产生式 语句-id:语句 相关的语义动作是把 id 为标号的事实插入符号表,标号链,定义否填入;3,地址分配;类似,过程说明的语法告诉我们某些名字是形参。,第6章 符号表,10,6.1.5 名字和符号表记录 实现表的最简单方式是看成记录的线性数组,每一栏目所占存储单元长度不变,每个名字对应一个记录,记录通常由已知个连续的存储字组成。,标识符
5、信息标识符信息,图6.1(a)存储标识符在记录中,第6章 符号表,11,图6.1(b)名字存储在分开的数组中,第6章 符号表,12,1,当一个名字的最大长度不太长时,如FORTRAN为8字符,用2个字存储,其余补空;2,ALGOL 名字不限,PL/1 31个(8个字),则采用间接方式,专门字符数组,这样使表的名字域大小不变;对于其他的域也可以这样办理,(技术性工作).,?如果向量表维数可变怎么办?,第6章 符号表,13,把整个符号表分成若干子表,NAME:0:,2(i-1):,4(i-1):,INFORMATION:0:,例子:分两个子表的符号表安排,第6章 符号表,14,6.1.6 符号表空
6、间的重新使用符号表占用空间很大,且信息更新,故有重新使用空间的问题,那些空间不可用呢?程序员用来表示名字的标识符,必须一直保存在符号表中,直到不再引用为止,以便该标识符只能代表同一个名字,这是必要的,它使标识符的所有使用与符号表登记项相结合(表中有的内容在以后不再使用了),从而是同一个名字。但是,如果用来存放标识符的空间在下一次能重新使用,那么用少量空间就能解决问题。,第6章 符号表,15,例如,在以后几遍中,放名字的数组可以释放,所以设法回收用来存储标识符的空间,(事实上,图9.1b 第一字也能回收)方法:用两个而不是一个数组来存放记录,如不查表,可释放,2i-12i,IDENTIFIERS
7、:,INFORMATION:,两个数组的符号表方案(9.1a 一分为二),5i-45i,注意:DIMPLE的外部表示不再是符号表的指针,而是整数下标i,此时,用i来存取另一数组,第6章 符号表,16,有效地加入新项和找出有关项,本节主要讨论三种机制:,1,线性表2,树3,散列表,6.2.1 线性表,记录的线性表,Available,第6章 符号表,17,线形表的效率估计 插入名字的工作量与表长 n 成正比查找的工作量平均 n/2访问的工作量与表长 n 成正比.,第6章 符号表,18,以少量额外空间为代价,在每一个记录中增加一个Link域,并按Link域指示的顺序检索表设定First指出第一个记
8、录的位置,Link指出下一个记录:,链式结构的自适应表,第6章 符号表,19,1,自适应表Link 的原则,指示器把所有的项按“最新最近”访问原则连结成一条链使得在任何的时候,这条链的第一元素所指的项是最近被查询过的项,第二个元素是次新查询过的项依据是 刚刚被访问过的项以最大概率被继续访问,第6章 符号表,20,2,做法,当引用一个名字或者当第一次建立该名字的纪录时,我们通过移动指针把名字纪录移到表的前部,下图说明把NAME4纪录移到头上(NAME4刚刚被引用),原来的链是3142,现在改为4312,(a)3,1,4,2,(b)4,3,1,2,第6章 符号表,21,3,算法:可以写出把NAME
9、 i 移到头上来的算法,原来的情况如此,现在开始改变让FIRST i,r,q,i,q,第6章 符号表,22,算法:1,若Link p=i,则记下 p;若Link i=q,则q Link p;/这样,i 就脱离了2,若原FIRST r,则记 r Link i;3,让FIRST i;,第6章 符号表,23,二,折半查找,1,方法:为了提高查表速度,在造表的同时把表中的项按名字的“大小”顺序整理,所说名字的“大小”,通常是指名字的内码二进制值。若规定由小 大,那么对任何要找的名字来说,无论相对哪一个参考点,我们总可以知道要找的名字在参考点的前面还是后面。因此一个简单的算法是每次都把参考点定在中间。我
10、们已经知道,对 N 项名表,查找的平均长度为log2N(2为底数)这较其线性查找,已经提高了许多,若1024项,是10:512,第6章 符号表,24,进一步的改进,不在表的中间进行试查,而是对每步的试查位置作较准确的推断,若要在下表中查名字CAT,查2/26 处似更合理一些,猜测的好坏和对名表的了解程度有关,若能知符号表中的每个字母开头的词有多少,就能有一个校准的初始推测。在编译中,带有实际的名字项是取自整个名字集中的一个非随机子集,并知道它们的某种总的信息。Peterson 证明:平均查找长度大约等于(1/2)*log2N,如1000项是 5 次。,第6章 符号表,25,评价,尽管如此,编译
11、器不愿意采用它,它的致命弱点是,添加一项就要重新整理,使它按序。因此对于名字表不合适。但是对于固定的表,如定义符表等就很有用。(插入固定表),第6章 符号表,26,再改进,把符号表组织成一个二叉树,每一项是一个节点,节点组成:,第6章 符号表,27,构造过程:,这样构造的树,保持任何结点 P 右枝的所有结点值小于结点 P 的值,而 P 左枝的所有结点值大于结点 P 的值:P 值 P 右枝的所有结点值.,再加入名字 LMN:ABCD LMN XYZA,加入新结点:因为 XYAZ ABCD 置于左;因为 ABAA ABCD 置于右,根结点:第一个遇到的名字,此时,左右指示器为 null.,root
12、,root,第6章 符号表,28,评价,优点,二叉树与对折查找的效率比较:附设左右指示器,耗费空间,每查找一项所的比较次数仍然和log2N 成比例,顺序化整理工作十分简单,第6章 符号表,29,思考:,表格处理包括填查表,要两者快才好,但线性表和折半法只能占一边,能否找到更好的办法?,先在一个限制比较多的情况下讨论,第6章 符号表,30,三,直接取表法,K 表位置若名字的第一个字母都不一样,那么我们用一个 26 元的向量作符号表。设映像函数 I(K)对每一个名字 K,I(K)就是 K 的第一个字母在字母表中的位置,表头 100,I(K)=100+(K)*l,第6章 符号表,31,优点:,这个方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 符号 2.0

链接地址:https://www.31ppt.com/p-5060362.html