Trattamento degli errori
Transcript
Trattamento degli errori
Trattamento degli errori
Trattamento degli errori
Un parser deve essere in grado di scoprire,
diagnosticare e correggere gli errori in maniera
efficiente, per riprendere l’analisi e scoprire nuovi
errori.
I parser LL e LR hanno la proprietà “viable prefix”:
sono in grado di rilevare un errore non appena si
presenta perché sono in grado di riconoscere i
prefissi validi del linguaggio
Scoperta degli errori
Diagnosi dell’errore
Recupero e ripresa
1
Strategie di riparazione
panic mode”:scoperto l’errore il parser
riprende l’analisi 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 l’analisi (es.:
‘,’scambio’;’) Svantaggi:possibili loop,
difficoltà quando la distanza dall’errore è
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”
2
Trattamento degli errori
Analisi
ascendente
Riparazione locale
Produzione di errori
Analisi
discendente
Albero connesso
Predecessori e successori
Sincrotriple
Attenzione
L’analizzatore sintattico può accorgersi dell’errore
con grande ritardo della presenza di un errore. Infatti
l’errore può produrre un sintomo solo quando il
prefisso analizzato con è piu completabile in modo
da derivare una frase del linguaggio
Esempio
L = ab*aa ∪ cb*cc
Data la frase abncc
Primo errore scoperto dopo abn
Correzione a distanza minima
3
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 l’errore e dovrebbe essere capace
di continuare il parsing della stringa d’ingresso
Metodo dell’albero 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 l’analisi
può riprendere.
È equivalente a (i, T+, i, T-)
4
void errore {
do {
do {
if (la configurazione è valida)
{ stampa dignostico
rerurn}
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)
Scartare tutti i caratteri fino a quando si
trova una simbolo specificatamente un
simbolo finale di una stringa darivabile da
A
2. Se c’è specificatamente il caratteri iniziale
di una stringa
1.
5
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, l’analisi può
riprendere in corrispondenza di un simbolo in FIRST(A) con l’analisi
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
…”
6
Errori nell’analisi 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
2. Strategia (p, T+)
a Prova ad inserire prima di b un carattere
terminale a scekta La correzione è accettata
se la j puo proseguire
a
7
Analisi LR -Trattamento degli errori panic mode
Tecnica “panic mode” isolare la frase che contiene l’errore e
riprendere l’analisi non appena possibile.
Quando scopre un errore l’automa 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 l’analisi.
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 l’analisi
apportando correzioni “locali” alla frase errata.
Quando scopre un errore su un carattere a l’automa
cerca di inserire un carattere b per cui è definita la
“goto”: la riparazione è accettata se l’analisi 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.
8
Esempio error recovery- SLR(1)
1. E’ → E
2. E → E+T
3. E → T
4. T → T*F
5. T → F
6. F → (E)
7. 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. L’analizzatore in tale situazione scarta
dallla pila tutti gli stati finchè incontra
A → • errore α
9