Progettazione del compilatore - Ripristino degli errori

Un parser dovrebbe essere in grado di rilevare e segnalare qualsiasi errore nel programma. Ci si aspetta che quando si incontra un errore, il parser dovrebbe essere in grado di gestirlo e continuare ad analizzare il resto dell'input. Per lo più ci si aspetta che il parser controlli la presenza di errori, ma è possibile che si riscontrino errori in varie fasi del processo di compilazione. Un programma può presentare i seguenti tipi di errori in varie fasi:

  • Lexical : nome di un identificatore digitato in modo errato

  • Syntactical : punto e virgola mancante o parentesi sbilanciate

  • Semantical : assegnazione di valore incompatibile

  • Logical : codice non raggiungibile, ciclo infinito

Esistono quattro strategie comuni di ripristino degli errori che possono essere implementate nel parser per gestire gli errori nel codice.

Modalità panico

Quando un parser incontra un errore in qualsiasi punto dell'istruzione, ignora il resto dell'istruzione non elaborando l'input dall'input errato al delimitatore, come il punto e virgola. Questo è il modo più semplice per recuperare gli errori e inoltre impedisce al parser di sviluppare cicli infiniti.

Modalità istruzione

Quando un parser incontra un errore, cerca di prendere misure correttive in modo che il resto degli input dell'istruzione consenta al parser di analizzare in anticipo. Ad esempio, inserendo un punto e virgola mancante, sostituendo la virgola con un punto e virgola ecc. I progettisti di parser devono fare attenzione qui perché una correzione sbagliata può portare a un ciclo infinito.

Produzioni di errore

Alcuni errori comuni sono noti ai progettisti del compilatore che possono verificarsi nel codice. Inoltre, i progettisti possono creare grammatica aumentata da utilizzare, come produzioni che generano costrutti errati quando si incontrano questi errori.

Correzione globale

Il parser considera il programma in mano nel suo insieme e cerca di capire cosa il programma è destinato a fare e cerca di trovare una corrispondenza più vicina, che è priva di errori. Quando viene fornito un input (istruzione) X errato, crea un albero di analisi per un'istruzione priva di errori più vicina Y. Ciò può consentire al parser di apportare modifiche minime al codice sorgente, ma a causa della complessità (tempo e spazio) di questa strategia non è stata ancora attuata nella pratica.

Alberi di sintassi astratti

Le rappresentazioni ad albero di analisi non sono facili da analizzare dal compilatore, poiché contengono più dettagli di quelli effettivamente necessari. Prendi il seguente albero di analisi come esempio:

Se osservati da vicino, troviamo che la maggior parte dei nodi foglia sono figli singoli rispetto ai loro nodi padre. Questa informazione può essere eliminata prima di passare alla fase successiva. Nascondendo informazioni aggiuntive, possiamo ottenere un albero come mostrato di seguito:

L'albero astratto può essere rappresentato come:

Gli AST sono strutture di dati importanti in un compilatore con meno informazioni non necessarie. Gli AST sono più compatti di un albero di analisi e possono essere facilmente utilizzati da un compilatore.