符号表的组织与管理

合集下载

第六章符号表组织

第六章符号表组织

•S 第六章符号表组织
6.5.4 嵌套过程语言的栈式存储分配
•1.标识符的作用域 •·过程嵌套的一个关键问题:•标识符的作用域问题 。
• 标识符的作用范围往往与它所处的过程相关,也就 是说,同一个标识符,在不同的程序段里,代表不同的 对象,具有不同的性质,因此要分配不同的存储空间。
•·标识符的有效范围:•服从最小作用域原理;
INT•E试GE填R; 写符号表。
•SYNBL
•TYPEL
•arr
•t
•LENL
•200
•AINFL
•a
•1 •1
•20
0
•a
•1
•5
•it •4
p
•设:实型占8个存储单元,整型占4个单元,布尔型和字符型占1个单元。
PPT文档演模板
第六章符号表组织
• 【例6.3】有类型说 •TYPE rec = RECORD
•※ 结构:
PPT文档演模板
• LEVEL(层次号) –该过函静态层次嵌套号, • OFF(区距) –该过函自身数据区起始单元相对该 过函值区区头位置 ;
• FN(参数个数) – 该过函的形式参数的个数; • PARAM(参数表) – 指针,指向形参表; • ENTRY(入口地址) – 该函数目标程序首地址(运 行时填写);
PPT文档演模板
第六章符号表组织
6.5.2 活动记录
•1.三个概念
•过程:•一个可执行模块,过程或函数,通常完成特 定的功能。
•活动:•过函的一次执行。每执行一次过程体,则产 生该过函的一个活动。
•活动记录:•一个有结构的连续存储块。用来存储过 函一次执行中所需要的信息。
PPT文档演模板
• 活动记录仅是一种存储映像,编译程序所进行 的运行时刻存储分配是在符号表中进行的。

编译原理课件(刘铭)第6章

编译原理课件(刘铭)第6章

本章小结
也就是说标识符是一个没有意义 的字符序列,而名字有确切的意义。 在程序语言中标识符可以是一个变量 的名字或一个函数的名字。
例如 area , 作为标识符,它没有 任何意思,但作为名字,可以表示 变量名或函数名等。
本章小结
3. 符号表的查找
符号表查找算法与该符号表的构造方法 密切相关即有顺序查找、折半查找和杂 凑查找算法。
6.3 符号表的组织
一个编译程序,从词法分析、语法 分析、语义分析到代码生成的整个过程 中,符号表是连贯上下文进行语义检查、 语义处理、生成代码和存储分配的主要 依据,因此符号表的组织直接关系到这 些语义功能的实现和语义处理的时空效 率。
6.3 符号表的组织
符号表的表格形式
名 字 栏 信 息 栏
符号表的作用
符号表的组织
符号表的建立和查找
6.1 符号表的作用与生成期
符号表的作用 符号表用来存放程序语言中出现 的有关标识符的属性和特征。 符号表在整个编译期间的作用归 纳为以下几个方面: 将标识符的名字及属性登录在符号 表中
6.1 符号表的作用与生成期
在分析说明语句时,编译程序根 据说明语句信息将标识符的相应属性 如标识符的类型:实型,整型,布尔 型等;标识符的种属:数组名,变量 名,过程名,函数名等; 标识符的作用 域:全局变量或局部变量等信息登录 到符号表中。
名字栏存放标识符的名字,信息栏存放 名字相关属性。
. . .
. . .
6.3 符号表的组织
符号表的总体组织 1. 编译程序按名字的不同属性构造出多 个符号表。如常量表、变量名表等。 符号表结构相同,表项等长。不便管理。
2. 编译程序把语言中的所有名字组织在 一张符号表中。 符号表便于管理,但表结构复杂且表项 不等长。

第09章符号表

第09章符号表
tx 6 (9) ) LEV 1 BLOCK ... tx 0 (6) ) LEV 0 BLOCK 主程序
tx是 tx是BLOCK的 的 实际值参 实际值参
BLOCK(LEV+1,TX,…) ( , ) 递归进入分程序) 进入分程序 (递归进入分程序) 第1次调用 次调用block BLOCK(0,0,…) ( , , )
• tx :
的。
table表的下标指针,是以值参数形式使用 table表的下标指针,是以值参数形式使用 表的下标指针 值参数
• dx: 计算每个变量在运行栈中相对本过程基地 计算每个变量在运行栈中相对本过程 过程基地 址的偏移量 ,放在table表中的adr域,生成 目标代码时再 时再放在 目标代码时再放在code中的a域
ADR: ADR: DX ADR: ADR: DX+1 ADR: ADR: DX+2 SIZE: ADR: SIZE: 4 ADR: ADR: ADR: DX ……
名字
类型
层次/值 层次/
地址
存储空间
PL/0编译程序 PL/0编译程序
• Table表的下标指针tx补充说明: 表的下标指针 补充说明:
例程序说明部分为: 例程序说明部分为: Const(常量)无层次 常量) 常量 A=35,B=49; CONST A=35,B=49; C, VAR C,D,E; P; PROCEDURE P; VAR G ;… 对应名字表
NAME: NAME: A NAME: NAME: B NAME: NAME: C NAME: NAME: D NAME: NAME: E NAME: NAME: P NAME: NAME: G …… KIND: KIND: CONSTANT KIND: KIND: CONSTANT KIND: KIND: VARIABLE KIND: KIND: VARIABLE KIND: KIND: VARIABLE KIND: KIND: PROCEDUR KIND: KIND: VARIABLE …… VAL: VAL: 35 VAL: VAL: 49 LEVEL: LEVEL: LEV LEVEL: LEVEL: LEV LEVEL: LEVEL: LEV LEVEL: LEVEL: LEV LEVEL EL: LEVEL:LEV+1 ……

第9-10章 符号表管理和存储组织

第9-10章 符号表管理和存储组织

10.2 参数传递
当一个过程调用其它过程时,调用过程和被调过程之间 的通信经由非局部量或者经由参数传递。
10.2 参数传递
过程exchangel既使用了非局部量数组a,又使用了形式参i 和j,将a[i]和a[j]的值进行交换。
带有非局部变量和形参的PASCAL过程 (1) procedure exchangel(i,j: integer); //过程exchangel的头,带有形式参数i , j (2) var x: integer; (3) begin; (4) x∶=a[i]; a[i]∶=a[j]; a[j ]∶ =x //数组a是非局部变量 (5) end;
?若空闲块表中有若干个满足需要的空闲块,
该分配哪一块呢?通常有三种不同的分配策: ★首次满足法 ★最优满足法 ★最差满足法
(1)首次满足法
★只要在空闲块链表中找到满足需要的一 块,就进行分配。 ★如果该块很大,则按申请的大小进行分 割,剩余的块仍留在空闲块链表中 ★如果该块不很大,比如说,比申请的块 大不了几个字节,则整块分配出去,以免 使空闲链表中留下许多无用的小碎块。
栈式(stack) 堆式(heap)
栈式动态存储分配
◆将整个程序的数据空间设计为一个栈。在具有递归结构的程 序中,当调用一个过程时,所需的数据空间分配在栈顶,当 过程结束时释放空间。
◆栈式动态存储分配策略适用于PASCAL,C/C++,ALGOL之类 具有递归结构的语言的实现。
栈式动态存储分配
变长块管理
可以根据需要,分配长度不同的存储块,可以随要求而变 (1)按这种方法,初始化时存储空间是一个整块。按照 用户的需要,分配时先是从一个整块里分割出满足需要的 一小块,以后,归还时,如果新归还的块能和现有的空间 能合并,则合并成一块; (2)如果不能和任何空闲块合并,则可以把空闲块链成 一个链表。再进行分配时,从空闲块链表中找出满足需要 的一块,或者整块分配出去,或者从该块上分割一小块分 配出去。

第6章 符号表的组织

第6章 符号表的组织
第6章 符号表的组织与管 理
符号表的作用 符号表的组织 符号表的建立与查找
6.1符号表的作用 6.1符号表的作用
主要的数据结构 存放标识符的信息 各阶段都要访问符号表
作用1 作用1:纪录符号的属性
分析标识符说明部分时就开始纪录符号的 属性 例如 int A; float B[5]; 收集到A 收集到A的那些属性? 收集到B 收集到B的那些属性?
作用2 作用2:上下文语义的合法性检查的 依据
同一个标识符可能在程序的不同地方出现 而有关标识符的水性实在不同情况下收集 的,特别是多趟编译。 利用符号表中的属性进行语义的检查 例如:重定义冲突
作用3 作用3:目标代码生成阶段地址分配 的依据
除语言中规定的临时分配存储的变量,每 个符号变量在目标代码生成时需要确定其 存储分配的位置(相对位置)。 如C语言,要确定变量的位置 公共区(extern) 公共区(extern) 文件静态区(extern 文件静态区(extern static) 函数静态区(static) 函数静态区(static) 函数动态去( auto) auto)
2、符号的类型
函数和变量都具有数据类型(data type)属性, 函数和变量都具有数据类型(data type)属性, 对于函数的数据类型是该函数值的数据类型。 类型决定了分配的存储空间尺寸及数据存储 的格式。 类型的扩充,数组,结构体,指针等。
3、符号的存储类别 大多数语言通过关键字来指定存储类别 4、符号的作用域及可视性 5、符号变量的存储分配信息 6、符号的其他属性 数组的内情向量 结构类型的成员信息 函数的参数
6.2符号表的组织 6.2符号表的组织
6.2 符号表的组织方式
直接方式:名字栏长度固定。 间接方式:符号表中的相应栏存指针,指向 存储具体信息的位置。 符号表

07第7章-符号表管理技术

07第7章-符号表管理技术

符号表的组织方式要根据内存和存取速度的限制 做相应的调整。
2014-1-4
12
符号表的内容: 符号表是由一些表项组成的二维表格 每个表项可分为两部分: 名字域:存放符号名字; 属性域:记录与该名字相对应的各种属性
2014-1-4
13
符号表示例 名字 目标地址 Computer 0 X1 4 FORM 8 类型 2 1 3 维数 声明行 引用行 指针 1 2 9,4,5 7 0 3 12,14 0 2 4 6
2014-1-4
24
1、强类型语言:所有变量都必须显式说明。
(1)遇到变量声明时,先查找符号表以确定是否重复声明,若 是则产生错误信息,否则插入符号表。
有序表:先找位置再插入
无序表:添加表尾
(2)遇到变量引用时,查找符号表,若查到则将查到的信息用 于语义检查和代码生成,否则报告错误(变量未声明)
例: 给出编译下面程序的有序符号表。 main() { int m,n[5]; real x; char name; } 名字 类型 维数 m int 0 main keyword 0 n int 5 name char 0 x real 0
2014-1-4
30
③散列符号表: 散列符号表不仅可以提高查找操作的效率,同时也可以提高 插入操作的效率,所以在许多实际编译器的符号表实现中均 采用了散列技术 散列符号表又称哈希(hash)符号表,其关键在于哈希函数, 将程序中出现的符号通过哈希函数进行映射,得到的函数值 作为该符号在表中的位置。
2014-1-4 28
② 有序表:对每一个符号排序组织的符号表,在符号表中 的表项按其符号的字符代码串(可以看成一个整数值)值 的大小从大到小(或从小到大)排列的。 例:程序中符号的出现情况如下: ………… …a……//a第一次出现 …b……//b第一次出现 ……a…//a第二次出现 …d……//d第一次出现 ……c…//c第一次出现 …b……//b第二次出现 …… 其中h为表头,p为表尾 编译扫描次序是a,b,d,c。由于c代码小于d代码,因此c 应在d表项之前。 排序表的表项建立及符号查找,通常采用"二分法"。 2014-1-4 29

编译原理第九章—符号表

编译原理第九章—符号表

符号表的管理

符号表的作用反映了符号表的行为:

符号表的初始化 符号的登录 符号的查找 符号表中分程序结构层次的管理
符号表的初始化

符号表的表长是渐增变化的情况

线性组织和二分法组织 散列组织的符号表

符号表的表长是确定的情况

符号的登录

不同组织方式导致不同的登录方式

线性方法:图9.21 二分方法:图9.22 散列表:通过杂凑算法决定登录表项的位置; 名字登入 名字属性:取决于编译程序获得某个符号时编译所处的 程序扫描点的状态;

数据类型:


标识符符号的属性(信息)
三、符号的存储类别


由关键字指定; 用static定义属于文件的静态存储变量或属于函数内部的静 态存储变量 用regist定义使用寄存器存储的变量; 由变量在程序中位置决定; 函数外是程序的公共存储变量 函数内是内部变量; 编译过程语义处理、检查和存储分配的重要依据; 决定了符号变量的作用域、可视性和它的生命周期;

标识符符号的属性(信息)

影响变量可视性的情况:

复合语句分程序结构;
{ int a; … { char a; … { … { float a; … } … a … //引用char a } } }
标识符符号的属性(信息)

为确立符号的作用域和可视性,符号表属性 除了需要符号的存储类别之外还需要表示该 符号在程序结构上被定义的层次;
符号表的组织

符号表的总体组织 符号表项的排列 关键字域的组织 其他域的组织
符号表项的排列


第五章符号表的组织和管理

第五章符号表的组织和管理

5.2 符号表的主要属性及其作用
– 不同的符号类别包含了不同的属性,由于它们的信 息不同,也就导致了符号表的组织有较大的差别。 例如,数量类型的变量名字和过程名字:
• 对于一个变量名要记录其类型(如整型、实型、布尔型等)、占用 的存储字节以及相对与某个基准位置的相对位置; • 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否 有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言 允许嵌套过程声明)等信息。
不同的程序语言规定了符号 的不同性质以及语法、语义和规 则,几种基本的符号属性。
– (1)符号名
• 语言中的符号名通常用标识符来表示。根据语言的定义,程序中 出现的重名标识符定义将按照该标识符在程序中的作用域和可视 规则进行相应的处理。而在程序的运行过程中,符号表中的符号 名始终是唯一的标志。 • 在一些允许操作重载、类继承的语言中,函数名、操作名允许重 名,对于重载操作的标识符,它们可以通过参数的个数与类型以 及返回值的类型来区别;而对于操作的继承,编译器可以构造继 承图,同时保存类结构,这样就可以为每个操作和属性找到唯一 的定义。 • 例如,对应不同的参数类型,可以定义几个求和重载函数: int sum ( int a, int b) double sum ( double a, double b) float sum(float a, float b, float c) • 当某个函数中调用到重载函数时,编译器根据实参的类型和个数 去调用相应的函数。
• (3) 作为目标代码生成阶段地址分配的依据
– 标识符由它定义的存储类型或它在程序中的位置来确定。 – 首先是要确定变量存储的区域。例如,在Java语言中,整数 的类型(以及所占用的字节)有byte(1个字节)、short(2 个字节)、int(4个字节)以及long(8个字节),而float类 型占4个字节,double类型占8个字节。又如,对寄存器变量, 编译将尽可能地把它们保留在机器的寄存器当中,以提高运 行速度;而对在一个文件中定义的外部变量,它们要在不同 的源程序文件之间访问,需要编译程序把它们放在所有源程 序文件都可以方便寻找到的存储器的位置。 – 其次,要根据标识符出现的顺序,决定标识符在某个存储区 域中的具体位置,而有关区域的标志及其相对位置都是作为 该标识符的语义信息存放在它的符号表中的。

第9章 符号表(2学时)

第9章 符号表(2学时)

关键字池的结构: 关键字池的结构:
– 字符数组:符号表中的关键字段是该关键字在池中的位置; 字符数组:符号表中的关键字段是该关键字在池中的位置; – 字符串:符号表中的关键字段是指向该关键字在池中位置的 字符串: 指针。 指针。
四、其他域的组织
等长属性值域组织 1. 等长属性值域组织
– – – – – 是否已被定义标记( bit) 是否已被定义标记(1bit) 数据类型编号( bit) 数据类型编号(3bit) 存储类别编号( bit) 存储类别编号(n bit) 相对存储区头的位移量(整型量) 相对存储区头的位移量(整型量) 符号之间的关系(指针、指针链) 符号之间的关系(指针、指针链) 函数名和它的参数之间的关系, 如:函数名和它的参数之间的关系,结构 与成员之间的关系
四、符号表中分程序结构层次的管理
2. 单表结构
– 符号表中设立一个属性域用来登录符号 所在分程序的层次。 所在分程序的层次。 – 当编译程序扫描一个分程序时,层次的 当编译程序扫描一个分程序时, 状态量增加一;当退出一个分程序时, 状态量增加一;当退出一个分程序时, 层次的状态量减少一。 层次的状态量减少一。 – 不同的分程序中采用下推链组织,定义 不同的分程序中采用下推链组织, 重名的标识符。 重名的标识符。
如:同名的全局变量和局部变量,嵌套的语句块的内 同名的全局变量和局部变量, 外层的同名变量的声明。 外层的同名变量的声明。
使用指针将它们链在一起, 使用指针将它们链在一起,符号表中只存放最 内层的变量,其他变量放在下推链( 内层的变量,其他变量放在下推链(表)中; 当扫描退出一层时, 当扫描退出一层时,从下拉链中回推到符号表 中。
二、符号的登录
对于不同组织的符号表, 对于不同组织的符号表,登录方法也不同 线性组织的符号表 排序组织的符号表 散列组织的符号表

编译原理课件06符号表的组织与管理

编译原理课件06符号表的组织与管理

44
若一个函数是无参的,则该函数符号项中“函数-形参” 指
针域值为“空”,若某个形式参数是它所属函数的最后 一 个形式参数,则该形参符号项中“函数-形参”指针域 值
为“空”
例如,有函数: func1 (para1,para2,para3) func2 ( )
45
在符号表中得到如图9.11的表示:
首先要确定其被分配的区域
其次是根据变量出现的次序 而有关区域的标志及相对位置都是作为该变量的语义信息 被收集在该变量的符号表属性中
6
符号的主要属性及作用
语言符号可分为:关键字符号、操作符 符号、标识符符号 1.符号名:




标识符:变量的名字、函数的名字、过程的 名字 通常把一个标识符在符号表中的位置的整数 值称之为该标识符的内部代码 在经过分析处理的语言程序中标识符不再是 一个字符串而是一个整数值
8
3.符号的存储类别:
一种是用关键字指定,例如在FORTRAN中用COMMAN来
定义公共存储区变量,用SAVE来定义函数或过程的内部静 态存储变量,在C语言中用static定义是属于文件的静态存 储变量或属性函数内部的静态存储变量,用regist定义使用 寄存器存储的变量
9
另一种方式是根据定义变量说明在程序中的位置来决定, 例如在C语言中,在函数体外默认存储类关键字所定义的 变量是外部变量,即程序的公共存储变量,而在函数体内 默认存储类关键字所定义的变量是内部变量,即属性该函
3
二.符号表的功能
收集有关标识符的属性,并在符号表中建立符号的 相应属性信息 例如:int A; float B[5]; 2. 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性 例如,在C语言中同一个标识符可作引用说明和定义说明 ┇ int i[3,5]; //定义说明i ┇ extern float i; // 引用说明i ┇

第9章符号表

第9章符号表

源程序的形式 { //第一层分程序 int a; float b,d; { //第二层分程序 int c; float a; { //第三层分程序 int d; float c; { //第四层分程序 float d; ┊ a=b+c+d; ┊ } } } }
Level 1 Level 2 Level 3 Level 4
其它域的组织
1、等长属性值域组织 可以取相应的数据类型描述属性值。 如,基本数据类型可用3个bit表示:
char 000 short int long unsigned float double 001 010 011 100 101 110
函数形参链属性描述,见p217,图9.11 。 结构成员链属性描述,见p218,图9.12。
分程序结构的分表组织
进入分程序第一层时的符号表层次属性描述
单表结构
分程序结构
进入分程序第二层时的符号表层次属性描述 单表结构
分程序结构
进入分程序第三层时的符号表层次属性描述
单表结构
分程序结构
进入分程序第四层时的符号表层次属性描述
单表结构
分程序结构
练习
对照课件,好好看书吧!
第9章 符号表
9.1 符号表的作用和地位 9.2 符号的主要属性及作用 9.3 符号表的组织 9.4 符号表的管理
1 符号表的作用和地位
在编译程序中符号表用来存放语言程序中出现的 有关标识符的属性信息,这些信息集中反映了 标识符的语义特征属性。
在词法分析及语法在分析过程中不断积累和更新 表中的信息,并在词法分析到代码生成的各阶 段,按各自的需要从表中获取不同的属性信息。
收集符号属性 编译程序扫描说明部分收集有关 标识符的属性,并在符号表中建立符号的相应 属性信息。 上下文语义的合法性检查的依据 同一个标识符 可能在程序的不同地方出现,而有关该符号的 属性是在这些不同情况下收集的。通过符号表 中属性记录可进行相应上下文的语义检查。 作为目标代码生成阶段地址分配的依据 每个符 号变量在目标代码生成时需要确定其在存储分 配的位置。首先要确定其被分配的区域;其次 是根据变量出现的次序,决定该变量在某个区 中所处的具体位置 。

第六章6.3 符号表的管理

第六章6.3 符号表的管理

下图表示线性符号表登录新符号symbol i的前后情况:
对于二分法组织的符号表,根据登录符号在符号 表中按词典排序所确定的位置,把该位置以后的所 有原表项下移一个表项的位置,然后在选定位置登 录新符号
下图表示在排序符号表中登录新符号symbol k的前后情况:
symbol k
对于散列表,新符号的登录是通过杂凑算法决定 登录表项的位置
Pascal过程声明嵌套的例子
procedure P( ); var x,y:integer; procedure Q( ); var x,z:real; begin ....... end
begin ......
end
带有分程序的C程序的例子
void main( )
{ int a = 1;
B1
例3:
1. procedure P( )
2.
var i, j, k: integer;
{t1} i ……
j …… k ……
3.
procedure Q( )
4.
var x, y: real; {t2}
x …… y ……
5.
procedure R( )
6.
var a, x: boolean; {t3} a …… x ……
可行的解决方法:把所有符号的可能属性作为符号 表表项属性。
– 忧点:有助于降低符号表管理的复杂度; – 缺点:对于某些类具体符号可能增加无用的属性空间,
从而增加了空间开销。
第2种方法组织上例中的符号得到一张符号表,如下图所 示:
3、折中方式
根据符号属性相似程度分类组织成若干张表,每 张表中记录的符号都有比较多的相同属性。
6.3 符号表的管理

编译原理 第四章 符号表

编译原理 第四章 符号表

4.4.2 符号表的查填
1)隐式说明语言的符号表查填 2)显示说明语言的符号表查填
4.4.3 符号表的删除
当不再使用单词的定义时,需要从符号表中删除单词 定义提供的信息。
4.3.2 常用符号表结构
1)无序符号表 2)有序符号表 3)散列表 4)树结构符号表 5)栈符号表
4.4
符号表的管理
4.4.1 符号表的初始化
1)对于静态符号表,当编译程序开始扫描程序时,符号表 是预先构造好并存于内存的。 2)对于动态符号表,如标识符表、标号表、数值信息表等, 是编译程序在编译过程中根据需要构造的。
第四章 符号表
4.1
符号表的地位及作用
符号表是编译程序的一个主要数据结构,符 号表通常与编译程序的各个阶段有关,编译程序 的各阶段需要不断向符号表输入信息,或者通过 它消除二义性。
符号表的作用可归结为以下几个方面: ① 收集单词属性 ② 语义的合法性检查 ③ 地址分配的依据
4.2
单词的属性及符号表的内容4. Nhomakorabea.1 单词的基本属性
1)保留字的属性 2)特殊符号的属性 3)常量的属性 4)标识符的属性
4.2.2 标识符的处理
1)标识符的定义性出现与应用性出现 2)标识符的作用域
4.2.3 符号表的内容
4.3
符号表的组织
4.3.1 符号表的总体组织
1)将所有语言中的单词都组织在一张符号表中 2)将属性完全相同的那些单词组织在一起 3)将单词属性相似的单词组织在一起
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

10
例如,在一个 C 语言程序中出现
int A[2][3]; //定义整型数组 A float A[4][5]; //定义实型数组 A,重定义冲突 int A[2][3]; //定义整型数组 A,重定义冲突
编译过程首先在符号表中记录了标识符 A 的属性是2×3个整型 元素的数组;
而后在分析第二、第三这两个定义说明时编译系统可通过符号表 检查出标识符 A 的二次重定义冲突错误。
本例还可以看到不论在后二句中 A 的其它属性与前一句是否完全 相同,只要标识符名重定义,就将产生重定义冲突的语义错误。
11
作用三:目标代码生成阶段地址分配的依据
每个符号变量在目标代码生成时需要确定其在存储分配的位置 (主要是相对位置)。语言程序中的符号变量由它被定义的存 储类别(如在 C、FORTRAN语言中)或被定义的位置(如分程 序结构的位置)来确定。 首先要确定其被分配的区域。例如,在 C 语言中首先要确 定该符号变量是分配在公共区(extern)、文件静态区 (extern static)、函数静态区(函数中static)、还 是函数运行时的动态区(auto)等。 其次是根据变量出现的次序,决定该变量在某个区中所处的 具体位置,这通常使用在该区域中相对区头的相对位置确定。 而有关区域的标志及相对位置都是作为该变量的语义信息被 收集在该变量的符号表属性中。 12
13
1、符号名
语言中的一个标识符可以是一个变量的名字、一个函数的名字 或一个过程的名字。 每个标识符通常由若干个字符(非空格字符)组成的字符串来 表达。
符号表中设置一个符号名域,存放该标识符,该域通常就是符 号表的关键字域。
14
通常在语言程序中标识符字符串是一个变量、函数或过程的唯 一标志,因此在符号表中符号名作为表项之间的唯一区别一般 不允许重名。从而该符号名与它在符号表中的位置建立起一一 对应之关系,使得我们可以用一个符号在表中的位置(通常是 一个整数)来替换该符号名。 通常把一个标识符在符号表中的位置的整数值称之谓该标识符 的内部代码。 在经过分析处理的语言程序中标识符不再是一个字符串而是一 个整数值,这不但便于识别比较而且缩短了表达的长度。
个外部变量符号的定义在整个程序中只能出现一次,同名变量 的说明可以出现多次那是为了使用和编译的方便。在函数外说 明的定义的静态变量的作用域是定义该静态变量的文件,而在 函数内部定义的静态变量其作用域仅仅是该变量定义所在的函 数或过程中。与局部量不同的是,这些内部静态量在其作用域 之外,仍然保持存在。 一般来说一个变量的作用域就是该变量可以出现的场合,也就 是说在某个变量作用域范围内该变量是可引用的,这就是变量 可视性的作用域规则。 21
2
【学习指南】
在编译程序中符号表用来存放源程序中出现的有关名字的属 性信息,这些信息集中反映了名字的语义特征属性。 符号表在编译全过程的地位和作用非常重要,是进行上下文 合法性检查和语义处理及代码生成的依据。
符号表总体结构的设计和实现是与源语言的复杂性(包括词 法结构、语法结构的复杂性)有关,还与对于编译系统在时 间效率和空间效率方面的要求有关。
① 数组内情向量 编译程序处理数组说明的主要工作是,把描述数组属
性信息的内情向量登录到符号表中。内情向量包括数组类型,维数,各 维的上、下界及数组首地址,这些属性信息是确定存储分配时数组所占 空间的大小和数组元素位置的依据。
② 记录结构型的成员信息 一个记录结构型的变量,在存储分配时所
占空间大小要由它的全体组成成员来确定,另外对于记录结构型变量还 需要有它所属成员排列次序的属性信息。这二种信息用来确定结构型变 量存储分配时所占空间的尺寸及确定该结构成员的位置。
第六章 符号表
§ 6.1 符号表的作用 § 6.2 符号表的组织 § 6.3 符号表的建立和查找
1
【学习目标】
符号表作为编译系统的重要设施,贯穿于文法分析、检查和语 义处理的编译全过程。 本章目的使学生深刻全面地了解符号表的地位和作用; 掌握符号表的组织和管理方法;以及编译过程中符号表的操作 活动过程。
3
【难重点】
符号表总体组织的选择原则。
变量的类型和存储类别等属性的重要性。
采用单表结构时,如何解决分程序构造中同名名字声明的 可视性规则。 采用分表结构适合哪种语言的编译系统。
4
§6.1 符号表的作用
在编译程序中符号表用来存放语言程序中出现的有关标识符 的属性信息,这些信息集中反映了标识符的语义特征属性。 1.在词法分析及语法在分析过程中不断积累和更新表中的信 息;
第三层所引用的 a, 不是第四层的 float a; 不是第一层 int a; 而是第二层 char a; 也就可以说从第三层向外,看 到的第一个定义 a 的变量定义 即 char a。
23
怎么确立符号的作用域和可视性?
为确立符号的作用域和可视性。符号表属性中除了需要符号的 存储类别之外还需要表示该符号在程序结构上被定义的层次。 符号表中设置一个表达符号所在层次的属性域,存放该符号的 定义层次。 无论是作为函数形参的定义也好或作为分程序中的局部定义也 好,都可统一地用定义层次来区分。 一般来说,若把外部变量视为 0 层的话,则函数内部作为第 1 层,依次向内嵌套定义的分程序分别为 2,3,…层。
① 静态存储区 该存储区单元经定义分配后成为静态单元,即在整个语言 程序运行过程中是不可改变的。
② 动态存储区 根据变量的局部定义和分程序结构,编译程序设置动态存 储区来适应这些局部变量的生存和消亡。 局部即在该定义范围之外此变量已经没存在的必要。 动态变量的生存期是定义该变量的局部范围。 25
6、符号的其它属性
15
根据语言的定义,程序中出现的重名标识符定义将按照该标识 符在程序中的作用域和可视性规则进行相应的处理。 而在符号表运行过程中,表中的标识符名始终是唯一的标志。 在一些允许操作重载(operator over load)的语言中,函 数名、过程名是可以重名的,对于这类重载的标识符要通过它 们的参数个数和类型以及函数返回值类型来区别,以达到它们 在符号表中中变量的类型也得到了扩充, 目前大多数语言已定义了在基本数据类型基础上扩充的复合数 据类型。 复合数据类型有数组类型、记录结构类型等,它们都是由基本 数据类型组合而成的。数组或记录结构中的每个基本元素可以 是基本数据类型,也可以是其它任何一种组合式数据类型,构 成嵌套式数据类型定义。作为存储变量地址的指针类型所指向 的变量同样可以是基本数据类型,也可以是其它任何一种组合 式数据类型。定义一个变量的基本数据类型或它的组合类型都 是符号表中表示标识符属性的重要信息。 符号表中设置一个符号类型域,存放该符号的类型。对复合数 据类型,通常还需要设置该类型的扩展成分,以存放复合类型 的完整的类型属性。 18
符号的主要属性及作用
1.符号名 变量名、函数名、过程名等,重载信息 2.符号类型 int、float等,函数的类型看返回值 3.符号的存储类型 Common、Static、Auto、Regist 4.符号的作用域及可视性 Public、Private等 5.符号变量的存储分配信息 静态存储区、动态存储区 6.符号的其他属性 数组内情向量、结构成员信息、函数及过程的形参
在 C 语言程序中函数之间是并列定义的,因此每个函数内部 都定义为第一层,而函数内的分程序也可以是并列定义的,对 于并列定义的分程序当然具有相同的层次号。
24
5、符号变量的存储分配信息
根据符号变量的存储类别定义及它们出现的位置和次序来确定 每一个变量应分配的存储区及在该区中的具体位置,用相对区 头的位移量表示。 通常有两类存储区,即静态存储区和动态存储区;
6
几乎在编译程序工作的全过程中,都需要对符号表进行频繁 地访问(查表或填表),其耗费的时间在整个编译过程中占有 很大的比例。 因此,合理地组织符号表并相应选择好的查、填表方法是提 高编译程序工作效率的有效办法。
7
符号表的作用
1.收集符号属性
2.上下文语义的合法性检查的依据 3.作为目标代码生成阶段地址分配的依据
16
2、符号的类型
标识符中除过程标识符之外函数和变量标识符都具有数据类 型(data type)属性。 对于函数的数据类型指的是该函数值的数据类型。 基本数据类型有整型、实型、字符型、逻辑型(布尔型)及 位组型等,符号的类型属性是在语言程序中该符号的定义中 得到。
变量符号的类型属性决定了该变量的数据在存储空间的存储 格式,还决定了在该变量上可以施加的运算操作。
3、符号的存储类别
大多数语言对变量的存储类别定义采用二种方式。 一种是用关键字指定。 例如在 C 语言中用 static 定义是属于文件的静态存 储变量或属于函数内部的静态存储变量,用 register 定义使用寄存器存储的变量。 一种方式是根据定义变量说明在程序中的位置来决定。 例如在 C 语言中,在函数体外缺省存储类关键字所定义 的变量是外部变量,即程序的公共存储变量,而在函数体 内缺省存储类关键字所定义的变量是内部变量,即属于该 函数所独有的私有存储变量(通常是动态分配的存储变 量)。
2.在词法分析到代码生成的各阶段,按各自的需要从表中获 取不同的属性信息。
3.不论编译策略是否分趟,符号表的作用和地位是完全一致 的。
5
根据编译程序工作阶段的不同划分,名字表中的各种信息将 在编译程序工作过程中的适当时候填入。 对于在词法分析阶段就建立符号表的编译程序,当扫描源程 序识别出一个单词(名字)时,就以此名字查找符号表; 若表中无此名的登记项,就将此名字填入符号表中; 至于与此名相关的其它信息,可视工作方便分别在语法分析、 语义分析及中间代码生成等阶段陆续填入。 在语义分析时,符号表中的信息可以用于语义检查; 在代码优化时,编译程序则利用符号表提供的信息选出恰当 的代码进行优化; 而目标代码生成时,编译程序将依据符号表中的符号名来分 配目标地址。
相关文档
最新文档