2011-10-31 60 views
1

我对HashMaps有疑问。我们正在编写一个small-c(-ish)编译器,为此我们使用了一个符号表。我们正在使用hashmap来实现这一点。Java HashMap重复存储桶条目

现在考虑范围我们使用堆栈。所以每次我们进入一个新的作用域时,我们都会在堆栈上推送一个表示这个标记的标记。然后,我们将hashmap中的所有密钥放在堆栈中,以查找我们遇到的所有符号。到现在为止还挺好。

当我们退出范围时,我们弹出堆栈直到达到令牌。我们之前通过的每个符号都必须从我们的散列图中删除。

考虑下面的代码:

{ 
    a = 5; 
    { 
     a = 5; 
    } 
} 

将HashMap中能接受吗?如在,我会输入他们作为一个关键。这不会是一个问题,但是当弹出并删除它们时,Java能够在这两个对象之间做出区别吗?或者第二个会覆盖第一个?

回答

1

地图的javadoc

将键映射到值的对象。地图不能包含重复 键;每个键可以映射到最多一个值。

+0

我读过它。但的确,这回答了它。 – KWyckmans

3

我认为使用树木是更好的解决方案。树的每个节点定义变量的可见性块。在嵌套块的情况下,叶节点将覆盖变量的值。

+0

嗯,我们将讨论这种可能性。 – KWyckmans

1

不,这不起作用,因为您可能只有一个给定的键值在地图上。

我会在范围之间使用委托机制。当您输入新范围时,创建一个新的范围对象,并将此范围中定义的每个新符号存储在SCope对象包含的映射中。使Scope对象指向它的封闭Scope(并因此委托给此封闭Scope查找不在映射中的变量的值),然后将创建的SCope设置为当前值。一旦您退出该块,只需将结束范围的封闭范围作为当前范围即可。

1

我想为您推荐2种解决方案。

  1. 地图的用户地图。这是JNDI的工作原理。每个名称空间都可以包含变量本身和映射自身的子上下文,并且可以包含其级别的变量。
  2. 使用点符号表示键。对于第一个在外部环境中定义的变量a而言是1.a,而对于第二个是1.1.a。
+0

想一想吧! – KWyckmans