7

编译器代码库非常大,我不能一下子把它全部包起来:)

目前,我只想在“typer”阶段之后获得 AST。有没有办法做到这一点?

我按以下方式运行编译器:

val settings = new Settings
settings.classpath.value = ...
val compiler = new Global(settings, new ConsoleReporter(settings))
new compiler.Run() {
  override def stopPhase(name: String) = name == "superaccessors"
} compileSources files
4

2 回答 2

6

使用-Xprint:typer(在 typer 之后转储树)和-Yshow-trees-compact(以原始 AST 格式转储树)。如果您还使用-Yshow-trees-stringified,则 AST 将另外转储为伪 Scala 代码(注意:最后两个选项需要 2.10.0)。

C:\Projects\Kepler\sandbox @ ticket/6356>cat Test.scala
class C {
  def x = 2
}

C:\Projects\Kepler\sandbox @ ticket/6356>scalac -Xprint:typer -Yshow-trees-compact -Yshow-trees-stringified Test.scala
[[syntax trees at end of typer]]// Scala source: Test.scala
package <empty> {
  class C extends scala.AnyRef {
    def <init>(): C = {
      C.super.<init>();
      ()
    };
    def x: Int = 2
  }
}
PackageDef(
  Ident(<empty>), 
  List(
    ClassDef(Modifiers(), newTypeName("C"), List(), 
      Template(List(Select(Ident(scala), newTypeName("AnyRef"))), emptyValDef, 
      List(
        DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(Apply(Select(Super(This(newTypeName("C")), tpnme.EMPTY), nme.CONSTRUCTOR), List())), Literal(Constant(())))), 
        DefDef(Modifiers(), newTermName("x"), List(), List(), TypeTree(), Literal(Constant(2))))))))
于 2012-09-14T19:47:14.240 回答
1

编译器代码库非常大,我不能一下子把它全部包起来:)

除了所有重要的 typer 之外,Scala 编译器的大多数阶段都在以下位置进行了详细描述:

http://lampwww.epfl.ch/~magarcia/ScalaCompilerCornerReloaded/

于 2012-09-15T07:03:48.403 回答