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.
Si sta utilizzando un AST personalizzato o si sta creando un AST Python (utilizzando ad esempio il modulo 'ast')? –
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