2009-12-26 21 views
12

Ho detto "codice live" perché non intendo dai file di origine del testo o dalle stringhe di origine, ma da partialFunctions/lambdas. (So ​​di Ruby1.8 ParseTree e C# LINQ può farlo)Posso ottenere AST dal codice scala live?

Consideriamo una funzione parziale f:

val f = (i: Int, j: Int) => (i + j) * 2 

spero che ci sia qualche strumento funziona così:

getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2')) 

I don' t attenzione alle cose semantiche (l'analisi del contesto e gli impliciti sono troppo complessi e inutili per me), ho solo bisogno dell'albero della sintassi dal codice live, è possibile?

Potrebbero esserci problemi con l'ispezione del codice di altre persone, ma per quanto riguarda il mio codice personale? Sono le seguenti cose possibili?

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

sembra bisogno di hacking in compilatore, Mmmmm ...

risposta

17

Il compilatore è di per sé una libreria, che si può chiamare. Ecco come funziona REPL, infatti. Ma mentre puoi ottenere l'albero (in varie fasi) per una stringa di codice, non puoi ottenerlo per il codice compilato.

Tranne, ovviamente, se si utilizzano materiali sperimentali che possono cambiare in qualsiasi momento o semplicemente cessare di esistere. In questo caso, si può provare:

scala.reflect.Code.lift(f).tree 

E ottenere:

res17: scala.reflect.Tree = Select(Select(Select(Ident(Field(line26$object,PrefixedType(ThisType(RootSymbol),Class(line26$object)))),Field($iw,PrefixedType(ThisType(Class(line26$object)),Class($iw)))),Field($iw,PrefixedType(ThisType(Class($iw)),Class($iw)))),Method(f,PolyType(List(),List(),AppliedType(PrefixedType(ThisType(Class(scala)),Class(scala.Function2)),List(PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int))))))) 

Sia che aiuta o no ... Si consiglia di verificare Miguel Garcia di "The Scala Compiler Corner".

Problemi correlati