Schreiben Sie Ihren eigenen Compiler: Grundprinzipien der Syntaxanalyse

In der vorherigen Kapitelreihe haben wir die lexikalische Analyse abgeschlossen. Die grundlegende Aufgabe der lexikalischen Analyse besteht darin, festzustellen, ob eine bestimmte Zeichenfolge bestimmten Regeln entspricht, und wenn ja, der Zeichenfolge ein Tag (Token) zuzuweisen. Nachdem die lexikalische Analyse abgeschlossen ist, muss die nächste Arbeit der syntaktischen Analyse zugewiesen werden. Letztere hat die Aufgabe, festzustellen, ob die Kombination einer Reihe von Tags bestimmte Spezifikationen erfüllt.

Die Regel, der die Grammatikanalyse folgt, wird als Backus-Knoll-Paradigma bezeichnet und besteht aus drei Teilen: Der ganz linke Teil wird als nichtterminale Symbole bezeichnet, gefolgt von einem Pfeil, und rechts vom Pfeil befindet sich eine Reihe von terminalen oder nichtterminalen Symbolen -terminale Symbole. Das bedeutet, dass das Konzept auf der linken Seite in eine Kombination aus einer Reihe von Konzepten auf der rechten Seite zerlegt werden kann. Um ein konkretes Beispiel zu nennen:
Person -> Kopf, halber Körper, Unterkörper,
Kopf -> Haare, Augen, Ohren, Nase, Mund,
Oberkörper - > Hände Brust Bauch
Unterkörper -> Po Beine

Schauen wir uns das obige Beispiel an. Im ersten Ausdruck ist die linke Seite ein abstraktes Konzept „Person“ und die rechte Seite des Pfeils ist die Komponente einer Person. Mit anderen Worten: „Person“ kann relativ in drei Teile zerlegt werden spezifischere Konzepte, das heißt Kopf, Oberkörper, Unterkörper. Dann kann der Begriff „Kopf“ weiter in eine Kombination anderer Begriffe wie Haare, Augen usw. zerlegt werden. Hierbei ist zu beachten, dass alle Konzepte, die auf der linken Seite des Pfeils erscheinen, als „nichtterminale Symbole“ bezeichnet werden, und alle Konzepte, die nur auf der rechten Seite des Pfeils erscheinen und niemals auf der linken Seite des Pfeils erscheinen Pfeil werden als „Terminalsymbole“ bezeichnet. Nichtterminale Symbole können zerlegt werden, Terminalsymbole können jedoch nicht weiter zerlegt werden. Die durch die obige Reihe von Ausdrücken gebildete Menge wird als „Grammatik“ bezeichnet. Bei der grammatikalischen Analyse wird besonderer Wert auf die „kontextfreie Grammatik“ gelegt. Dieses Konzept bedeutet, dass grammatikalische Regeln nur festlegen, dass bei der lexikalischen Analyse nur die Kombinationsregeln von Tags analysiert werden. Was die Kombination dieser Tags betrifft, ist es egal, was die Kombination bedeutet.

Zum Beispiel:
Satz -> Subjekt-Prädikat-
Objekt Die obige Grammatik beschreibt, dass ein chinesischer Satz in drei Teile unterteilt werden kann: Subjekt, Prädikat und Objekt. Die obige Zerlegung kann uns jedoch nicht sagen, was der Inhalt eines bestimmten Satzes ist, d. h. Die Grammatik kümmert sich nur um den logischen Aufbau von Sätzen und nicht um die Bedeutung, die sie vermitteln. Hierbei ist auch zu beachten, dass die Reihenfolge einer Reihe von Konzepten auf der rechten Seite des Pfeils wichtig ist. Die Reihenfolge ist ein wesentlicher Bestandteil der grammatikalischen Regeln. Beispielsweise muss das logische „Kopf“ erfüllen, dass die Nase hinten liegt die Augen. Wenn diese Reihenfolge umgekehrt ist, dann ist der „Kopf“ kein menschlicher Kopf, sondern ein außerirdischer Kopf.

Der grundlegende Prozess der Syntaxanalyse besteht darin, eine Zeichenfolge anzugeben, zunächst eine lexikalische Analyse durchzuführen, um eine Reihe von Tag-Kombinationen zu erhalten, und dann zu prüfen, ob diese Tag-Kombinationen gemäß dem angegebenen Syntaxausdruck reibungslos zerlegt werden können. Schauen wir uns ein bestimmtes Beispiel an . Das Folgende gilt für die Syntax eines arithmetischen Additionsausdrucks zum Kombinieren von Zahlen und Pluszeichen:
STMT -> EXPR SEMI
EXPR -> FACTOR PLUS EXPR | FACTOR
FACTOR -> NUMBER

Jetzt haben wir eine Zeichenfolge: „1+2;“. Führen Sie zunächst eine lexikalische Analyse dieser Zeichenfolge durch, um NUMBER PLUS NUMBER SEMI zu erhalten. Jetzt müssen wir beurteilen, ob sie der obigen Syntax entspricht Das Label ist SEMI, also erfüllt es das SEMI auf der rechten Seite des ersten Ausdrucks. Jetzt müssen wir bestimmen, ob NUMBER PLUS NUMBER die Regeln von EXPR erfüllen kann.

Schauen wir uns die richtige Zerlegung von EXPR an. Erstens stimmt FACTOR PLUS EXPR mit dem PLUS in NUMBER PLUS NUMBER überein. Als nächstes muss ermittelt werden, ob die erste NUMBER die Anforderungen von FACTOR erfüllen kann, und gleichzeitig bestimmt werden, ob die zweite NUMBER die Anforderungen von EXPR erfüllt.

Schauen wir uns die Zerlegung von FACTOR an. Es kann direkt in NUMBER zerlegt werden, sodass die erste NUMBER die Anforderungen von FACTOR erfüllt. Schauen wir uns nun die zweite NUMBER an. Da EXPR in FACTOR zerlegt werden kann, kann FACTOR in NUMBER zerlegt werden. , somit erfüllt die zweite NUMBER die EXPR-Vorschriften, sodass NUMBER PLUS NUMBER von der oben genannten Grammatik analysiert werden kann, sodass die darin enthaltene Tag-Kombination die gegebenen Grammatikregeln erfüllt.

Die obige Ableitungsmethode wird auch als Ableitung ganz links bezeichnet, da wir immer zuerst die rechte Seite des Ausdrucks erhalten und dann die nichtterminalen Symbole von links nach rechts herausnehmen, um zunächst zu prüfen, ob die angegebene Bezeichnung der Spezifikation entspricht. Gleichzeitig ist zu beachten, dass wir von der oberen Regel ausgehen und sie von oben nach unten zerlegen. Diese Methode wird auch als Top-Down-Ableitung bezeichnet. Wir werden später die erste Methode zur Grammatikanalyse sehen. Ihr Merkmal besteht darin, zuerst einen Satz von Tags zu erhalten, sie dann nacheinander zu analysieren, beginnend mit dem Tag ganz links, und dann die oben beschriebene Ableitungsmethode ganz links zu verwenden, also diese Art der Grammatikanalyse Als LL-Grammatik-Analysealgorithmus bezeichnet, entsprechen beide L im Englischen links, was links bedeutet. Unter diesen bedeutet LL(1), dass beim Parsen ein weiteres Tag im Voraus überprüft wird, und LL(k) bedeutet, dass k weitere Tags im Voraus überprüft werden. Der Grund, warum Sie den Betreff der Beschriftung im Voraus überprüfen, liegt darin, dass ein nichtterminales Symbol mehrere Ausdrücke haben kann, z. B.
EXPR -> FACTOR PLUS EXPR | FACTOR
, was tatsächlich zwei Ausdrücken entspricht, einer ist EXPR -> FACTOR PLUS EXPR und Das andere ist EXPR ->FACTOR. Welches soll beim Parsen ausgewählt werden? Sie können entscheiden, indem Sie sich vorab ein oder mehrere Tags ansehen. Wir werden später auch den LR-Parsing-Algorithmus untersuchen. Das erste L bedeutet, mit dem Parsen ganz links in der Tag-Zeichenfolge zu beginnen, und R bedeutet, beim Parsen die Methode ganz rechts zu verwenden, was genau das Gegenteil der Methode ganz links ist, die wir zuvor erwähnt haben.

Beachten Sie außerdem, dass im oben angegebenen grammatikalischen Ausdruck die Symbole auf der linken Seite in ein oder mehrere Symbole auf der rechten Seite analysiert werden können. Tatsächlich besteht die Möglichkeit, dass die rechte Seite in 0 Symbole analysiert werden kann, oder anders Denken Sie an die Epsilon-Konvertierung während der lexikalischen Analyse zuvor. Dies bedeutet, dass Sie zum nächsten Status springen können, ohne Symbole im aktuellen Status einzugeben. Ebenso erlauben wir den folgenden grammatikalischen Ausdruck.
Bitte fügen Sie eine Bildbeschreibung hinzu
Zu diesem Zeitpunkt bedeutet dies, dass die Analyse abgeschlossen werden kann Nichts tun. Es ist nicht schwer zu verstehen, dass der C-Sprachcompiler eine .c-Quelldatei mit leerem Inhalt kompilieren und analysieren kann.

Die in diesem Abschnitt beschriebenen Dinge sind relativ abstrakt und werden Sie wahrscheinlich noch mehr verwirren. Glücklicherweise sind wir alle am Anfang und bei der lexikalischen Analyse mit der grammatikalischen Analyse vertraut, daher sollten uns die vorherigen Übungen helfen. Um diese zu verstehen Theorien werden wir in den folgenden Kapiteln einige relativ einfache grammatikalische Analysen üben. Nur durch Übung können wir die abstrakte Theorie besser verstehen und beherrschen. Für weitere Informationen suchen Sie bitte nach Coding Disney an Station b.

Supongo que te gusta

Origin blog.csdn.net/tyler_download/article/details/135072586
Recomendado
Clasificación