我在编译器设计课程中读到,扫描的输出是一系列对(令牌代码,符号表中的令牌位置)。我对“位置”部分的含义有些困惑。当符号表表示为一个可以使用索引访问其元素的结构时,例如数组,“位置”是明确的,它表示数组中的第 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"]),...)?
我真的不知道这是否是正确的方法,“位置”在树或哈希表中还有什么含义?
先感谢您!