编译原理ch8 符号表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6x
7
B4(a);
5 B2
0
… end; begin …
B3(c); … end;
4e
5
3c
4
2b
3
begin … B2(e);
… end
1a
2
栈符号表
10 6 1
DISPLAY
✓ 符号表的组织与作用 ✓ 名字的作用范围 符号表的内容
符号表的信息栏中登记了每个名字的有关性质
◦ 类型:整、实或布尔等 ◦ 种属:简单变量、数组、过程等 ◦ 大小:长度,即所需的存储单元字数 ◦ 相对数:指分配给该名字的存储单元的相对地址
begin
…
end
A(real) B(real) B(bool)
A(integr)
两种做法:
◦ 引入“过程编号”属性: 〈名字,过程编号〉
查找时,先查找本过程编号的名字,查不到则查找外层 过程编号的名字,…,等等.
◦ 按"栈"式思想组织符号表。
查找时,从后往前查找,碰到的第一个名字就是所需查 找的名字.
tx→
lastpar last psize vsize 0 1
bx→
指指向本向本程本程序程序体序体所体中有中最形最后参后本一所一程个需个序名体形体字积式所在、参有包数局括在部连数据所需空 nnama接me数teat据bab中所中的占的位空位置间置间大小
层次显示表display:描述正在处理的各嵌 套层,对程序体表进行管理
信息栏也可用间接组织方式,如数组标识符的内情向量表
array A [ l1 :u1 , l2: u2 , . . . , ln:un ]:type;
A array . . .
符号表
l1
... ln
u1
d1
un
dn
n address
内情向量表
连续存储
◦ 把每一项置于连续 K存储单元中,构 成一张K*N的表
m ints ints 0 1 10 1 10
ax→
(4) 中间代码表code code:用于存放编译程序所产生的每条中 间代码。
则原来的名字X在B2中仍然有效。如果B2对X重新作了说明,那么, B2对X的任何引用都是指重新说明过的这个X。
program main var A, B : real; … procedure P1 var B:boolean; … begin … end procedure P2 var A:integer; … begin … end
N:=K; END.
(4) +
M
1
(5) +
N
4
(6) :=
K
(7) return
RESULT
M N K M N
✓ 符号表的组织与作用 名字的作用范围 符号表的内容
在许多程序语言中,名字都有一个确定的作用范围. 两种程序体结构
◦ 单层(并列)结构,如FORTRAN
一个FORTRAN程序由一个主程序段和若干个辅程序段组成
显示层次关系表(嵌套层次表,display表)
◦ 存放各嵌套过程子表在主表起始位置
例.program B1(input,output)
const a=10
name
var b,c: integer; e: real; top 14
info previous
procedure B2(x:real) var f,g:real;
入口四元式:1
N:=K;
END.
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
VAR K:INTEGER;
表 0.4 标号表 LT
BEGIN
NAME INFORMATION
START: K:=M+1;
(1) START 四元式:(4)
M:=N+4;
N:=K;
END.
0 1 tx→
当 ref名指字向为该数▪存▪过av组a储d名 (程名vlr,类,单a在字当字当r型元程i名名种a标名(或的序b字字类数识相o字l体为e为o组对,表)符的变变l、一变)地(、可量b量类名次类量址t个名a名指n中数以型名b;字为型a布时时)向登组是时中m对,所 1(,(尔t包,的,于同记e(常y类填a在t括p量r位过ar主一 的e量入e型r的形fb置程,a指)他程程 第(中、参y有;c名程向们用so序序 一,的其过,整该)序的n,于存他中填体 个位数s程型相体入对标t情入组定中 名a置应((的该p况n他i于明在n值义定 字,rt变r静们ot数)e无名s、的义 的量f每c相组为)态e类字、变(层的l应个信或0di层n型是字u代量形息次上程k次r码的否符为参表e为一序)。的中)名为型0在2个体入的规,相字变(名口c在位应定依h填量地置字n活a主次址入形a;r动在sm程类当n)参记、eo名序推录t名ta布字y中的bp为尔分e层过类型程的名时,
T2 k2*N
. . .
N项 Tm km*N
按名字的不同种属建立多张符号表,如常数表、 变量名表、过程名表、…
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
VAR K:INTEGER;
BEGIN START:
表 0.1 符号名表 SNT NAME INFORMATION
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START; VAR
表 0.5 四元式表 QT
K:INTEGER; BEGIN START:
K:=M+1; M:=N+4;
OPR OPN1 OPN2 (1) link (2) par INCWAP 1 (3) par INCWAP 2
K:=M+1; M:=N+4; N:=K;
(1) 1 (2) 4
END.
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
VAR
K:INTEGER;
表 0.3 入口名表 ENT
BEGIN START:
K:=M+1; M:=N+4;
NAME INFORMATION (1) INCWAP 二目子程序,
13 B4
0
procedure B3(y:real)
12 h
13
const b=5;
11 b
12
var h:boolean;
10 y
11
procedure B4(z:integer) var i: char;
9 B3
0
begin…
8g
9
if e<0 then B3(f);
7f
8
… end; begin …
变量、数组和语句函 数名的作用范围就是 他们所处的程序段
把局部名和全局名分 指针1→ 别存在不同的地方
一遍扫描时,当一段 程序处理完后,其局 指针2→ 部名不需再保留.
局部名表
...
全局名表
符号表设计为栈符号表,新的名字出现总是从栈顶 填入
◦ top:栈顶指针 ◦ 信息栏指针域previous:指明同一层中前一名字的位置
type a=array[1..10, 1..10] of integer;
name kind typ ref
k a type arrays n
nametab
tx→
inxtyp eltyp elref low high elsize size
atab
n ints arrays m 1 10 10 100
符号表的组织与作用 名字的作用范围 符号表的内容
收集信息
◦ 源程序中的各种名字及其属性、特征等。
提供
◦ 上下文语义的合法检查的依据; ◦ 目标代码生成阶段地址分配的依据等。
NAME
INFORMATION
主栏(关键字) SAMPLE
...
项
WEIGHT
...
...
名字栏
信息栏
填入: 填入新名字、信息. 查找: 给出名字,确定它是否在表中. 访问: 给出名字,访问有关的信息. 更新: 给出名字,更新有关信息. 删除: 删除一个或一组记录.
▪size, 当名字为类型名时,填入该类型数据所需存储单元的数目
(2) 程序na体me表kbintdabl和ev层ty次p 显no示rm表adl irsepflaaydr/val/size link
0
程1序体表btab:记录个程序体的总信息,用于对源程序中 定义的名字的作用域进行分析;对名字表进行管理
名字表(nametab) 程序体表(btab) 层次显示表(display) 数组信息表(atab) 中间代码表(code)
1) 名字表(nametab)
名字表nametab:登记程序中出现的各种名字及其属性
name kind lev typ normal ref adr/val/size link
◦ 多层(嵌套)结构,如PASCAL,ADA
过程可以嵌套和递归
作用域:一个名字能被使用的区域范围称作这个名字的作 用域。
允许同一个标识符在不同的过程中代表不同的名字。
名字作用域规则—“最近嵌套原则”
◦ 一个在子程序B1中说明的名字X只在B1中有效(局部于B1); ◦ 如果B2是B1的一个内层子程序且B2中对标识符X没有新的说明,
直接方式:各栏长度固定, 内容直接填入
◦ 优点:易于组织、填写和查找 ◦ 缺点:浪费空间
间接方式:内容填入其他数据结构中,符号表栏中 仅放置指示器,指向该位置.
NAME ,6 ,6
...
INFORMATION
字符串数组:
S A M P L E W E I G H T ...
指针(指示器):标识符的起始位置 整数:标识符的长度
M 形式参数,整
K:=M+1; M:=N+4; N:=K; END.
型,值参数 N 形式参数,整
型,值参数 K 整型,变量
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
VAR K:INTEGER;
BEGIN
表 0.2 常数表 CT 值
START:
(VALUE)
0 1
level→
btab
lastpar last psize vsize 0 1
bx→
(3)数组信息表atab
inxtyp eltyp elref low high elsize size 1 2
ax→
数组的下数标组类元型素类型当元元素素数数为组组数信下组息限数数时在组组数,a上元ta组它限b素本指表的身向中体的该的积体积 位置,其他情况为0
设含N项的符号 表,每项K个字
第一项 ( K个字)
. . .
第N项 (K个字)
子表存放
◦ 把整个符号表分成m个子表,如T1,T2,…Tm,每个子 表含有N项.
来自百度文库
◦ 第i项的全部内容是T1[i]…Tm[i]的并
T1 T2 . . . Tm
N项 T1 k1*N
N项
.
.
.
各子表每项占 k1 k2 . . . km个字