关于使用yacc解析器构建符号表的问题

时间:2009-11-26 11:00:41

标签: parsing grammar yacc

如果我的yacc解析器遇到以下代码:

int foo(int a, int b)

它应该添加int a和int b作为foo的属性吗?我现在拥有它的方式,它将a和b作为单独的表条目输入。

2 个答案:

答案 0 :(得分:1)

我会将符号表添加为单独的条目,但在foo节点上有一个scoping子句。这将允许您报告变量的阴影/屏蔽。因此,对于C,您可以在顶部定义一个模块全局 int a ,然后将 a 作为参数来屏蔽全局。这是一个有用的提示,您可以向用户发出警告,指出在相同范围内重新声明符号的交易破坏者。

在其他情况下,范围规则可能需要阻止重新声明的相同符号,例如嵌套for循环,其中迭代器具有相同的名称。

正如伊万所说,你需要根据你想要/需要检测的内容进行这个调用,以及最简单的检查方法。

答案 1 :(得分:0)

你的问题很模糊。这一切都取决于您以后使用数据的方式和方式。

您可以将它们用作AST中的单独节点,或者,如您所述,您可以将它们添加为foo()的属性。我相信,这件事的选择是你的。