我有一个关于在rascal中创建AST的问题。
我通常会执行以下操作:
model = createM3FromEclipseProject(|project://testproject|);
decls = createAstsFromEclipseProject(model.id, false);
起初,我将collectBindings设置为true。但是对于某些项目,我会得到一个堆栈溢出错误。这可能是因为我使用了Luna eclipse,但这使我想知道collectionbinding的作用是什么?
我试图查找它,但找不到任何文档(也许我的Google技能不好)。我还尝试在具有不同设置的集合绑定(bind)和比较的同一项目上运行它,但是我什么都看不到。
有人可以向我解释collectionbinding的作用,以及为什么您会(不)使用它吗?
谢谢!!!
最佳答案
在解析Java代码之后,CollectBindings会执行下一步,即在代码中尽可能解析所有名称和类型的步骤。然后从Java编译器收集此信息,并将其直接存储到Rascal AST中。
因此,如果您需要精确的限定名称或表达式和变量的类型,则collectBindings
应该设置为true
。例如下面的代码:
int a = 0;
int b = a + a;
如果没有resolveBindings,则AST中
a
的两种用法将不会通过@decl
注释(即|java+variable:///something/a|
)指向声明,并且他们不会通过int()
注释知道它们是@typ
。甚至int a
声明本身也不知道其限定名称或类型。您看到的
StackOverFlowError
已由josvr在github上报告:https://github.com/cwi-swat/rascal/issues/735。这是由JDT Java编译器中的语义变化引起的(可能是错误,可能是其他)。如果您现在陷入困境,我建议您回到开普勒。