Scrivere un superset di un linguaggio di programmazione come un transcompiler

0

La mia idea è di scrivere un superset di C # (ma la domanda non è specifica per la lingua), in modo che compaia da sorgente a codice (transcompile) a C # stesso (clausole di switch fall-through, parametri di default, ecc. niente di impossibile in C #).

La prima idea era di analizzarla, creare alberi di sintassi, alberi astratti, ecc. ma mi sembra un po 'eccessivo, soprattutto perché grandi porzioni di codice rimarranno le stesse.

La mia domanda: c'è un modo più semplice per farlo?

Una delle mie idee era la ricerca di token che dovevano essere modificati (ad esempio switch in caso di fall-through) e quindi riscrivere il codice (aggiungi goto case NEXT_CASE dove necessario) ma c'è un modo migliore e più pulito di fare questo?

    
posta SpelingMistake 10.08.2014 - 11:50
fonte

2 risposte

4

Se vuoi che questo sia mantenibile allora non proprio. Ho visto un compilatore che era letteralmente un copione sed troppo cresciuto. Ha funzionato ovviamente, ma poi abbiamo deciso di aggiungere qualcosa alla lingua ..

Tuttavia, se prendi la rotta più o meno standard di

  1. Lex
  2. Parse
  3. Compilare il superset su vanilla C # AST
  4. Pretty print AST

puoi quasi certamente usare una libreria esistente per 4, e se decidi di far crescere il tuo compilatore, avrai un tempo molto più facile. Se vuoi fare qualcosa di vagamente serio con questo compilatore rispetto al sovraccarico iniziale, vale la pena.

Potrebbe valere il tuo tempo per esaminare alcuni strumenti più utili per l'analisi / lexing. Non penso sia impossibile trovare / modificare una grammatica C # esistente per gestire 1 e 2.

    
risposta data 10.08.2014 - 14:06
fonte
1

Un modo più semplice che corrisponde alla tua idea con i token di ricerca, ecc. è chiamato preprocessore

È un pezzo di "transcompiler" che è abbastanza facile da scrivere in quanto in realtà non comprende la semantica del linguaggio e talvolta non comprende la sintassi del linguaggio, tranne alcune basi (come la tokenizzazione della sorgente di input). Funziona solo a livello di testo. Per "compilare" in un codice di destinazione valido, alcune regole di sintassi rigorose devono essere in genere rispettate dai programmatori.

Ci sono stati parecchi preprocessori nella storia, ad es. macro assemblatore o forse il più noto preprocessore C

Dal meno conosciuto e molto potente ho ammirato abbastanza quello usato da Alaska , il successore del Clipper linguaggio di programmazione.

Il preprocessore è stato in grado di gestire la maggior parte dello zucchero sintattico e la maggior parte delle cose compatibili con Clipper.

È sicuramente più facile da implementare e finché il superset di lingua sarà usato solo dai programmatori che possono essere fatti seguire alcune regole - dovresti fare il punto (o almeno avere un primo prototipo funzionante) in un ragionevole tempo

    
risposta data 11.08.2014 - 21:23
fonte

Leggi altre domande sui tag