Le persone hanno cercato di capire per segnalare e correggere errori di sintassi dal primo. Ci sono molti documenti tecnici su come farlo. La ricerca della stringa "syntax error repair" su scholar.google.com produce 57 risultati.
ci sono davvero diversi problemi:
1) Come segnalare un errore significativo per il lettore. Per cominciare, ci sono dove il parser rileva l'errore e dove l'utente ha effettivamente commesso l'errore . Per esempio, un programma C potrebbe avere un operatore di '++' in un posto strano:
void p {
x = y ++
z = 0;
<EOF>
maggior parte dei parser saranno soffocare quando viene rilevato "z", e segnalarlo come il luogo dell 'errore. Tuttavia, se l'errore sta usando '++' quando '+' era inteso, questo rapporto è sbagliato. Sfortunatamente, ottenere questo diritto richiede che tu sia in grado di leggere la mente del programmatore.
Hai anche il problema di segnalare il contesto di errore. Segnalate l'errore come in un'espressione [a prima vista, sembra così]? in una dichiarazione? In fila? In un corpo di funzione? Nella dichiarazione di funzione? Probabilmente vuoi segnalare nella categoria sintattica più stretta che può circondare il punto di errore. (Si noti che non è possibile riportare il corpo della funzione o la dichiarazione come "circostanti" al punto di errore perché anch'essi non sono completi!) E se l'errore fosse davvero un punto e virgola mancante dopo il ++? Quindi le posizioni degli errori non erano realmente "nell'espressione". Cosa succede se la riparazione richiede l'inserimento di una stringa mancante? Un personaggio di continuazione macro?
Quindi è necessario in qualche modo decidere cosa costituisce l'errore effettivo e ciò ci porta alla riparazione degli errori.
2) Errore di riparazione: affinché lo strumento proceda in modo significativo, deve riparare l'errore. Presuambilmente ciò significa rattoppare il flusso di token di input per produrre un programma legale (che potresti non essere in grado di fare se la fonte ha più errori). Cosa succede se ci sono diverse patch possibili? Dovrebbe essere ovvio che il miglior rapporto di errore è "yyyy è sbagliato, ho il sospetto che avresti dovuto usare xxxx". Quanto deve essere grande una patch per una riparazione: solo il token che ha innescato l'errore, i token che la seguono, che dire dei token che lo precedono?
Nota che è difficile fare una proposta di riparazione automatica degli errori generali su parser scritti a mano, perché la grammatica, necessaria per guidare tale riparazione, non è esplicitamente disponibile da nessuna parte. Quindi ti aspetteresti che la riparazione automatica funzioni al meglio su strumenti per i quali la grammatica era un artefatto esplicito.
Può anche darsi che la riparazione degli errori tenga conto di errori comuni. Se le persone tendono a lasciare ';' le istruzioni off e l'inserimento di una correzione del file potrebbero essere una buona soluzione. Se raramente lo fanno, e c'è più di una riparazione (ad esempio, sostituire "++" con "+), probabilmente una riparazione alternativa è probabilmente un suggerimento migliore
3) Impatto semantico della riparazione. Correggere gli errori di sintassi, il programma riparato potrebbe non essere ragionevole Se il tuo errore richiede l'inserimento di un identificatore, quale identificatore deve essere utilizzato?
FWIW, il nostro software DMS Reengineering Toolkit esegue automaticamente la riparazione guidata completamente dalla grammatica. Funziona partendo dal presupposto che il token nel punto di errore debba essere cancellato, o che qualche altro token singolo debba essere inserito a sinistra, in modo che manchi ";" e segni extra plus, spesso riesce a produrre una riparazione legale. non è quello "giusto". Almeno consente al parser di procedere al re st del codice sorgente.
Penso che la caccia per sempre, la riparazione automatica degli errori continuerà per molto tempo.
FWIW, la carta sintassi Error Repair per un generatore di parser basato su Java riferisce che dottorato di Burke tesi:
M.G. Burke, 1983, Un metodo pratico per la diagnosi e il recupero degli errori sintattici LR e LL, tesi di dottorato, Dipartimento di Informatica, New York University
è abbastanza buono. In particolare, ripara gli errori considerando e rivedendo il contesto sinistro dell'errore e l'ambito degli errori. Sembra che si può get it from ACM
Questo non è probabilmente quello che si desidera ascoltare, ma la mano meglio scrivere il parser e lexer. Non è un compito particolarmente difficile (soprattutto se confrontato con la scrittura dell'analizzatore della semantica e del generatore di codice) e produrrà i migliori risultati quando si tratta di gestione degli errori. Ma non fidatevi di me, affidate a Walter Bright l'autore del primo compilatore nativo di C++ e inventore del linguaggio di programmazione D. ha un articolo su esattamente questo su Dr.Dobbs [qui] (http://www.drdobbs.com/architecture-and-design/so-you-want-to-write-your-own-language/240165488). (il recupero degli errori si trova a pagina 2) – Computermatronic
Questo è esattamente ciò che ho sentito dire che non è possibile alcun approccio pratico e automatizzato. Per favore aggiungi questo come risposta, anche se non mi piace la risposta, vorrei votare perché è utile. Da quello che ho capito, con la mia esperienza limitata, gli strumenti automatici sono utili per analizzare la sintassi generata dalla macchina, su cui è prevista una gestione degli errori molto limitata. E.g .: decompilatore di macchine virtuali, messaggi codificati, ecc. Mentre sono consapevole che tutti i compilatori professionali sono scritti a mano. –