编译原理 复习资料 下载本文

思考:为什么当A定义为结构体时a、b、c、d、e在符号表中的位置

属性不是0、2、0、2、6?

注意:存放任何类型变量的地址都必须是其所需字节数的整数倍处地

址,如 int型 变量首址须为2的整数倍处:0、2、4、…。

6、其它属性

(1)数组的内情向量(首地址、维数、每维的长度):用于确定数组分

配时所占空间及具体位置。

(2)记录结构的成员信息( C中用struct,PAS中用record定义):用

于确定结构型 变量存储分配时所占空间及具体位置。

(3)函数或过程的形参:用于作进程调用时的匹配处理和语义检查。

9.3 符号表的组织

一、符号表的总体组织

符号表的总体组织方式分为三种:

1、按属性完全相同的符号组织在一起,构造出多张表。其特点:有多

个符号表,每个符号表内部符号的属性个数和结构完全相同。对于单个符号管理方便,空间效率高,但从宏观上看,管理复杂。

例:设文法中有三类符号及其所需属性,按这类方法来组织如下:

2、把所有语言中出现的符号都组织在一张表中。其特点:把所有符号

的所有可能属性作为符号表的表项属性,便于集中一致管理,但导致了无用属性空间过多,管理繁杂。

例:对上例中按这类方法来组织如下:

3、上两种方案的折衷:根据符号的相似程度,由设计者自己根据需要

设计成多张表,各表都为定长,且可看成一个多元组,各元组又由若干属性组成,元组间有相同的成员个数和一致的排列,元组间的区分由唯一的一个“关键字栏”决定。

例:上例中表按这类方法可组织为:

二、 符号表项信息的排列方式

符号表中每一项对应着一个多元组。符号表总体上看就是一个多元组

集。符号表项的组织可分为线性组织、排序组织、散列组织等。

1、线性组织

(1) 规定符号表中表项按它的符号被扫描到的先后次序建立。 (2)适于事先确定符号个数且个数不大时。 例:...a...b...d...a...c..可组织为:

2、排序组织

(1) 符号表的表项中按符号的字符代码串的值的升/降序排列。 (2)通常在建立和查找符号项时用二分查找法。

(3)排序表的空间组织和存储开销同于线性表,但运行效率高,算法

也复杂。

3、散列组织

(1)符号表按散列表(hash)的形式进行组织,运行效率高。 (2)关键问题是解决冲突的方法和hash函数的选取。

(3)现代编译系统多采用它,其hash函数一般使用对符号代码的位操

作(如字段迭加、符号代码对折/多折)函数。

三、 关键字域的组织

1、关键字域就是符号本身。

2、采用关键字池的索引 结构,既能保证关键字段的等长,又能减少甚

至消除冗余。

3、索引 结构可用字符数组或字符串实现 ,前者用整数值表示关键字

在字池中的位置下标,后者通过指针指向其在字池中的位置。

四、其它域的组织

1、同类型且等长属性域的组织

表中各符号的该属性值具有相同的类型且等长,则用该长度和类型来定

义该域的类型结构。

(1)可给数据类型编码(码长固定)

(2)表示关系符号之间关系的属性 例:struct c{int a,float b} stv;可表示为

2、同类型但不等长属性域的组织

表中各符号的该属性值可能具有相同类型但长度不同,则另外设置相关

空间来存放该属性值,而在表项的某个域内设置一个指针指向相关另设空间(结构体/联合体变量、多态域)。

例:数组的组织:int a[1][2],b[2][9][1];