1.符号表的作用
2.符号表中存放的信息
3.符号表的组织结构
4.符号表与作用域
5.总结
一、符号表的作用
1.编译的各个阶段都有可能会用到符号表中登记的信息
1.1协助进行语义检查(检查一个名字的引用和之前的声明是否相符)和中间代码的生成
1.2在目标代码生成阶段,当需要为名字分配地址时,符号表中的信息将是地址分配的主要依据
1.3编译器用符号表来记录、收集和查找出现在源程序中的各种名字及其语义信息
2.符号表是以名字为关键字来记录其信息的数据结构,其上支持的两个最基本的操作应该是“添加表项” 和 “删除表项” 这个两个操作速度必须是高效的
二、符号表中存放的信息
1.记录源程序中出现的各种名字及其属性信息是符号表的首要任务。
2.显然同一个名字在一段程序中应该表示同一个对象,即同一个符号表中不能出现相同的名字,因此名字可以作为符号表的关键字。于是每一个符号表表项需要存放的基本信息就是符号的名字及其属性。表格中每一行表示一个表项
名字 | 属性 |
name | 变量名 name 的属性 |
a | 变量名 a 的属性 |
bb | 变量名 bb 的属性 |
3.符号表中的名字
3.1 名字的长度固定
名字项的长度大小取决于标识符允许的最大长度
不适于标识符长度变化范围较大的语言
浪费空间(就算很短的标识符也要分配同样固定长度的空间)
3.2 名字字段长度可变
好处--不用限制标识符的长度
不好处--符号表上的操作复杂而低效
3.3 引入一个单独的字符串表,将符号表中的全部标识集中放在这个字符串表中,而在符号表表项的名字部分只要给出相应标识符的首字符在字符串表中的位置即可。
名字 | 属性 | |
name的表项 | 4 | .。 |
a的表项 | 1 | 。。。 |
ab的表项 | 2 | 。。。 |
age的表项 | 3 | .。。。 |
n | a | m | e | a | a | b | a | g | e | 。 | 。 | 。 | 。 | 。 |
标识符的长度放在符号表中(ab的起始位置就等于name长度加上a长度的下一个位置)
名字 | 属性 | |
name的表项 | 0 | .。 |
a的表项 | 5 | 。。。 |
ab的表项 | 7 | 。。。 |
age的表项 | 10 | .。。。 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
4 | n | a | m | e | 1 | a | 2 | a | b | 3 | a | g | e | 。 |
标识符长度放在字符串表中(表项的名字字段存放的是该名字的长度在字符串表中的位置,例如age就是从表项中的名字字段获取位置 10 然后在字符串表中从 第十个位置开始取三位)
名字 | 属性 | |
name的表项 | 0 | .。 |
a的表项 | 5 | 。。。 |
ab的表项 | 7 | 。。。 |
age的表项 | 10 | .。。。 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
n | a | m | e | \0 | a | \0 | a | b | \0 | a | g | e | \0 | 。 |
用 \0 表示标识符的结束
4.符号表中的属性
4.1 符号所表达的含义不同,符号表中需要存放的属性也不同
数组名字需要存放的属性信息应该包括数组的维度和各维度的长度
函数(或过程)的名字因该存放其参数个数、个参数的类型、返回值的类型等
5.建立多个符号表来管理源程序中出现的各种符号,例如 常数表,变量表,函数表,数组表等
可能出现不同种类符号出现重名的问题
6.建立一张公用的大表,来管理各种符号,此时需要在符号表中增设一个标志来表明符号的种属
不同种类的符号所需要存放的属性信息在数量上的差异会造成符号表的空间浪费
名字 | 符号种类 | 类型 | 地址 | 扩展属性执行 | ||||||
name | 变量 | string | 0 | NULL | ||||||
i | 变量 | int | 4 | NULL | ||||||
myArray | 数组 | int | 8 |
|
多种符号公用符号表的一种实现结构
7.符号的地址属性
7.1 如果采用静态存储分配策略,则符号x绑定的地址等于静态分配的基址base加上符号x的偏移量offset
7.2如果采用的是栈式存储分配或者堆式存储分配等动态分配策略,则符号是在程序执行过程中和地址动态绑定的
7.2.1如栈式存储分配时,i 的地址是以栈指针sp为基址加上 i 相对于活动记录起始地址的偏移量 i
7.3符号表中各符号的地址属性就是该符号相对于第一个符号的偏移地址
三、符号表的组织结构
1. 符号表的线性表实现
2.符号表的散列表实现
三、符号表的作用域
2.程序块结构符号表的其他实现