【问题标题】:Scala AST in Scala [closed]Scala 中的 Scala AST [关闭]
【发布时间】:2009-11-24 08:22:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: scala abstract-syntax-tree


    【解决方案1】:

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

    【讨论】:

    • Scala 编译器插件看起来很有希望。
    【解决方案2】:

    一些现有的解析器:

    如果使用规范中的 EBNF,请谨慎,显然有:

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

    【讨论】:

    • 您关于 EBNF 的提示很有用。这意味着 JavaCC、ANTLR 等可能会是一个挑战。 IDE 编译器往往有自己的细微差别,因为它们对实时编译感兴趣——这不是我需要的。
    【解决方案3】:

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

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

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

    【讨论】:

    • 您可以为 Scala 构建 AST,而无需考虑语言的语义方面,例如类型和隐式。确实,对于很多应用程序,您都希望将它们考虑在内,但不一定是全部。
    • 我可以想象得到一个 AST 的目的是为了用户所写的内容以及一个反映隐含的内容以及任何其他有助于最终用于代码生成的精确 AST 的因素。
    • 最初,我认为我并不关心 scala 代码的真正语义解释,但你关于隐式和类型推断的观点是一个很好的观点......我想我肯定会需要后者,因此仔细研究 Scala 编译器似乎是谨慎的。
    【解决方案4】:

    如果你想生成一段代码的 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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-28
          • 1970-01-01
          • 2013-06-19
          • 2016-09-28
          • 2017-02-23
          • 2012-12-23
          • 2010-10-17
          • 1970-01-01
          相关资源
          最近更新 更多