我有一个关于在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编译器中的语义变化引起的(可能是错误,可能是其他)。

如果您现在陷入困境,我建议您回到开普勒。

07-28 03:02