是否有Scala库解析Scala并创建抽象语法树(AST)?
理想情况下,我对Scala库感兴趣。 B计划将是一个Java库。
(我知道我可以利用Scala Syntax Summary中的EBNF。)
答案 0 :(得分:8)
我认为访问AST的最佳方法是使用编译器插件。您应该在soft introduction之前阅读diving in deep。
答案 1 :(得分:4)
一些现有的解析器:
PsiBuilder
API。如果使用规范中的EBNF,请务必小心:
“附录与内联语法之间的不匹配,以及scalac编译的语言(以及scala源中使用的语言)与语法所声称的语言之间的不匹配” - Scala Trac bug #1826。
答案 2 :(得分:2)
您无法仅从语法中为Scala构建AST。有必要考虑,并且考虑它们,需要考虑类型推断器。
但是,你可以调用编译器本身 - 毕竟它只是一个jar文件。特别是Scala 2.8,其他程序有很多钩子可供使用--Miles Sabin的工作正是这样做的,因为Scala的Eclipse插件可以这样利用编译器。我建议您访问Scala Tools邮件列表,并与那里的人联系。
答案 3 :(得分:2)
如果要生成一段代码的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
答案 4 :(得分:1)
以下是其中一个编译器提交者http://github.com/paulp/scala-lang-combinators
的项目答案 5 :(得分:0)