2012-09-14 11 views
7

コンパイラのコードベースは非常に大きいので、一度に私の頭の中を包み込むことはできません:)スカラーコンパイラはASTをどこに格納しますか?

現在のところ、私はちょうど "typer"段階の後にASTsを取得したいと思います。それを行う方法はありますか?

は、私は、コンパイラに次の方法を実行します。

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 

答えて

6

使用-Xprint:typer-Yshow-trees-compact(生AST形式の木をダンプする)と一緒に(タイパー後に木をダンプします)。 -Yshow-trees-stringifiedも使用すると、ASTは擬似Scalaコードとして追加でダンプされます(注意:最後の2つのオプションは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)))))))) 
+0

しかし、私は意味し、どのように私は、実行中のプログラム内のASTを得るのですか?プログラム的に? – Rogach

+0

hh。そうですか。考えさせて。 –

+4

'Run.units map(_.body)'を使用する –

1

コンパイラのコードベースはかなり大きいです、と私は一度それをすべてのまわりで私の頭をラップすることはできません:)

をすべての重要なタイパーを除き、Scalaのコンパイラのほとんどの段階であります詳細に記載さ:

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

+0

問題は、最初の4つの段階にしか関心がないことです。パーサーからタイパーまで、そしてそこには何も記述されていません。 – Rogach

関連する問題