Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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
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
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
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.
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 }
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
Sincrotriple degeneri
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
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.
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.
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)
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.
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
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
10