0

我在编译器设计课程中读到,扫描的输出是一系列对(令牌代码,符号表中的令牌位置)。我对“位置”部分的含义有些困惑。当符号表表示为一个可以使用索引访问其元素的结构时,例如数组,“位置”是明确的,它表示数组中的第 1、2、99 个元素。例如,对于源代码:

if (a == b) a = a + c;

扫描的输出将是流:( ..., (id,1), ..., (id,2), ..., (id,3) ) - 我没有描述其他标记简单 -符号表将是(a,b,c),因此 a 在位置 1,b 在位置 2,c 在符号表中的位置 3。

当符号表表示为二叉搜索树时会发生什么?对于相同的源代码,符号表树将有一个带有键 'b' 的根节点;b 的左节点将具有键 'a'并且 b 的右节点将具有键 'c'。现在扫描的输出应该是什么( ...,(id,?), ..., (id,?),..., (id,?))?如果我的树是使用 Node 类实现的,我应该这样做:( ...,(id, reference to Node its key = a),...)吗?

当符号表是哈希表时呢?例如,在 C# 中,我可以有一个 Hashtable 对象 HashST 并且扫描的输出看起来像这样:(..., (id,pointer to HashST["a"]),...)

我真的不知道这是否是正确的方法,“位置”在树或哈希表中还有什么含义?

先感谢您!

4

1 回答 1

0

@Joachim Pileborg 写道:

一些语言,如 Pascal 和类似语言,没有关键字,而是有保留字,可以像任何其他符号一样输入符号表。它的“位置”只是符号在表中存储的索引。

“位置”可以是您想要的任何东西,包括指针,只要它是一种查找符号数据结构的方法。

于 2015-04-30T16:19:51.917 回答