如何解决符号表中的“删除”策略作为具有“紧密嵌套范围规则”的语言的哈希表实现
下面是红龙书的摘录。
最紧密嵌套的作用域规则可以通过对名称的以下操作来实现:
lookup
:查找最近创建的条目
insert
:创建一个新条目
delete
:删除最近创建的条目
哈希表由通过数组访问的 m
列表组成。因为一个名字总是散列到同一个列表中,所以单个列表的维护如图 7.37 所示。但是,为了实现 delete
操作,我们宁愿不必扫描整个哈希表来查找包含要删除的条目的列表。可以使用以下方法。假设每个条目有两个链接:
如果从哈希表中删除条目时作用域链接不受干扰,那么由作用域链接形成的链将构成相关作用域的单独(非活动)符号表。
从哈希表中删除条目必须小心,因为删除条目会影响其列表中的前一个条目。回想一下,我们通过使 i
lst 条目指向 i-1
st 来删除第 i + 1
个条目。 因此,仅使用范围链接查找第 i
个条目是不够的。如果散列链接形成循环链表,其中最后一个条目指向第一个条目,则可以找到第 i — 1
个条目。或者,我们可以使用堆栈来跟踪包含要删除的条目的列表。扫描新程序时,会在堆栈中放置一个标记。标记上方是包含此过程中声明的名称条目的列表编号。当我们处理完程序时,可以从堆栈中弹出列表编号,直到达到程序的标记为止。
从 1
和 2
点我可以理解如下,对于代码:
{
. int cp;
. char match;
. float last;
. int ws;
B0 {
. B1 ....
. }
}// B0,B1 represents blocks
蓝色链接对应于关于2
的点编号scope links
。(这是我从摘录中可以理解的)
但我无法理解他们在摘录的最后部分以粗体表示的 delete
问题。此外,可能的补救措施对我来说甚至不清楚,没有相同的图片解释。
请谁能帮帮我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。