2011-10-25 22 views
23

Voglio essere in grado di eseguire la generazione del codice di Python dato una descrizione AST.Generatore di codice Python

Ho eseguito analisi statiche di C e creato visitatori AST in python, quindi mi sento relativamente a mio agio a manipolare un albero di sintassi, ma non ho mai tentato la generazione di codice prima e sto provando a determinare la procedura migliore per generare codice Python .

In particolare, mi piacerebbe puntatori su come la generazione automatica del codice è in genere eseguita, o su qualsiasi puntatore a librerie che mirano a Python che potrebbe rendere più semplice questo compito.

Il mio obiettivo finale è tentare qualcosa di simile a csmith o uno strumento per rendere il codice Python compatibile con PEP8.

+0

Si sta utilizzando un AST personalizzato o si sta creando un AST Python (utilizzando ad esempio il modulo 'ast')? –

+0

Molto probabilmente un AST Python, usando il modulo 'ast'. Ho notato che ANTLR ha adattato un pochino a Python, e sembra una possibile strada da percorrere, ma sembra più sensato attenersi agli interni di Python. – mvanveen

risposta

16

Si consiglia di dare un'occhiata allo strumento 2to3, sviluppato dagli sviluppatori di codice Python per convertire automaticamente il codice Python 2 in codice Python 3. Lo strumento dapprima analizza il codice in un albero, quindi sputa il codice Python 3 "fisso" da tale albero.

Questo può essere un buon punto di partenza perché questo è uno strumento Python "ufficiale" approvato dagli sviluppatori principali e parte del percorso di migrazione Python 2-3 consigliato.

In alternativa, controllare lo codegen.py module, che genera il codice Python indietro da Python ast.

Vedi anche SO question, che possono essere rilevanti per la vostra (non sto segnando un duplicato perché io non sono sicuro che gli scopi delle domande si sovrappongono al 100%)

4

generazione automatica di codice è comunemente fatto in le seguenti modalità:

  • dichiarazioni di stampa contenenti frammenti di codice
  • modelli di testo con i segnaposto (si pensi macro)

IMHO, una pratica migliore è:

  • costruirono un AST per il frammento di destinazione e quindi prettyprint

Quasi nessuno fa il secondo, perché gli strumenti sono per lo più non c'è.

Lo strumento 2to3 di Python fornisce (credo) l'AST di destinazione e il prettyprinting.

Ma una domanda che non hai chiesto è "generare da cosa?" In qualche modo devi specificare in modo astratto ciò che vuoi generato (o non è una vittoria). E lo strumento deve essere in grado di leggere le specifiche in qualche modo.

Molti schemi di generazione di codice consistono nello scrivere codice procedurale che chiama i meccanismi di generazione di cui sopra; il codice procedurale funge da specifica implicita. È "facile" leggere le specifiche; è solo il codice nella lingua utilizzata dal generatore di codice.

Alcuni schemi di generazione del codice utilizzano una sorta di struttura del grafico per fornire un frame su cui sono appesi i frammenti delle specifiche, che guidano la generazione del codice. I diagrammi delle classi UML sono un classico esempio. Questi schemi non sono così facili; hai bisogno di un "lettore di specifiche" (ad es., Lettore di diagrammi UML noto come XMI o alcuni di questi, o se non si utilizza UML, qualche tipo di parser di specifiche).

Lo strumento Python 2to3 utilizza un parser Python2 per leggere le "specifiche". Se vuoi generare codice da Python2, andrà bene. Sospetto che tu non voglia farlo.

Un approccio di best practice è quello che unifica la capacità di leggere/analizzare/attraversare le specifiche, con la capacità di produrre AST per la lingua di destinazione.

Il nostro DMS Software Reengineering Toolkit è un sistema di analisi e trasformazione di programmi generici. Analizza le "specifiche" (istanze di grammatiche che puoi definire) in AST; ti permetterà anche di costruire AST arbitrari per ognuna di queste grammatiche, usando il codice procedurale [come descritto sopra] o usando pattern-match/replacement (praticamente unico per DMS). Parte di un front-end Langauge DMS è una prettyprinter, in grado di rigenerare il testo da AST (questi sono testati da un codice di roundtropping: parsing to AST, prettyst AST, meglio essere lo stesso testo).

Nel caso in cui la grammatica non sia nota a DMS, ha parser estremamente buoni e generatori di prettyprinter, nonché altri meccanismi di supporto per l'analisi dei programmi. Tutto quel macchinario aggiuntivo di solito non è disponibile con i generatori di parser classici o con un semplice pacchetto "AST". (Non so cosa sia 2to3).

La rilevanza di questo per Python è che DMS ha un Python front end e grammars for many other languages.

Quindi, è possibile analizzare le specifiche e generare codice Python utilizzando AST seguito da prettyprinting.

Problemi correlati