我的yacc解析器创建了一个符号表,但我需要考虑范围。我该怎么办?我听说过当你退出一个范围时,符号表会被破坏。关于如何做到这一点还不是很清楚。
答案 0 :(得分:3)
有许多方法可以处理符号表中的作用域。一种非常简单的方法是为每个范围设置一个单独的表,并维护一个活动范围列表。
每当输入新范围时,您可以为其创建一个表并将其添加到活动范围列表的开头。离开范围时,只需删除活动范围列表的头部。
我通常发现在解析范围时你不想破坏表。稍后您可能需要它来进行语义分析,生成调试信息等。
答案 1 :(得分:2)
这个问题只与yacc间接相关,因为您似乎已经正确确定了。 (所有yacc都会将输入字符串与语法中的字符串匹配。)
因此,您可以在代码中执行所有符号管理和所有其他语义处理。您可以随意使用任何数据结构。
有些想法得到组织:
您可以在输入嵌套范围时创建新的符号表,然后只需向外执行多次查找,直到找到给定的符号。
您可以使用单个表格并将每个符号标记为其原始词汇级别。然后,您需要处理仅在词汇级别上不同的重复符号,并且需要可以返回多个符号的查找,但您只需要一个表。如果您不打算在退出范围后保留所有符号,那么这可能比它的价值更麻烦。如果这样做,您可能希望保留一个单独的堆栈,其中包含指向给定范围内所有符号的链接的根指针。