编译原理 符号表管理技术
作者:互联网
第六章 符号表管理技术
文章目录
6.1 概述
符号表:在编译过程中,编译程序用来记录源程序中各种名字的特性信息,所以也称为名字特性表。
名字:程序名、过程名、函数名、用户定义类型名、变量名、常量名、枚举值名、标号名等。
特性信息:上述名字的种类、类型、维数、参数个数及目标地址(存储单元地址)等。
符号表在编译过程中的作用:
源程序中变量要先声明,然后才能引用。
声明语句中,声明各种名字,给出类型维数等信息,编译时将这些信息登录到符号表中,并给变量分配存储单元,存储单元地址也登录在符号表中。
当编译到引用所声明的变量(赋值或引用其值)时,要进行语法语义正确性检查和生成相应的目标程序,需要查符号表以取得相关信息。
有关符号表的操作:填表和查表
填表:说明或定义语句中的名字、与之有关的信息填入符号表中。
查表:
-
填表前查表,检查同一作用域内名字是否重复定义
-
检查名字种类是否与说明一致
-
强类型语言中,表达式中各变量的类型是否一致
强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.net 、Python、C++等语言。
-
生成目标指令时,要去的所需要的地址
6.2 符号表的组织与内容
6.2.1 符号表的结果与内容
“名字”域:存放名字。一般为标识符的符号串,也可为指向标识符字符串的指针。
“特性”域:可包括多个子域,分别表示标识符的有关信息。如:
-
名字(标识符)的种类:简单变量、函数、过程、数组、标号、参数等
-
类型:如整型、浮点型、字符型、指针等
-
性质:变量形参、值形参
形参:全称为“形式参数”,是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
-
值:常量名所代表的数值
-
地址:变量所分配单元的首址或地址位移
-
大小:所占的字节数
-
作用域的嵌套层次
不同的种类存入的信息也是不同的。
数组:维数、上下界值、计算下标量地址所用的信息、数组元素类型等
记录(结构、联合):域的个数,每个域名、地址位移、类型等
过程或函数:形参个数、所在层次、函数返回值类型、局部变量所占空间大小等
指针:所指对象类型等
6.2.2 符号表的组织方式
1.统一符号表:不论什么名字都填入统一格式的符号表中
符号表表项应按信息量最大的名字设计。填表、查表比较方便,结构简单,但浪费大量空间
2.不同种类的名字分别建立各种符号表
节省空间,但是填表和查表不方便。
3.折中办法:大部分共同信息组成统一格式的符号表。特殊信息另设附表,两者用指针连接。
6.3 非分程序结构语言的符号表组织
非分程序的结构语言:每个可独立进行编译的程序单元时一个不包含有子模块的单一模块。如FORTRAN语言。
主程序与子程序通过公共区交流
标识符的作用域
全局:子程序名、函数名和公共区名
局部:程序单元中定义的变量
符号表的组织:
基本处理办法:
-
子程序、函数名和公共区变量填入全局符号表
-
在子程序(函数)声明部分读到标识符时,构造局部符号表
-
在语句部分读到标识符,查表。
-
程序单元结束:释放该程序单元的局部符号表。
-
程序执行完成:释放全部符号表
符号表的组织方式:
1.无序符号表:按扫描顺序建表,查表要逐项查找。查表操作平均长度:(n+1)/2
2.有序符号表:符号表按变量名进行字典式排序。线性查表同上,折半查表: l o g 2 n − 1 log_2n-1 log2n−1
3.散列符号表(Hash表),但需要解决冲突问题
6.4 分程序结构语言的符号表组织
(1)分程序的结构语言:模块内可嵌入子模块
(2)标识符的作用域和基本处理方法
作用域:标识符局部于所定义的模块(最小模块)
-
模块中所定义标识符的作用域是定义该标识符的子程序
-
过程或函数说明中定义的标识符(包括形参),其作用域为本过程体
-
循环语句中定义的标识符,其作用域为该循环语句
不能从循环体外转到循环体内,循环语句应看作一层。
基本处理办法:
建查符号表均要遵循标识符作用域规定进行。
建表;不能重复,不能遗漏。
查表:按标识符作用域查找。
处理方法:
假设标识符是先声明后引用(标号例外,要特殊处理)
即声明时插入,查看有无同名。引用时查找,通过转到直接外层的方法查看是否声明,并提取信息。
处理方法:预先将标准标识符填入名字表中,因为他们是全程量,所以应填入最外层。
分程序表结构
分程序的符号表形成顺序是2,4,3,1。该次序是闭分程序的次序(END出现的次序)
按先进后出的顺序扫描其中各个分程序,可设一个临时工作栈。
每当进入一层分程序时,就在栈顶预造该分程序的符号表,当遇到该层分程序的结束符(END)时,此时该分程序的全部登记项已位于栈顶,再将该分程序的全部登记项移至正式符号表中。
当过程和函数体编译完成后,应将与之对应的参数名和局部变量名以及后者的特性信息从符号表中删去。
标签:符号表,查表,作用域,程序,编译,原理,标识符,函数 来源: https://blog.csdn.net/weixin_43996402/article/details/115728856