1

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

int foo(int a, int b)

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

4

2 回答 2

1

我将作为单独的条目添加到符号表中,但在 foo 节点上有一个范围条款。这将使您能够报告变量的阴影/屏蔽。因此,对于 C,您可以在顶部定义一个模块 global int a ,然后将a作为参数将掩盖全局。这是一个有用的提示,您可以向用户发出警告,以免在同一范围内重新声明 a 符号。

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

正如 Ivan 所说,您需要根据您想要/需要检测的内容以及进行该检查的最简单方法来进行此调用。

于 2009-11-26T21:58:41.627 回答
0

你的问题很模糊。这完全取决于您以后将使用什么以及如何使用这些数据。

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

于 2009-11-26T11:23:21.833 回答