Seit dem ersten Versuch haben Benutzer versucht, Syntaxfehler zu melden und zu reparieren. Es gibt viele technische Papiere, wie man das macht. Die Suche nach der Zeichenfolge "syntax error repair" unter scholar.google.com führt zu 57 Treffern.
Es gibt wirklich einige Probleme:
1) Wie einen sinnvollen Fehler an den Leser zu melden. Zu Beginn gibt es ist, wo der Parser den Fehler erkennt, und wo der Benutzer tatsächlich den Fehler gemacht. Zum Beispiel könnte hat ein C-Programm einen ‚++‘ Betreiber in einem fremden Ort:
void p {
x = y ++
z = 0;
<EOF>
meisten Parser werden ersticken, wenn „z“ wird angetroffen, und es als der Ort des Fehlers melden. Wenn der Fehler jedoch "++" verwendet, wenn "+" gemeint war, ist dieser Bericht falsch. Um dies richtig zu machen, müssen Sie in der Lage sein, die Gedanken des Programmierers zu lesen.
Sie haben auch das Problem, den Fehlerkontext zu melden. Melden Sie den Fehler in einem Ausdruck [auf den ersten Blick, scheint so]? in einer Stellungnahme? In einer Linie? In einem Funktionskörper? In Funktionsdeklaration? Wahrscheinlich möchten Sie in der engsten syntaktischen Kategorie berichten, die den Fehlerpunkt umgibt. (Beachten Sie, dass Sie den Funktionskörper oder die Deklaration nicht als "umgebende" Fehlerstelle angeben können, da auch diese nicht vollständig sind!) Was, wenn der Fehler wirklich ein fehlendes Semikolon nach dem ++ war? Dann waren die Fehlerorte nicht wirklich "im Ausdruck". Was ist, wenn die Reparatur das Einfügen eines fehlenden String-Zitats erfordert? Ein Makrofortsetzungszeichen?
Also müssen Sie irgendwie entscheiden, was den tatsächlichen Fehler ausmacht, und das bringt uns zur Fehlerreparatur.
2) Fehler Reparatur: Damit das Werkzeug auf sinnvolle Weise fortfahren kann, muss es den Fehler beheben. Dies bedeutet vermutlich, dass der Strom der Input-Tokens gepatcht wird, um ein legales Programm zu erstellen (das Sie möglicherweise nicht ausführen können, wenn die Quelle mehrere Fehler aufweist). Was ist, wenn es mehrere mögliche Patches gibt? Es sollte offensichtlich sein, dass der beste Fehlerbericht "JJJJ ist falsch, ich vermute, dass du xxxx benutzt haben solltest" ist. Wie groß sollte ein Patch für eine Reparatur sein: nur das Token, das den Fehler ausgelöst hat, Token, die ihm folgen, wie ist es mit Token, die ihm vorausgehen?
Ich bemerke, es ist schwer, automatische, allgemeine Fehler Reparatur Vorschlag auf handgeschriebenen Parsern zu tun, weil die Grammatik, die zur Führung solcher Reparatur benötigt wird, nirgendwo explizit verfügbar ist. Sie würden also erwarten, dass die automatische Reparatur am besten auf Tools funktioniert, für die die Grammatik ein explizites Artefakt war.
Es kann auch sein, dass die Fehlerreparatur häufige Fehler berücksichtigen sollte. Wenn Menschen dazu neigen, ";" Off-Anweisungen, und das Einfügen von einem behebt die Datei, könnte es eine gute Reparatur sein. Wenn sie das selten tun und es mehr als eine Reparatur gibt (zB "++" durch "+" ersetzen), ist eine alternative Reparatur wahrscheinlich ein besserer Vorschlag.
3) Semantische Auswirkungen der Reparatur Sie beheben die Syntaxfehler, das reparierte Programm ist möglicherweise nicht sinnvoll Wenn Ihr Fehler das Einfügen eines Bezeichners erfordert, welcher Bezeichner sollte verwendet werden?
FWIW, unser DMS Software Reengineering Toolkit führt eine automatische Reparatur durch, die vollständig von der Grammatik gesteuert wird. Es geht von der Annahme aus, dass das Token am Fehlerpunkt gelöscht werden sollte oder dass ein anderes einzelnes Token nach links eingefügt werden sollte, das fehlende ";" und zusätzliche Pluszeichen fängt an, es gelingt oft eine rechtliche Reparatur ist nicht der "richtige". Zumindest lässt es den Parser zum re weitergehen st des Quellcodes.
Ich denke, die Jagd nach guten, automatisierten Fehler Reparatur wird für eine lange Zeit fortgesetzt.
FWIW, das Papier Syntaxfehler Reparatur für einen Java-basierten Parser Generator berichtet, dass Burke Ph.D. Diplomarbeit:
M.G. Burke, 1983, Eine praktische Methode für LR und LL syntaktische Fehlerdiagnose und Wiederherstellung, Dissertation, Abteilung für Informatik, New York University
ist ziemlich gut. Insbesondere werden Fehler repariert, indem der linke Kontext des Fehlers und der Fehlerumfang berücksichtigt und überarbeitet werden. Sieht aus wie man kann get it from ACM
Dies ist wahrscheinlich nicht das, was Sie hören wollen, aber Sie besser dran Hand den Parser und Lexer zu schreiben. Dies ist keine besonders schwierige Aufgabe (besonders im Vergleich zum Schreiben des Semantik-Analysators und des Codegenerators) und wird die besten Ergebnisse bei der Fehlerbehandlung liefern. Aber vertrau mir nicht, vertraue Walter Bright dem Autor des ersten nativen C++ - Compilers und Erfinders der D-Programmiersprache. er hat einen Artikel über genau das auf Dr.Dobbs [hier] (http://www.drdobbs.com/architecture-and-design/so-you-want-to-write-your-own-language/240165488). (Fehlerwiederherstellung ist auf Seite 2) – Computermatronic
Das ist genau das, was ich zu hören bekam, dass kein praktischer automatisierter Ansatz möglich ist. Bitte füge das als Antwort hinzu, auch wenn ich die Antwort nicht mag, würde ich sie so wählen, wie es nützlich ist. Aus meiner Sicht, mit meiner begrenzten Erfahrung, sind automatisierte Tools nützlich, um maschinengenerierte Syntax zu analysieren, bei der eine sehr begrenzte Fehlerbehandlung erwartet wird. Zum Beispiel: virtual machine decompiler, codierte Nachrichten, etc. Während ich weiß, dass alle professionellen Compiler handgeschrieben sind. –