Sei sulla pagina 1di 10

TRATTAMENTO DEGLI ERRORI

Trattamento degli errori

Un parser deve essere in grado di scoprire, diagnosticare e correggere gli errori in maniera efficiente, per riprendere lanalisi e scoprire nuovi errori. I parser LL e LR hanno la propriet viable prefix cio sono in grado di rilevare un errore non appena si presenta perch sono in grado di riconoscere i prefissi validi del linguaggio

Fasi per il trattamento degli errori


Scoperta

degli errori Diagnosi dellerrore Recupero e ripresa

Strategie di riparazione

panic mode:scoperto lerrore il parser riprende lanalisi in corrispondenza di alcuni token selezionati (es.: delimitatori begin end) scartando alcuni caratteri. Svantaggi: pu essere scartato molto input phrase level correzioni locali ottenute inserendo/modificando/ cancellando alcuni terminali per poter riprendere lanalisi (es.: ,scambio;) Svantaggi:possibili loop, difficolt quando la distanza dallerrore notevole

Strategie di riparazione

error productions Uso di produzioni che estendono la grammatica per generare gli errori pi comuni. Metodo efficiente per la diagnostica. global correction Si cerca di calcolare la migliore correzione possibile alla derivazione errata (minimo costo di interventi perinserzioni/cancellazioni/). Metodo globale poco usato in pratica, ma tecnica usata per ottimizzare strategia phrase level

Trattamento degli errori Analisi ascendente


Riparazione
Analisi

locale Produzione di errori

discendente

Albero

connesso Sincrotriple

Attenzione

Lanalizzatore sintattico pu accorgersi dellerrore con grande ritardo. Infatti lerrore pu produrre un sintomo solo quando il prefisso analizzato non pi completabile in modo da derivare una frase del linguaggio Esempio L = ab*aa cb*cc Data la frase abbbbbbbbbcc

Primo errore scoperto dopo abn abbbbbbbbbaa Correzione a distanza minima cbbbbbbbbbcc

Gestione degli errori in parser predittivi

Un errore pu verificarsi in un parser predittivo (LL(1)) Se il simbolo terminale in cima alla pila non corrisponde con il simbolo di ingresso Se il simbolo in cima alla pila e un simbolo non terminale A, e il simbolo di ingresso e a, e M[A,a] vuoto. Cosa deve fare il parser quando si verifica un errore? Il parser dovrebbe essere capace di fornire un messaggio di errore (pi veritiero possibile). Dovrebbe recuperare lerrore e dovrebbe essere capace di continuare il parsing della stringa dingresso

Metodo dellalbero connesso


del tipo (p, T-, i, T-) Scoperto un errore

cerca

una ripresa ipotizzando la mancanza di una sottostringa nella pila. se fallisce tenta una correzione saltando uno o pi caratteri fino a quando lanalisi pu riprendere.

equivalente a (i, T+, i, T-)

Stack p, ParseTable T; Symbol s, sp; Push(p,assioma); s = scanner(); While (empty(p) == false && symbol != $) { sp = top(p);

if (sp is terminale)
if(sp == s) {pop(p); s = scanner(); else errore(); else

void errore { do { do { if (la configurazione valida) { stampa dignostico return} scarta il simbolo in cima alla pila } while (pila non vuota) ripristina la pila avanza la testina di lettura } while la stringa terminata }

Metodo delle sincrotriple


Definire per ogni non terminale la sincrotripla (marca di apertura, non terminale, marca di chiusura)
1.

2.

Scartare tutti i caratteri fino a quando si trova una simbolo specificatamente un simbolo finale di una stringa darivabile da A Se c specificatamente il caratteri iniziale di una stringa

Scelta delle sincrotriple


Marca di apertura First (A) Marca di chiusura Follow(A)

Sincrotriple degeneri

Scelta dei token di sincronizzazione

Tecniche panic mode per la scelta dei token di sincronizzazione:

Per i non terminali A: FOLLOW(A) - si scartano tutti i terminali fino a trovarne uno in FOLLOW(A), quindi si fa pop(A) E possibile considerare altri simboli, che terminano il costrutto corrente (es.: ; dopo assegnamento). Altri esempi: per le espressioni le keyword delle istruzioni (if <expr> then ), per le istruzioni i blocchi, ecc. Durante la ricerca dei token di sincronizzazione, lanalisi pu riprendere in corrispondenza di un simbolo in FIRST(A) con lanalisi di A, e dopo continuare la scansione Se un non terminale A deriva e, la produzione pu essere usata come default per ridurre i terminal da analizzare in caso di errore se un terminale in cima allo stack non corrisponde a quello letto pu essere scartato e prodotto un messaggio simbolo non atteso

Errori nellanalisi discendente

La tavola di parsing pu essere completata con i token di sincronizzazione M[A,a]=sync se FOLLOW(A)=a.


Se

M[A,a]= skip a; errore se M[A,a]=sync pop(A) - ripresa da errore se il terminale a in cima allo stack non corrisponde a quello letto, skip a - errore

Tecnica Phrase level: le caselle vuote della tavola di parsing vengono riempite con procedure di ricovero

Riparazione locale
1.

Strategia (p, T-)

Sfogliare la pila fino ad incontrare uno stato da cui si esce con un non terminale A andando allo stato j. Si esegue tale transizione putche da j sia definita una mossa sotto b. Altrimenti si continua a sfogliare la pila Prova ad inserire prima di b un carattere terminale a scekta La correzione accettata se la j puo proseguire

2.

Strategia (p, T+)

Analisi LR -Trattamento degli errori -panic mode

Tecnica panic mode isolare la frase che contiene lerrore e riprendere lanalisi non appena possibile. Quando scopre un errore lautoma percorre lo stack verso il basso fino e un non terminale sullo stack per cui goto[A,a]=s; pone s sullo stack e continua lanalisi. Se si scorre tutta la pila, si passa al prossimo carattere di input, e cos via

La scelta dei simboli pu essere fatta in modo da isolare il tipo di frase (es.: ; per le espressioni)

Analisi LR -Trattamento degli errori phrase level

Tecnica phrase level cercare di ripristinare lanalisi apportando correzioni locali alla frase errata. Quando scopre un errore su un carattere a lautoma cerca di inserire un carattere b per cui definita la goto: la riparazione accettata se lanalisi pu riprendere da b, altrimenti si ripristina la pila iniziale. La tabella di parse action[A,a] pu contenere esplicitamente il riferimento ad una funzione di gestione errore adatta al contesto, negli spazi che non sono ne spostamento ne di riduzione.

Esempio error recovery- SLR(1)


1. 2. 3. 4. 5. 6. 7.

E E E E+T ET

T T*F
TF F (E) F id E1) messaggio
missing operand ; azione inserimento id fittizio

Produzione di errore

Inserimento di produzioni fittizie


A errore

Il simbolo errore viene inserito nella stringa quando viene riscontrata una situazione di errore. Lanalizzatore in tale situazione scarta dallla pila tutti gli stati finch incontra
A errore

Yacc e Jcup utilizzano il metodo delle produzioni di errore

10

Potrebbero piacerti anche