2010-03-07 7 views
5

Supponiamo di voler aggiungere zuccheri sintattici minori a Java. Solo piccole cose come l'aggiunta di letterali di pattern regex, o forse letterali di base-2, o stringhe multilinea, ecc. Non c'è niente di grammaticalmente importante (almeno per ora).Come si può procedere all'aggiunta di zuccheri sintattici (minori) a Java?

Come si fa a fare questo?

Devo estendere il compilatore bytecode? (È possibile?)

Posso scrivere plugin Eclipse per eseguire semplici trasformazioni di codice sorgente prima di inviarlo al compilatore standard Java?

+4

Sebbene ciò non sia veramente utile, la domanda mi ha ricordato questo: http://www.iam.unibe.ch/~akuhn/blog/2008/roman-numerals-in-your-java/ – Esko

risposta

2

Charles Nutter, il piombo tech JRuby, esteso Javac con le espressioni regolari letterali. Ha dovuto cambiare circa 3 linee di caso, per quanto ricordo.

Vedi http://twitter.com/headius/status/1319031705


Ed ecco un tutorial impressionante su come aggiungere un nuovo operatore per javac, http://www.ahristov.com/tutorial/java-compiler.html

Per ulteriori link come questo, vedere la mia lista di Links for javac hackers.

+0

+1 Come autore originale del post cito nella mia risposta, il merito va a te. – ewernli

+0

Questo è fantastico ragazzi! – polygenelubricants

6

Vorrei dare un'occhiata a Project Lombok e provare a riutilizzare il tentativo che hanno intrapreso. Usano le annotazioni Java 5 per agganciare un agente Java che può manipolare l'albero di sintassi astratto prima che il codice sia compilato. Attualmente stanno lavorando alla creazione di un'API per consentire la scrittura di trasformatori personalizzati che possono essere utilizzati con javac o gli IDE principali come Eclipse e NetBeans. Oltre alle annotazioni che attivano il codice da generare, stanno anche pianificando l'aggiunta di modifiche alla sintassi (probabilmente mixin o sintassi di chiusura pre-Java 7).

(Posso avere alcuni dettagli leggermente fuori, ma penso di essere abbastanza vicino).

Lombok è open source quindi studiare il loro codice e provare a costruire su quello sarebbe probabilmente un buon inizio.

In caso contrario, è possibile provare a modificare il compilatore javac. Anche se da quello che ho sentito potrebbe essere un esercizio di frustrazione per chiunque non sia un compilatore e un esperto di Java.

3

È possibile modificare il numero di javac con JSR 269 (elaborazione di annotazioni collegabili). È possibile collegare il visitatore che attraversa le istruzioni nel codice sorgente e trasformarlo.

Ecco ad esempio il nucleo di una trasformazione da aggiungere (leggi ovviamente lo post completo per ulteriori dettagli). Sembra relativamente facile.

public class Transform extends TreeTranslator { 
    @Override 
    public void visitIdent(JCIdent tree) { 
     String name = tree.getName().toString(); 
     if (isRoman(name)) { 
      result = make.Literal(numberize(name)); 
      result.pos = tree.pos; 
     } else { 
      super.visitIdent(tree); 
     } 
    } 
} 

Qui ci sono risorse aggiuntive:

Non so se il progetto Lombok (citato in altra risposta) utilizza la stessa tecnica, ma Penso di si.

+0

AFAIK, Lombok utilizza annotazioni solo per avviare il proprio agente Java, che si aggancia direttamente al compilatore. L'elaborazione delle annotazioni ha dei limiti a ciò che può fare, penso che Lombok elimini questi limiti. Tutti gli argomenti del potere e della flessibilità rispetto alla compatibilità diretta e all'adesione agli standard si applicano, l'approccio migliore dipenderà in ultima analisi da cosa esattamente l'OP sta cercando di fare :) – Grundlefleck

+0

Ecco alcuni suggerimenti eccellenti. Non sono ancora sicuro di poter fare quello che voglio fare facilmente, dal momento che potrei non avere il lusso di visitare un albero per trasformare senza estendere la grammatica, ma ho sicuramente un posto dove iniziare a leggere. – polygenelubricants