编译原理学习笔记 6.3 非分程序结构语言的符号表组织

前言

参考课上PPT内容。 该学习笔记目前仅打算个人使用。
后续会进一步整理,包括添加笔记内容,标明参考资料。

更新中。。。

跳过目录

一、非分程序的结构语言

  • 每个可独立进行编译的程序单元是一个不包含有子模块的单一模块。
  • 如FORTRAN语言。

FORTRAN程序构造
编译原理学习笔记 6.3 非分程序结构语言的符号表组织
主程序和子程序中可定义common语句:

  • FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,也可以通过建立公用区的方式来完成。

  • 两种公用区:无名公用区、有名公用区

  • 任何一个程序中只可能有一个无名公用区;

  • 一个程序中可以根据需要开辟任意多个有名公用区。

  • 无名和有名公用区都通过COMMON语句来进行建立。

编译原理学习笔记 6.3 非分程序结构语言的符号表组织

二、标识符的作用域及基本处理办法

作用域

标识符具有两种作用域:

  • 全局:子程序名、函数名和公共区名。
  • 局部:程序单元中定义的变量。

符号表的组织

编译原理学习笔记 6.3 非分程序结构语言的符号表组织

基本处理办法

  1. 子程序、函数名和公共区变量填入全局符号表。

  2. 在子程序(函数)声明部分读到标识符时,构造局部符号表:

    查本程序单元局部符号表,有无同名

    • 有:重复声明,报错
    • 无:填表
  3. 在语句部分读到标识符,查表:

    查本程序单元局部符号表,有无同名

    • 有:已声明过
    • 无:查全局变量表
      • 有:全局量
      • 无:无定义标识符
  4. 程序单元结束时,释放该程序单元的局部符号表。

  5. 程序执行完成时,释放全部符号表。

三、符号表的组织方式

  • 无序符号表
  • 有序符号表
  • 散列符号表( Hash表)

无序符号表

按扫描顺序建表,查表要逐项查找。

  • 查表操作的平均长度:(n + 1) / 2

有序符号表

符号表按变量名进行字典式排序。

  • 查表操作的平均长度
    • 线性查表:( n + 1) / 2
    • 折半查表:θ(log2n)

散列(Hash)符号表

符号表地址 = Hash(标识符)

  • 解决:冲突