符号表

Aki 发布于 2023-08-19 238 次阅读


符号表(Symbol Table)是编程语言编译器和解释器中的一个重要数据结构,用于存储程序中各种标识符(变量、函数、类名等)与其相关信息之间的映射关系。符号表在编译和解释过程中起到了重要的作用,帮助编译器和解释器进行标识符的查找、类型检查、作用域管理等操作。

符号表通常包含以下信息:

  • 标识符名称(Identifier Name): 标识符的名称,如变量名、函数名等。
  • 数据类型(Data Type): 标识符所代表的数据类型,如整数、浮点数、字符串等。
  • 内存地址(Memory Address): 标识符在内存中存储的位置。
  • 作用域信息(Scope Information): 标识符所在的作用域,帮助解决变量名冲突等问题。
  • 存储信息(Storage Information): 标识符在内存中的分配方式,如在堆上还是栈上。
  • 是否初始化(Initialization Status): 标识符是否被正确初始化。
  • 访问权限(Access Permissions): 标识符的访问权限,如公开、私有等。
  • 其他属性(Other Attributes): 标识符可能有其他与语言特性相关的属性,比如是否是静态变量、是否是类的成员变量等。

符号表通常由编译器或解释器在代码分析阶段构建,并在后续的代码生成和优化阶段使用。编译器可以通过符号表来检查变量是否被正确声明、是否在正确的作用域内使用,以及进行类型检查等操作。解释器则可以通过符号表来解析和执行代码。

在词法分析阶段扫描源代码并且在符号表内为标识符创建条目;在语法分析阶段为标识符对应的条目添加更多信息,例如类型,范围,维度等等;语义分析阶段利用符号表内的信息检查语义是否正确和更新符号表;中间代码生成阶段生成中间代码,添加临时变量信息。

上图是符号表的简单例子,实际可能更加复杂。