当前位置:文档之家› 编译原理-第十章

编译原理-第十章


The end.
10.4 分程序结构的符号表
要构造分程序结构的符号表,需要在进入一分程序 和退出一分程序时完成相应的工作。 ❖ ① 进入分程序。在分程序表中添加一元素,使该分 程序变成当前分程序:
Lastbl:= Lastbl + 1; B(Lastbl):= (Currbl, 0, SP); Currbl:= Lastbl
Procedure BINARYSEARCH; begin i:= 1; j:= n; while i≤j do k:= (i + j) DIV 2 if T[k] = x then return (x的信息) else if T[k] x then i:= k + 1
else j:= k – 1; return (表中不存在x表项); end;
❖ 对于变量,其描述信息通常包括:类型、种类、精度、 维数或维数之值、形参类型、连结其它分量的方式、 标号的类型、是否在公用语句或等价语句中出现、它 的说明是否处理过、它运行时的地址。
10.2 符号表中的数据
对于过程,其描述信息通常包括: ❖ ① 是否为函数过程?若是,则给出其函数类型。 ❖ ② 是否为形式参数过程? ❖ ③ 是否为程序的外部过程? ❖ ④ 是否为递归过程? ❖ ⑤ 是否有形参?若是,给出每个形参的描述信息。 ❖ ⑥ 其说明是否加工过?
❖ 因为组成标识符的符号个数是不固定的。因此,常 常不是直接将标识符本身存放在主目栏中,而是存 放一个指向标识符的指示器,并在另一字符串表中 存放这些标识符。
10.2 符号表中的数据
❖ 符号表是编译程序中的一个很重要的部分,应按方便 获取信息和有效添加信息的方式建立符号表。值部分 描述标识符的有关属性,因此也称为描述信息。
线性查表算法为 Procedure LINEARSEARCH; begin for i:= n step –1 until 1 do if T[i] = x then return (x的信息), return (表中不存在x表项); return; end;
10.3.2 折半法
❖ 造表法是指按照表项主目的“大小”次序进行填写, “小”的排在前,“大”的排在后。
10.3.3 杂凑技术
❖ 除法公式 h (x) = ( x mod k )*2 其中,k是小于表容的最大质数,即k = 2039。这里 h (x)的直观含义是:标识符x的机内编码除以k的余 数,再乘2。
❖ 折叠函数。 本方法是把标识符机内编码分成若干段,每段≤11 位,然后按某种方式迭加,再取其中11位后乘2作为 h (x)之值。
❖ 查表时,每次取当时表正中间(即对折)那个表项 的主目与被查项进行比较;若被查项“小于”中间 表项,则在前半表区重复折半法查找;若被查项 “大于”中间表项,则在后半表区重复折半法查找 (两者相同时,表示已查到所需要的表项)。重复 这一过程,直到当时的表尾大于当时的表头为止。
10.3.2 折半法
折半查找算法为
10.3.3 杂凑技术
造表算法
Procedure HASHBUILD; begin if g≥2048 then return (error: 标识符表溢出); 计算h (x)→h; while @ (h) 0 do
if @ (h) = x then return (error: 重名) else begin
10.3.3 杂凑技术
❖ 乘法公式 h (x) = [C*( (*x) mod 1 )]*2 其中,x为标识符的机内编码;=0.618033988747; C=2048=211是表容,即表区中允许存放的标识符的 最大个数;a mod b的含义是a除以b的余数;[E]为E 之值的整数部分;h(x)的直观含意是:和x的乘积 的低位段的前11位内容再乘2;“2”是每个标识符所 占的单元个数。
10.3 符号表的构造与查找
符号表的构造(简称造表)是指把新的表项填入表中 的过程。符号表的查找是指在符号表中搜索某一特定 表项的过程。 10.3.1 线性查找 它按主目出现的先后顺序填写各个表项,而不做任何 整理表项次序的工作。查表时,从表头开始朝表尾方 向(或从已填表项的末端开始朝表头方向)逐个进行 比较,直至找到所需表项或表中所有已填表项比较完 毕(此时表明未找到所需要的表项)为止。
end; return (error: 名无定义);
10.3.3 杂凑技术
❖ 链接技术 链接技术就是在造表时,把冲突的各标识符连接到 一条“链”上,查表时,沿着这条“链”查找。这 种技术通常把表分为两个区:一部分称为链根区, 存放杂凑函数值不同的那些标识符;另一部分称为 链表区,存放所有冲突的标识符。 这是一种较好的解决冲突的方法,缺点是表区中的 链接地址(如LD)占用了一部分存储空间。
10.4 分程序结构的符号表
❖ ② 退出分程序。把该分程序的全部表项移到符号 表首部并使该分程序的外层分程序变为当前分程序。 B(Currbl).P:= Lastbl + 1; for i:= 1 step 1 until B(Currbl).NO do begin Lastbl:= Lastbl + 1; T(Lastbl):= T(SP); SP:= SP + 1; end; Currbl:= B(Currbl).Sno
h:= h + 2; if h≥4096 then h:= 0; end; @ (h):= x; g:= g + 1; return;
10.3.3 杂凑技术
查表算法:
Procedure HASHSEARCH;
begin f:= 0; 计算h (x)→h; while f2048 do
begin if @ (h) = x then return (查到表项x的信息); if @ (h) = 0 then return (error: 名无定义); h:= h + 2; if h 4096 then h:= 0; f:= f + 1
10.3 符号表的构造与查找
线性造表算法为 Procedure LINEARBUILD; begin for i:= n step –1 until 1 do if T[i] = x then return (error, 重名); n:= n+1; T[n]:= x; return; end;
10.3 符号表的构造与查找
10.3.3 杂凑技术
杂凑技术就是设计一杂凑函数h(x),其中x为任一标 识符,它把x映象成表区中某一单元的地址,并要求 当x y时,h(x) = h(y)的可能性尽量地小,即单元冲 突的可能性尽量地小。这样,在利用杂凑法造表时, 就能使要填入的标识符比较均匀地散列在整个表区 中(因此,杂凑法也称散列法)。
10.3.3 杂凑技术
用链接法存放方式示意图
链根区 S1
S2 S3
链表区
LD
S4
S5
0
S6Biblioteka 0S7S8
0
pointer
S9 S10
10.4 分程序结构的符号表
分程序结构符号表
分程序表
Sno
No
P
1 0(无) 4
21
3
31
4
43
1
分程序的编号(按 begin 的出现次序)
符号表
e, f, l1 b g, h, l2 l3 a, b, c, d
10.3.3 杂凑技术
解决冲突的方法 ❖ 线性探查法
线性探查法是解决冲突的最简单的一种方法,即当 发生冲突时,从冲突单元的下一位置开始,逐个查 寻,直至找到第一个所需位置(空单元)或指出语 法错(符号表溢出或标识符无定义)为止。 使用线性探查法解决地址冲突的缺点是:不容易将 表项均匀地分散到整个表区。
第十章 符号表的组织和查找
为了检查语义的正确性和生成代码,需要知道 源程序中所使用的各种标识符的属性,这些属性常 常由编译程序集中起来并存放在一个标识符表或符 号表中。本章讨论组织、构造和查找各种符号表的 方法。
10.1 符号表的一般组织形式
❖ 符号表的每一项(称为表项)包含两个部分,即主 目和值。表的主目通常即符号或标识符本身(变量 的名字),值乃是它们的属性,包括种属(如简单 变量、数组或过程等)和类型(如整型、实型、布 尔型等)。
相关主题