【发布时间】:2009-11-24 08:22:49
【问题描述】:
是否有解析 Scala 并创建 抽象语法树 (AST) 的 Scala 库?
理想情况下,我对 Scala 库感兴趣。 B 计划将是一个 Java 库。
(我知道我可以利用 Scala Syntax Summary 中的 EBNF。)
【问题讨论】:
标签: scala abstract-syntax-tree
是否有解析 Scala 并创建 抽象语法树 (AST) 的 Scala 库?
理想情况下,我对 Scala 库感兴趣。 B 计划将是一个 Java 库。
(我知道我可以利用 Scala Syntax Summary 中的 EBNF。)
【问题讨论】:
标签: scala abstract-syntax-tree
我认为访问 AST 的最佳方式是使用编译器插件。您应该在diving in deep 之前阅读soft introduction。
【讨论】:
一些现有的解析器:
PsiBuilder API。如果使用规范中的 EBNF,请谨慎,显然有:
“附录和内联语法之间的不匹配,以及由 scalac 编译的语言(并在 scala 源中使用)与语法声明的语言之间的不匹配” -- Scala Trac bug #1826。
【讨论】:
您不能仅从语法为 Scala 构建 AST。有隐含需要考虑,而且要考虑它们,需要考虑类型推断器。
但是,您可以调用编译器本身——毕竟它只是一个 jar 文件。尤其是 Scala 2.8,有很多钩子可供其他程序使用——Miles Sabin 的工作,他正是这样做的,以便 Scala 的 Eclipse 插件可以以这种方式利用编译器。
我建议您访问 Scala Tools 邮件列表,并与那里的人取得联系。
【讨论】:
如果你想生成一段代码的 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
【讨论】:
这是一个编译器提交者http://github.com/paulp/scala-lang-combinators的项目
【讨论】: