2010-02-12 3 views
7

Ci sono fewresources sul Web che sono istruttivi nello scrivere i compilatori di compilazione Scala che corrispondono a modello con il codice, ma questi non aiutano a generare codice (costruzione di alberi di simboli) . Dove dovrei iniziare a capire come fare questo? (Se c'è un modo più semplice di costruire manualmente gli alberi simbolo, sarei interessato anche io.)Generazione di alberi di codice Scala da un plug-in Scala

Per esempio, mi piacerebbe scrivere un plugin che sostituisce del codice con un semplice AST per questa espressione, dove il variabili (estratte dal codice programma originale) potrebbero essere di qualsiasi tipo:

"" + hello + ", " + world + "!" 

mi rendo conto puo essere difficile a causa di boxe e toString, es se hello fosse un oggetto e world erano un int, questo dovrebbe davvero essere qualcosa del tipo:

"".+(hello.toString().+(", ".+(new Integer(world).toString().+("!")))) 
+0

Non conosco la risposta alla tua domanda, ma Miguel Garcia ha messo insieme [Scala Compiler Corner] (http://www.sts.tu-harburg.de/people/mi.garcia/ScalaCompilerCorner /) che è probabilmente la migliore raccolta di risorse disponibile sul compilatore di Scala. –

risposta

3

Se si genera l'albero prima della fase erasure compilatore, è possibile digitare hello e world con Any, e chiamare toString su di essi.

~: cat test.scala 
object test { 
    def f(hello: Any, world: Any) = "" + hello + ", " + world + "!" 
    f("1", "2") 
    f(1, 1) 
} 
~: scalac -Xprint:typer test.scala 
[[syntax trees at end of typer]]// Scala source: test.scala 
package <empty> { 
    final object test extends java.lang.Object with ScalaObject { 
    def this(): object test = { 
     test.super.this(); 
    () 
    }; 
    def f(hello: Any, world: Any): java.lang.String = "".+(hello).+(", ").+(world).+("!"); 
    test.this.f("1", "2"); 
    test.this.f(1, 1) 
    } 
} 

~: scalac -Xprint:erasure test.scala 
[[syntax trees at end of erasure]]// Scala source: test.scala 
package <empty> { 
    final class test extends java.lang.Object with ScalaObject { 
    def this(): object test = { 
     test.super.this(); 
    () 
    }; 
    def f(hello: java.lang.Object, world: java.lang.Object): java.lang.String = "".+(hello).+(", ").+(world).+("!"); 
    test.this.f("1", "2"); 
    test.this.f(scala.Int.box(1), scala.Int.box(1)) 
    } 
} 
+0

Grazie per la risposta, ma questo in realtà non mi dice come generare un AST. – Yang