是否有一个Scala库可以解析Scala并创建一个抽象语法树(AST)?Scala中的Scala AST
理想情况下,我对Scala库感兴趣。计划B将是一个Java库。
(我知道我可以利用从Scala Syntax Summary的EBNF)
是否有一个Scala库可以解析Scala并创建一个抽象语法树(AST)?Scala中的Scala AST
理想情况下,我对Scala库感兴趣。计划B将是一个Java库。
(我知道我可以利用从Scala Syntax Summary的EBNF)
我想访问AST的最好方法是使用编译器插件。您应该在diving in deep之前阅读soft introduction。
不能单从语法建立斯卡拉的AST启动。有暗示考虑,并考虑他们,有类型推理考虑。
但是,您可以调用编译器本身 - 毕竟它只是一个jar文件。特别是,Scala 2.8对于其他程序的锁定有很多障碍 - Miles Sabin的工作,他正在这样做,以便Eclipse的Scala插件可以以这种方式利用编译器。
我建议你去Scala工具邮件列表,并与那里的人联系。
您可以在不考虑语言的语义方面(如类型和含义)的情况下为Scala构建AST。毫无疑问,对于许多应用程序而言,您希望将它们考虑在内,但不一定全部。 – 2009-11-24 15:24:04
我可以想象,仅仅需要用户写一个AST以及一个反映蕴含和其他因素对最终用于代码生成的精确AST有贡献的因素。 – 2009-11-24 15:26:19
最初,我在想,我并不关心scala代码的真正语义解释,但是你关于隐含和类型推断的观点是一个很好的观点......我想我肯定会需要后者,所以仔细观察Scala编译器似乎比较谨慎。 – AWhitford 2009-11-27 08:20:53
一些现有的解析器:
PsiBuilder
API的Scala编写的parser。要小心,如果使用来自规范的EBNF,有明显:
“不匹配的附件和内联语法之间,并且不匹配由scalac编译(和利用在斯卡拉的语言之间来源)和语法声明的语言“ - Scala Trac bug #1826。
关于EBNF的提示很有用。这意味着JavaCC,ANTLR等可能是一个挑战。 IDE编译器倾向于有自己的细微差别,因为他们对实时编译感兴趣 - 这不是我需要的。 – AWhitford 2009-11-27 08:30:46
如果你想生成一段代码的AST的一个项目。你可以使用Scala的反思:
showRaw(reify{
//your code here like:
print(2)
})
上面的代码将产生一个AST:
Expr(Apply(Select(Ident(scala.Predef), TermName("print")), List(Literal(Constant(2)))))
参考:
http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html
Scala编译器插件看起来很有希望。 – AWhitford 2009-11-27 08:25:12