15

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

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

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

4

6 回答 6

9

我认为访问 AST 的最佳方式是使用编译器插件。在深入研究之前,您应该阅读软介绍

于 2009-11-24T09:01:54.010 回答
4

一些现有的解析器:

如果使用规范中的 EBNF,请小心,显然有:

“附录和内联语法之间的不匹配,以及由 scalac 编译的语言(并在 scala 源代码中使用)与语法声明的语言之间的不匹配”——Scala Trac 错误 #1826

于 2009-11-24T18:02:22.473 回答
2

您不能仅从语法为 Scala 构建 AST。有隐含需要考虑,并且,要考虑它们,需要考虑类型推断器。

但是,您可以调用编译器本身——毕竟它只是一个 jar 文件。尤其是 Scala 2.8,有很多钩子可供其他程序使用——Miles Sabin 的工作,他正是这样做的,以便 Scala 的 Eclipse 插件可以以这种方式利用编译器。

我建议您访问 Scala Tools 邮件列表,并与那里的人取得联系。

于 2009-11-24T14:23:33.757 回答
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

于 2015-12-28T12:07:50.747 回答
1

这是编译器提交者之一的项目http://github.com/paulp/scala-lang-combinators

于 2010-01-12T23:37:56.767 回答
0

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

于 2009-11-24T14:08:37.217 回答