2012-09-14 16 views
7

Derleyici kod tabanı oldukça büyüktür ve kafamı bir kerede saramam mümkün değildir.Scala derleyici AST'leri nerede saklar?

Şu andan itibaren "typer" aşamasından sonra AST'leri almak istiyorum. Bunu yapmanın bir yolu var mı?

Ben derleyici şu şekilde çalıştırın:

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 

cevap

6

Kullanım -Xprint:typer-Yshow-trees-compact (ham AST biçiminde ağaçları dökümü) ile birlikte (Typer sonra ağaçları dökümü). Ayrıca -Yshow-trees-stringified kullanırsanız, AST'ler ek olarak sahte Scala kodu olarak dökülecektir (not: son iki seçenek 2.10.0 gerektirir).

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

Ama nasıl benim çalışan program içinde AST alabilirim ki? Programlı? – Rogach

+0

Huh. Anlıyorum. Bir düşüneyim. –

+4

'Run.units haritasının kullanılması (_.body)' –

1

Derleyici kod tabanı oldukça büyük olduğunu ve bir kerede hepsi kafamı kaydıramazsınız :)

tüm önemli Typer dışında Scala derleyici çoğu aşamaları şu şekildedir en ayrıntılı olarak açıklanmıştır:

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

+0

Eh, sorun sadece ilk dört aşamada ilgileniyorum - ayrıştırıcıdan typer'a, ve bunlar hiç orada açıklanmayan :( – Rogach

İlgili konular