编译原理学习笔记 6.3 非分程序结构语言的符号表组织
前言
参考课上PPT内容。 该学习笔记目前仅打算个人使用。
后续会进一步整理,包括添加笔记内容,标明参考资料。
更新中。。。
一、非分程序的结构语言
- 每个可独立进行编译的程序单元是一个不包含有子模块的单一模块。
- 如FORTRAN语言。
FORTRAN程序构造
主程序和子程序中可定义common语句:
-
FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,也可以通过建立公用区的方式来完成。
-
两种公用区:无名公用区、有名公用区
-
任何一个程序中只可能有一个无名公用区;
-
一个程序中可以根据需要开辟任意多个有名公用区。
-
无名和有名公用区都通过COMMON语句来进行建立。
二、标识符的作用域及基本处理办法
作用域
标识符具有两种作用域:
- 全局:子程序名、函数名和公共区名。
- 局部:程序单元中定义的变量。
符号表的组织
基本处理办法
-
子程序、函数名和公共区变量填入全局符号表。
-
在子程序(函数)声明部分读到标识符时,构造局部符号表:
查本程序单元局部符号表,有无同名
- 有:重复声明,报错
- 无:填表
-
在语句部分读到标识符,查表:
查本程序单元局部符号表,有无同名
- 有:已声明过
- 无:查全局变量表
- 有:全局量
- 无:无定义标识符
-
程序单元结束时,释放该程序单元的局部符号表。
-
程序执行完成时,释放全部符号表。
三、符号表的组织方式
- 无序符号表
- 有序符号表
- 散列符号表( Hash表)
无序符号表
按扫描顺序建表,查表要逐项查找。
- 查表操作的平均长度:(n + 1) / 2
有序符号表
符号表按变量名进行字典式排序。
- 查表操作的平均长度
- 线性查表:( n + 1) / 2
- 折半查表:θ(log2n)
散列(Hash)符号表
符号表地址 = Hash(标识符)
- 解决:冲突