Rascal:创建AST时bool collectBindings有什么作用?

时间:2014-12-10 09:37:51

标签: abstract-syntax-tree rascal

我有一个关于在流氓中创建AST的问题。 我通常会做以下事情:

model = createM3FromEclipseProject(|project://testproject|);
decls = createAstsFromEclipseProject(model.id, false);

首先,我将collectBindings设置为true。但是对于某些项目,我得到了堆栈溢出错误。这可能是因为我使用Luna eclipse但它让我想知道collectionbinding会做什么?

我试图查找它,但我找不到任何文档(也许我的谷歌技能很糟糕)。我也尝试在同一个项目上运行它,使用不同的集合绑定设置并进行比较,但我真的看不到任何东西。

有人可以向我解释一下collectionbinding的作用,以及为什么你会(不)使用它?

感谢!!!

1 个答案:

答案 0 :(得分:1)

CollectBindings在解析Java代码后执行另一个步骤,即在代码中尽可能地解析所有名称和类型。然后从Java编译器收集此信息并直接存储到Rascal AST中。

因此,如果您需要精确的限定名称或表达式和变量的类型,则collectBindings应设置为true。例如,在此代码中:

int a = 0;
int b = a + a;

如果没有resolveBindings,AST中a的两次使用将不会通过@decl注释|java+variable:///something/a|指向声明,并且他们不知道它们是int()通过@typ注释。即使int a声明本身也不知道其限定名称或类型。

josvr在github:https://github.com/cwi-swat/rascal/issues/735上报告了您看到的StackOverFlowError。它是由JDT Java编译器中语义的变化引起的(可能是一个bug,可能是其他的东西)。

如果你现在被困住了,我会建议回到凯普勒。