Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的Scala AST_Scala_Abstract Syntax Tree - Fatal编程技术网

Scala中的Scala AST

Scala中的Scala AST,scala,abstract-syntax-tree,Scala,Abstract Syntax Tree,是否有一个Scala库可以解析Scala并创建抽象语法树(AST) 理想情况下,我对Scala库感兴趣。计划B将是一个Java库 (我知道我可以从中利用EBNF。)我认为访问AST的最佳方式是使用编译器插件。您应该在之前阅读a。不确定纯scala解决方案,但是如果您发现自己需要实施计划B,您可以从签出开始,或者您不能仅从语法为scala构建AST。需要考虑的是,考虑它们,有类型的推论者需要考虑。 但是,您可以调用编译器本身——毕竟它只是一个jar文件。特别是Scala 2.8,有很多钩子可供其他

是否有一个Scala库可以解析Scala并创建抽象语法树(AST)

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


(我知道我可以从中利用EBNF。)

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

不确定纯scala解决方案,但是如果您发现自己需要实施计划B,您可以从签出开始,或者

您不能仅从语法为scala构建AST。需要考虑的是,考虑它们,有类型的推论者需要考虑。

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


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

一些现有的解析器:

  • 这个
  • IntelliJ IDEA Scala插件有一个针对IntelliJ的
    PsiBuilder
    API编写的Scala插件
  • Scala Netbeans插件使用了在Rats中实现的!(生成Java代码),但是
  • 这个项目是用Scala编写的
如果使用规范中的EBNF,请小心,显然有:

“附录和内联语法之间不匹配,以及scalac编译的语言(并在scala源代码中使用)和语法声明的语言之间不匹配”-


如果您想生成一段代码的AST,这里有一个编译器提交者的项目。您可以使用scala反射:

showRaw(reify{
  //your code here like:
  print(2)
})
上述代码将生成一个AST:

Expr(Apply(Select(Ident(scala.Predef), TermName("print")), List(Literal(Constant(2)))))
参考:


您可以为Scala构建AST,而不考虑语言的语义方面,如类型和隐式。当然,对于很多应用程序,您都希望将它们考虑在内,但不一定是所有应用程序。我可以想象,希望AST用于用户编写的内容,以及反映隐含内容和任何其他因素,最终用于代码生成的精确AST的目的。最初,我认为我并不关心scala代码的真正语义解释,但您关于隐式和类型推断的观点是很好的。。。我想我肯定需要后者,所以仔细看Scala编译器似乎是谨慎的。Scala编译器插件看起来很有前途。你关于EBNF的提示很有用。这意味着JavaCC、ANTLR等可能是一个挑战。IDE编译器往往有自己的细微差别,因为他们对实时编译感兴趣——我不需要实时编译。