我对HashMaps有疑问。我们正在编写一个小c(-ish)编译器,为此我们使用符号表。我们使用hashmap实现这一点。
现在考虑范围我们使用堆栈。所以每当我们进入一个新的范围时,我们就会在堆栈上推送一个表示这个标记的标记。然后,我们将堆栈中的所有键放在堆栈中,用于我们遇到的所有符号。到目前为止一切都很好。
当我们退出范围时,我们会弹出堆栈直到我们到达令牌。在此之前我们传递的每个符号都必须从我们的hashmap中取出。
给出以下代码:
{
a = 5;
{
a = 5;
}
}
hashmap会接受吗?在中,我会使用一个键作为键输入它们。这不会是一个问题,但是当弹出并不得不删除它们时,Java能否在这两个对象之间产生影响?或者第二个会覆盖第一个吗?
答案 0 :(得分:3)
我认为使用树木是更好的解决方案。树的每个节点定义变量的可见性块。在嵌套块的情况下,叶节点将覆盖变量的值。
答案 1 :(得分:1)
映射javadoc
将键映射到值的对象。地图不能包含重复内容 键强>;每个键最多可以映射一个值。
答案 2 :(得分:1)
不,这不起作用,因为您可能只有一个地图中给定键的值。
我会在范围之间使用委托机制。输入新范围时,创建一个新的Scope对象,并将此范围中定义的每个新符号存储在SCope对象包含的映射中。使Scope对象指向其封闭的Scope(从而委托给这个封闭的Scope来查找不在map中的变量的值),然后使创建的SCope成为当前的。退出块后,只需获取已结束范围的封闭范围,并将其作为当前范围。
答案 3 :(得分:1)
我想建议你2个解决方案。