Esistono molti linguaggi di programmazione che hanno le loro caratteristiche uniche. Ma affinché un programma scritto in uno di essi funzioni, è necessario trasmetterlo. A volte i linguaggi di programmazione vengono sviluppati per le proprie esigenze (ad esempio, supporto per l'automazione in applicazioni di grandi dimensioni) e quindi diventa necessario scrivere un traduttore.
Necessario
- - grammatica naturale o BNF della lingua di partenza;
- - strumenti di sviluppo.
Istruzioni
Passo 1
Preparare i dati per l'analisi lessicale del testo nella lingua di partenza. Elenca tutti i token nella lingua. Suddividili in categorie (parole chiave, valori letterali numerici e stringa, identificatori, spazi, punteggiatura, ecc.).
Passo 2
Implementa un modulo o un lexer. All'ingresso, dovrebbe ricevere un flusso di dati "grezzi" e all'uscita formare un elenco di elementi contenenti token e i loro identificatori di tipo nella sequenza in cui si verificano nel testo di origine. Il programma di analisi può essere abbastanza semplice " scanner a livello singolo". L'implementazione del ripristino degli errori non ha senso. I caratteri non validi devono essere trattati come errori.
Passaggio 3
Preparare i dati per l'analisi. Basandosi sulla grammatica naturale o BNF della lingua di partenza, componi la sua grammatica LL1. Sulla base di questo tipo di grammatica, elaborare uno schema di analisi in termini di categorie di token validi e costrutti semantici del linguaggio.
Passaggio 4
Implementa un modulo o un parser. In ingresso, dovrebbe ricevere un elenco di token preparati nella fase di analisi lessicale. Sviluppa algoritmi ricorsivi per il controllo della sintassi utilizzando lo schema creato nel passaggio tre. Se necessario, implementare meccanismi di ripristino degli errori. Aggiungere funzionalità agli algoritmi di analisi per creare un albero per il calcolo di funzioni, metodi di classe. Con la corretta struttura degli algoritmi di parsing, questa funzionalità può essere implementata senza problemi. Ciò evita la necessità di implementarlo come modulo separato. Le strutture dati create dovrebbero contenere elenchi di istruzioni sotto forma di sequenze "piatte" (espressioni aritmetiche espanse in forma postfissa adatte per il calcolo su una macchina stack, loop convertiti in combinazioni di sequenze di istruzioni computazionali e salti condizionali o incondizionati, ecc.).
Passaggio 5
Se necessario, creare un modulo di ottimizzazione. Dovrebbe elaborare e trasformare le strutture di dati preparate nel passaggio precedente. Gli algoritmi e i metodi di ottimizzazione sono molto diversi.
Passaggio 6
Sviluppa un generatore di codice. Quando si elaborano le strutture preparate nella quarta o quinta fase, dovrebbe semplicemente trasformare le sequenze di istruzioni astratte in istruzioni per l'esecuzione su una piattaforma specifica.
Passaggio 7
Se necessario, creare un programma raccoglitore (linker). Dovrebbe formare il modulo eseguibile risultante scegliendo la posizione dei segmenti di codice, calcolando gli indirizzi delle etichette, ecc.