编译器扫描仪 - "位置"在符号表中的含义

时间:2014-10-05 10:09:31

标签: compiler-construction compilation lexical-analysis symbol-table

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

if (a == b) a = a + c;
扫描输出(...,(id,1),...,(id,2),...,(id, 3)) - 为简单起见,我没有描述其他令牌 - 符号表将是(a,b,c),所以a on位置1,b位于位置2,c位于符号表中的位置3。

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

当符号表是哈希表时怎么办?例如,在C#中,我可以使用Hashtable对象HashST,扫描输出如下所示:(...,(id,指向HashST [“a”]的指针),...)

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

提前谢谢!

1 个答案:

答案 0 :(得分:0)

@Joachim Pileborg写道:

  

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

     

"位置"可以是你想要的任何东西,包括指针,只要它找到符号数据结构的方式。