2009-12-26 7 views
12

Dije "código en vivo" porque me refiero no a los archivos fuente de texto ni a las cadenas fuente, sino a las funciones partial/lambdas. (Sé de ruby1.8 árbol de traducción y C# LINQ puede hacerlo)¿Puedo obtener AST del código scala en vivo?

consideran una función parcial f:

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

espero que haya alguna herramienta funciona así:

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

I don' te importan las cosas semánticas (el análisis de contexto y las implicaciones son demasiado complejos e innecesarios para mí), solo necesito el árbol de sintaxis del código en vivo, ¿es posible?

Puede haber problemas con la inspección del código de otras personas, pero ¿qué pasa con mi propio código? ¿Es posible lo siguiente?

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

Parece a necesitar algo de la piratería en el compilador, hmmmm ...

Respuesta

17

El compilador en sí es una biblioteca, que se puede llamar. Así es como funciona REPL, de hecho. Pero aunque puede obtener el árbol (en varias etapas) para una cadena de código, no puede obtenerlo para el código compilado.

Excepto, por supuesto, si utiliza material experimental que puede cambiar en cualquier momento o simplemente dejar de existir. En ese caso, puede intentar:

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

Y conseguir:

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))))))) 

si eso ayuda o no ... Es posible que desee comprobar Miguel García de "The Scala Compiler Corner".

Cuestiones relacionadas