6

我的 yacc 解析器创建了一个符号表,但我需要考虑范围。我该怎么做?我听说过当你退出作用域时,符号表是如何被破坏的。如何做到这一点仍然不是很清楚。

4

2 回答 2

3

有很多方法可以处理符号表中的范围。一种非常简单的方法是为每个作用域创建一个单独的表并维护一个活动作用域列表。

每当输入新范围时,您都可以为其创建一个表并将其添加到活动范围列表的开头。当您离开范围时,只需删除活动范围列表的头部即可。

我通常发现您在解析完范围后不想破坏表。您稍后可能需要它来进行语义分析、生成调试信息等。

于 2009-11-30T22:23:07.100 回答
3

正如您似乎已经正确确定的那样,这个问题仅与 yacc 间接相关。(yacc 所做的只是将输入字符串与语法中的字符串匹配。)

因此,您可以在代码中进行所有符号管理和所有其他语义处理。您可以使用任何可以想象的数据结构。

组织起来的一些想法:

  • 您可以在进入嵌套范围时创建新的符号表,然后简单地向外执行多次查找,直到找到给定的符号。

  • 您可以使用单个表并使用其原始词汇级别标记每个符号。然后,您需要处理仅在词法级别不同的重复符号,并且需要一个可以返回多个符号的查找,但您只需要一个表。如果您不打算在退出范围后保留所有符号,那么这可能比它的价值更麻烦。如果您这样做,您可能希望保留一个单独的堆栈,其中包含一个根指针,以将给定范围内的所有符号链接在一起。

于 2009-11-30T22:28:31.500 回答