Working in progress...
Progettazione di un Compilatore
Definizione
Definiamo compilatore “un programma che converte un programma sorgente in un programma target”
Figura 1 - Definizione di compilatore
Suddivisione logica
La progettazione di un compilatore è “logicamente” suddivisa in:
- Analisi, la quale è a sua volta suddivisa in:
o Analisi Lessicale, che si occupa:
§ Di riconoscere le stringhe di caratteri e di classificarle in token e quindi trasformare il programma in una sequenza di token.
§ Di riconoscere gli errori di digitazione delle parole.
o Analisi Sintattica, che si occupa:
§ Di verificare il corretto uso delle regole della grammatica del linguaggio.
o Analisi Semantica, che si occupa:
§ Di verificare che il programma abbia senso.
- Sintesi
o Generazione Codice Intermedio, dove il codice viene tradotto in una forma più facile da tradurre nel linguaggio target.
o Ottimizzazione di Codice, che si occupa di ridurre il numero di istruzioni, eliminando quelle ritenute inutili.
o Generazione Codice, dove il programma viene tradotto in codice target.
Esempio di una compilazione di un programma
Supponiamo di voler compilare la seguente istruzione:
position := initial + rate * 60
Analisi Lessicale |
id1 := id2 + id3 * 60 |
Analisi Sintattica |
|
Analisi Semantica |
|
Generazione di Codice Intermedio |
Temp1 := IntToReal(60)
Temp2 := Id3 * Temp1
Temp3 := Id2 + Temp2
Id1 := Temp3
|
Ottimizzazione di Codice |
Temp2 := id3 * IntToReal(60)
Id1 := Id2 + Temp2
|
Generazione di Codice |
MOVF Id3, R2
MULF #60.0, R2
MOVF Id2, R1
ADDF R2, R1
MOVF R1, Id1
|