斯卡拉的Scala AST

时间:2009-11-24 08:22:49

标签: scala abstract-syntax-tree

是否有Scala库解析Scala并创建抽象语法树(AST)?

理想情况下,我对Scala库感兴趣。 B计划将是一个Java库。

(我知道我可以利用Scala Syntax Summary中的EBNF。)

6 个答案:

答案 0 :(得分:8)

我认为访问AST的最佳方法是使用编译器插件。您应该在soft introduction之前阅读diving in deep

答案 1 :(得分:4)

一些现有的解析器:

如果使用规范中的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)

不确定纯scala解决方案,但如果您发现自己需要实施B计划,可以先查看ANTLRRats!