6

Mi chiedo quanti modi esistono per interagire con il compilatore Scala al di fuori del normale "invocarlo sulla riga di comando per compilare i miei sorgenti".Come interagire con il compilatore nel codice Scala stesso?

C'è un modo per analizzare il codice, creare un albero di sintassi astratto o utilizzare una libreria per compilare il codice in fase di runtime?

+0

possibile duplicato di [Posso ottenere AST dal codice scala live?] (Http://stackoverflow.com/questions/1962925/can-i-get-ast-from-live-scala-code) –

risposta

2

Qualche tempo fa ho utilizzato la classe (ora privata) scala.tools.nsc.Interpreter per caricare, modificare e - sorpresa! - interpreta il codice Scala in fase di esecuzione. Se vuoi scambiare i valori tra il tuo codice e quelli interpretati dai un'occhiata al suo metodo bind. Ha anche un compileSources e un metodo compileString ma non ne ho usato uno fino ad ora. Inoltre non so nulla su come usare questo (o altro) per ottenere l'AST.

Vedere anche: What is the purpose of the scala.tools.nsc package? e nsc package scaladoc.

Update: Questo dovrebbe rispondere alla domanda AST (a partire dal 2009, potrebbe essere superata): Scala AST in Scala

1

ho fatto in passato con la creazione di un nuovo CompilerCommand esempio per analizzare argomenti della riga di comando e, cosa ancora più importante, per estendendo la sempre terrificante classe Global.

Con l'override del metodo computeInternalPhases, è possibile utilizzare solo alcune fasi del compilatore (ad esempio fino a refchecks, per usarlo come un parser/solo coontrollore dei tipo), ed è possibile aggiungere le proprie fasi (plugin) come ci si aspetterebbe . Ovviamente puoi anche arrivare fino alla generazione di file di classe.

Quindi sì, è sicuramente possibile. Dopo tutto, il compilatore stesso viene eseguito anche su JVM.