我有一个关于在流氓中创建AST的问题。 我通常会做以下事情:
model = createM3FromEclipseProject(|project://testproject|);
decls = createAstsFromEclipseProject(model.id, false);
首先,我将collectBindings设置为true。但是对于某些项目,我得到了堆栈溢出错误。这可能是因为我使用Luna eclipse但它让我想知道collectionbinding会做什么?
我试图查找它,但我找不到任何文档(也许我的谷歌技能很糟糕)。我也尝试在同一个项目上运行它,使用不同的集合绑定设置并进行比较,但我真的看不到任何东西。
有人可以向我解释一下collectionbinding的作用,以及为什么你会(不)使用它?
感谢!!!
答案 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,可能是其他的东西)。
如果你现在被困住了,我会建议回到凯普勒。