相关疑难解决方法(0)

斯卡拉的Scala AST

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

理想情况下,我对Scala库感兴趣.Plan B将是一个Java库.

(我知道我可以利用Scala语法摘要中的EBNF .)

scala abstract-syntax-tree

15
推荐指数
1
解决办法
1万
查看次数

scala.tools.nsc包的目的是什么?

我花了几个小时谷歌搜索一些东西,允许我在Scala中打开Zip文件(我知道你可以使用Java API,但我希望找到一个Scala友好的包装器,而不是写关于编写Buffered/FileInputstream等)

所以我只是在REPL中乱搞并发现了这个包

scala.tools.nsc.io.ZipArchive
Run Code Online (Sandbox Code Playgroud)

经过一些挖掘和使用后scala.tools.nsc.io.File,我设法打开了一个包含所有Scala优点的zip存档(能够foreach等)

事情是我在官方Scala 2.8.1 API文档中看不到任何提及这个包,所以我只是想知道为什么没有文档呢?它是什么?

scala

13
推荐指数
1
解决办法
4137
查看次数

我可以从实时scala代码中获取AST吗?

我说"实时代码"因为我的意思不是来自文本源文件或源字符串,而是来自partialFunctions/lambdas.(我知道Ruby1.8的parseTree和C#linq可以做到)

考虑一个partialFunction f:

val f = (i: Int, j: Int) => (i + j) * 2
Run Code Online (Sandbox Code Playgroud)

我希望有一些工具像这样:

getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))
Run Code Online (Sandbox Code Playgroud)

我不关心语义事物(上下文解析和implicits太复杂,对我来说是不必要的),我只需要实时代码的语法树,是否可能?

检查其他人的代码可能存在问题,但我自己的代码呢?以下事情可能吗?

val f = AstFunction(i: Int, j: Int){(i + j) * 2}
f(5, 6) //=> 22
f.ast   //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))
Run Code Online (Sandbox Code Playgroud)

它似乎需要一些黑客入侵编译器,嗯......

scala abstract-syntax-tree

12
推荐指数
1
解决办法
2101
查看次数

在CompilerPlugin中编译String到AST?

我想创建一个模板插件,并且第一步将任意字符串转换为它的"编译"AST表示(正如scala解释器所做的那样,我猜).所以编译器插件可以例如将someString分配给"HELLO WORLD":

  @StringAnnotation("""("hello world").toString.toUpperCase""")
  var someString = ""
Run Code Online (Sandbox Code Playgroud)

我目前的第一个镜头插件简而言之:

  • runafter解析器
  • 创建一个新的仅表示编译器和一个带有注释内容的VirtualFile
  • 编译和打印unit.body

见:http://paste.pocoo.org/show/326025/

a)现在,"object o{val x = 0}"返回一个AST,但"var x = 1+ 2"不是因为它不是一个有效的.scala文件.我怎样才能解决这个问题?

b)仅仅是演示是一个好的选择吗?我应该改为使用适当的阶段覆盖computeInternalPhases还是使用-Ystop:phase?

c)是否可以将外部编译器的环境绑定到内部编译器,以便例如

  var x = _
  (...)
  @StringAnnotation("x += 3")
Run Code Online (Sandbox Code Playgroud)

会工作?

我发现以下代码[1]使用解释器和一个类似的变量:

  Interpreter interpreter = new Interpreter(settings);
  String[] context = { "FOO" };
  interpreter.bind("context", "Array[String]", context);
  interpreter
    .interpret("de.tutorials.scala2.Test.main(context)");
  context[0] = "BAR";
  interpreter
    .interpret("de.tutorials.scala2.Test.main(context)");
Run Code Online (Sandbox Code Playgroud)

[1] http://www.tutorials.de/java/320639-beispiel-zur-einbindung-des-scala-interpreters-kompilierte-scala-anwendungen.html#post1653884

谢谢

完整代码:

class AnnotationsPI(val global: Global) extends Plugin {
  import global._
  val name = "a_plugins::AnnotationsPI" //a_ …
Run Code Online (Sandbox Code Playgroud)

compiler-construction scala scala-2.8

6
推荐指数
1
解决办法
1289
查看次数