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