符号表

2024 年 8 月 28 日 | 阅读 2 分钟

符号表是编译器中使用的一种重要数据结构。

符号表用于存储关于各种实体出现的信息,例如对象、类、变量名、接口、函数名等。分析和综合阶段都会用到它。

符号表用于以下目的

  • 它用于以结构化的形式在一个地方存储所有实体的名称。
  • 它用于验证变量是否已被声明。
  • 它用于确定名称的作用域。
  • 它用于通过验证源代码中的赋值和表达式在语义上是否正确来实现类型检查。

符号表可以是线性的,也可以是哈希表。它使用以下格式维护每个名称的条目。

例如,假设一个变量存储关于以下变量声明的信息

然后,它以以下格式存储一个条目

clause 属性包含与名称相关的条目。

实施

如果编译器用于处理少量数据,则符号表可以在无序列表中实现。

符号表可以使用以下技术之一来实现

  • 线性(排序或未排序)列表
  • 哈希表
  • 二叉搜索树

符号表主要实现为哈希表。

操作

符号表提供以下操作

Insert ()

  • Insert () 操作在分析阶段更频繁地使用,在该阶段识别令牌并将名称存储在表中。
  • insert() 操作用于在符号表中插入信息,例如源代码中出现的唯一名称。
  • 在源代码中,符号的属性是与该符号关联的信息。该信息包含关于符号的状态、值、类型和作用域。
  • insert () 函数以参数的形式接收符号及其值。

例如

应由编译器处理为

lookup()

在符号表中,lookup() 操作用于搜索名称。它用于确定

  • 符号在表中的存在。
  • 符号在使用前的声明。
  • 检查名称是否在作用域内使用。
  • 符号的初始化。
  • 检查名称是否被多次声明。

lookup() 函数的基本格式如下

此格式因编程语言而异。