Continuare sotto errori di analisi può essere un po 'non banale, e il semplice "parser combinator" che si sta piangendo non lo risolverà.
Il punto centrale è che il parser non genera eccezioni quando incontra errori di sintassi. Invece, queste eccezioni sono accodate in un elenco fino a quando un problema è sufficientemente fatale, hai troppi problemi o la fine dell'input è stata raggiunta.
Dopo aver riscontrato un problema di sintassi, devi provare a risincronizzare il parser con l'input. Per errori comuni, crea produzioni speciali che corrispondono a questi errori. Questo può essere usato per creare messaggi di errore veramente utili e fornisce un recupero eccellente. Errori come "paren chiusura mancante" o "punto e virgola mancante" possono essere gestiti bene da questo. Assicurati solo che le regole di errore abbiano precedenza inferiore rispetto alla sintassi normale. Dopo aver completato una regola di errore, puoi continuare con la grammatica normale.
Tuttavia, le regole di errore gestiscono solo la minoranza di problemi. Nella maggior parte dei casi, vorrai saltare una parte dell'input finché non è sicuro continuare. Non preoccuparti di creare un albero di analisi non valido, poiché dopo un errore l'analisi verrà eliminata. Una possibilità di recupero è saltare fino a quando non è stato trovato un gettone atteso di una produzione più alta nell'albero di analisi. Considera foo(1, 2 3) + 4; bar();
. Tra 2
e 3
ci dovrebbe essere stata una virgola o un operatore binario, non lo sappiamo. Sappiamo che siamo all'interno della produzione di "argomenti di funzione" e che il prossimo simbolo atteso sarebbe una virgola o un paren di chiusura. Oppure potremmo vedere che siamo nella produzione di "statement" e saltare al prossimo punto e virgola. In entrambi i casi, dobbiamo esaminare la pila di produzioni attuali e cercare i simboli previsti. Questo può richiedere aggiustamenti manuali non banali nel caso di un parser top-down, ma fornisce un recupero degli errori davvero accettabile. D'altra parte, si potrebbe finire per saltare un sacco di input.
Nel peggiore dei casi, si salta semplicemente il token corrente e si tenta di riavviare l'analisi. Potrebbe essere necessario saltare più token fino a quando non viene visualizzata un'analisi legale e, sebbene questo metodo sia semplice, dovrebbe essere utilizzato solo come ultima risorsa.