不同数据结构在编译器设计中的作用是什么?


在编译过程中,每次遇到标识符时都会搜索符号表。如果找到新的名称或关于现有名称的新信息,则会添加数据。因此,在设计符号表结构时,需要一种能够有效地插入新条目并识别表中现有条目的方案。

数据结构中使用了四种符号表,如下所示:

  • 列表- 为符号实现数据结构的最简单明了的方法是线性记录列表,如图所示。

它可以使用单个数组或多个等效数组来保存名称及其相关数据。新名称按遇到的顺序插入列表中。可以从数组的开头搜索到指针AVAILABLE标记的位置(表示数组空闲部分的开头)来检索关于某个名称的数据。

  • 自组织列表- 通过增加少量额外空间,我们可以使用一个技巧来节省大量搜索符号表的时间。它可以为每个记录添加一个LINK字段,我们按照LINK指示的顺序搜索列表。当引用名称或第一次创建其记录时,可以通过移动指针将该名称的记录移动到列表的前面。

  • 搜索树- 符号表组织的更有效方法是为每个记录插入两个链接字段LEFT和RIGHT。我们使用这些字段将记录链接到二叉搜索树中。

这棵树具有这样的特性:通过遵循LEFT(i)链接,然后遵循任何链接序列,从NAME(i)访问的所有名称NAME(j)都将按字母顺序(符号上,NAME(j) < NAME(i))在NAME(i)之前。

二叉搜索树算法

  • 最初,Ptr将指向树的根。
  • 当Ptr ≠ NULL时
  • 如果NAME = NAME(Ptr)
  • 则返回true
  • 否则如果NAME < NAME(Ptr) 则
  • Ptr = LEFT(Ptr)
  • 否则 Ptr = RIGHT(Ptr)
  • 循环结束


  • 哈希表- 哈希表包含K个从0到K-1的条目。这些条目是指向符号表的指针,指向符号表的名称。我们可以使用哈希函数'h'来判断“Name”是否在符号表中,使得h(Name)的结果是0到K-1之间的整数。可以通过position = h(Name)来搜索任何名称。

更新于:2021年11月8日

3K+浏览量

开启您的职业生涯

完成课程获得认证

开始学习
广告