Compiler Design - Fehlerbehebung
Ein Parser sollte in der Lage sein, Fehler im Programm zu erkennen und zu melden. Es wird erwartet, dass der Parser in der Lage sein sollte, einen Fehler zu behandeln und den Rest der Eingabe weiter zu analysieren. Meistens wird vom Parser erwartet, dass er nach Fehlern sucht, aber in verschiedenen Phasen des Kompilierungsprozesses können Fehler auftreten. Ein Programm kann in verschiedenen Phasen die folgenden Arten von Fehlern aufweisen:
Lexical : Name eines falsch eingegebenen Bezeichners
Syntactical : fehlendes Semikolon oder unausgeglichene Klammer
Semantical : Inkompatible Wertzuweisung
Logical : Code nicht erreichbar, Endlosschleife
Es gibt vier gängige Fehlerbehebungsstrategien, die im Parser implementiert werden können, um Fehler im Code zu beheben.
Panikmodus
Wenn ein Parser irgendwo in der Anweisung auf einen Fehler stößt, ignoriert er den Rest der Anweisung, indem er keine Eingaben von fehlerhaften Eingaben an Trennzeichen wie Semikolon verarbeitet. Dies ist der einfachste Weg zur Fehlerbehebung und verhindert außerdem, dass der Parser Endlosschleifen entwickelt.
Anweisungsmodus
Wenn ein Parser auf einen Fehler stößt, versucht er, Korrekturmaßnahmen zu ergreifen, damit der Parser mit den restlichen Eingaben der Anweisung weiter analysieren kann. Zum Beispiel das Einfügen eines fehlenden Semikolons, das Ersetzen des Kommas durch ein Semikolon usw. Parser-Designer müssen hier vorsichtig sein, da eine falsche Korrektur zu einer Endlosschleife führen kann.
Fehlerproduktionen
Den Compiler-Designern sind einige häufige Fehler bekannt, die im Code auftreten können. Darüber hinaus können die Designer eine erweiterte Grammatik erstellen, die als Produktionen verwendet werden kann, die fehlerhafte Konstrukte erzeugen, wenn diese Fehler auftreten.
Globale Korrektur
Der Parser betrachtet das vorliegende Programm als Ganzes und versucht herauszufinden, was das Programm tun soll, und versucht, eine möglichst genaue Übereinstimmung für das Programm zu finden. Wenn eine fehlerhafte Eingabe (Anweisung) X eingegeben wird, wird ein Analysebaum für eine möglichst fehlerfreie Anweisung Y erstellt. Dies kann es dem Parser ermöglichen, minimale Änderungen am Quellcode vorzunehmen, jedoch aufgrund der Komplexität (Zeit und Raum) von Diese Strategie wurde in der Praxis noch nicht umgesetzt.
Abstrakte Syntaxbäume
Parse-Tree-Darstellungen können vom Compiler nicht einfach analysiert werden, da sie mehr Details enthalten, als tatsächlich benötigt werden. Nehmen Sie als Beispiel den folgenden Analysebaum:
Bei genauer Betrachtung stellen wir fest, dass die meisten Blattknoten für ihre übergeordneten Knoten ein einzelnes Kind sind. Diese Informationen können entfernt werden, bevor sie in die nächste Phase eingespeist werden. Durch Ausblenden zusätzlicher Informationen können wir einen Baum erhalten, wie unten gezeigt:
Abstrakter Baum kann dargestellt werden als:
ASTs sind wichtige Datenstrukturen in einem Compiler mit den wenigsten unnötigen Informationen. ASTs sind kompakter als ein Analysebaum und können von einem Compiler problemlos verwendet werden.