Syntaxanalyse: Top-Down- und Bottom-Up-Parsing-Typen des Compilers
Was ist Syntaxanalyse?
Syntaxanalyse ist eine zweite Phase des Compiler-Entwurfsprozesses, in der die gegebene Eingabezeichenfolge auf die Bestรคtigung von Regeln und Struktur der formalen Grammatik รผberprรผft wird. Es analysiert die syntaktische Struktur und prรผft, ob die gegebene Eingabe in der korrekten Syntax der Programmiersprache vorliegt oder nicht.
Die Syntaxanalyse im Compiler-Design-Prozess folgt auf die Phase der lexikalischen Analyse. Sie wird auch als Parse-Baum oder Syntaxbaum bezeichnet. Der Parse-Baum wird mithilfe der vordefinierten Grammatik der Sprache entwickelt. Der Syntaxanalysator prรผft auch, ob ein bestimmtes Programm die Regeln einer kontextfreien Grammatik erfรผllt. Wenn dies der Fall ist, erstellt der Parser den Parse-Baum dieses Quellprogramms. Andernfalls werden Fehlermeldungen angezeigt.

Warum brauchen Sie den Syntaxanalysator?
- รberprรผfen Sie, ob der Code grammatikalisch gรผltig ist
- Der syntaktische Analysator hilft Ihnen, Regeln auf den Code anzuwenden
- Hilft Ihnen sicherzustellen, dass jede รถffnende Klammer eine entsprechende Schlusssaldo hat
- Jede Deklaration hat einen Typ und dieser Typ muss vorhanden sein
Wichtige Syntaxanalysator-Terminologie
Wichtige Terminologien, die im Syntaxanalyseprozess verwendet werden:
- Satz: Ein Satz ist eine Gruppe von Zeichen รผber einem Alphabet.
- Lexem: Ein Lexem ist die syntaktische Einheit der niedrigsten Ebene einer Sprache (z. B. total, start).
- Token: Ein Token ist nur eine Kategorie von Lexemen.
- Schlรผsselwรถrter und reservierte Wรถrter โ Es handelt sich um einen Bezeichner, der als fester Bestandteil der Syntax einer Anweisung verwendet wird. Es handelt sich um ein reserviertes Wort, das Sie nicht als Variablennamen oder Bezeichner verwenden kรถnnen.
- Lรคrmwรถrter โ Fรผllwรถrter sind optional und werden in eine Aussage eingefรผgt, um die Lesbarkeit des Satzes zu verbessern.
- Kommentare โ Es ist ein sehr wichtiger Teil der Dokumentation. Es wird meistens durch /* */ oder//Leerzeichen (Leerzeichen) angezeigt.
- Begrenzer โ Es handelt sich um ein syntaktisches Element, das den Anfang oder das Ende einer syntaktischen Einheit markiert. Wie eine Anweisung oder ein Ausdruck, โbeginโโฆโendโ oder {}.
- Zeichensatz โ ASCII, Unicode
- Identifiers โ Es handelt sich um eine Lรคngenbeschrรคnkung, die dazu beitrรคgt, die Lesbarkeit des Satzes zu verringern.
- OperaTor-Symbole โ + und โ fรผhrt zwei grundlegende Rechenoperationen aus.
- Syntaktische Elemente der Sprache
Warum brauchen wir Parsing?
Bei einer Analyse wird auรerdem รผberprรผft, ob die Eingabezeichenfolge wohlgeformt ist. Wenn nicht, wird sie abgelehnt.
Im Folgenden sind wichtige Aufgaben aufgefรผhrt, die der Parser beim Compilerentwurf ausfรผhrt:
- Hilft Ihnen, alle Arten von Syntaxfehlern zu erkennen
- Suchen Sie die Position, an der der Fehler aufgetreten ist
- Klare und genaue Beschreibung des Fehlers.
- Wiederherstellung nach einem Fehler, um fortzufahren und weitere Fehler im Code zu finden.
- Sollte die Kompilierung โrichtigerโ Programme nicht beeintrรคchtigen.
- Der Parser muss ungรผltige Texte zurรผckweisen, indem er Syntaxfehler meldet
Parsing-Techniken
Parsing-Techniken werden in zwei verschiedene Gruppen unterteilt:
- Top-Down-Analyse,
- Bottom-Up-Analyse
Top-Down-Analyse
Beim Top-Down-Parsing beginnt der Aufbau des Parsebaums an der Wurzel und setzt sich dann in Richtung der Blรคtter fort.
Es gibt zwei Arten der Top-Down-Analyse:
- Prรคdiktives Parsen:
Die prรคdiktive Analyse kann vorhersagen, welche Produktion zum Ersetzen der spezifischen Eingabezeichenfolge verwendet werden sollte. Der prรคdiktive Parser verwendet einen Look-Ahead-Punkt, der auf die nรคchsten Eingabesymbole zeigt. Backtracking ist bei dieser Parsing-Technik kein Problem. Es ist als LL(1)-Parser bekannt
- Rekursives Abstiegs-Parsing:
Diese Parsing-Technik analysiert die Eingabe rekursiv, um einen Prase-Baum zu erstellen. Sie besteht aus mehreren kleinen Funktionen, eine fรผr jedes Nichtterminal in der Grammatik.
Bottom-Up-Analyse
Beim Bottom-Up-Parsing im Compiler-Design beginnt die Konstruktion des Parse-Baums mit dem Blatt und arbeitet sich dann in Richtung seiner Wurzel vor. Es wird auch als Shift-Reduce-Parsing bezeichnet. Diese Art des Parsens im Compiler-Design wird mithilfe einiger Software-Tools.
Fehler โ Wiederherstellungsmethoden
Hรคufige Fehler, die beim Parsen in der Systemsoftware auftreten
- Lexikalisch: Name eines falsch eingegebenen Bezeichners
- Syntaktisch: unausgeglichene Klammer oder ein fehlendes Semikolon
- Semantisch: inkompatible Wertzuweisung
- logisch: Endlosschleife und nicht erreichbarer Code
Ein Parser sollte in der Lage sein, alle im Programm gefundenen Fehler zu erkennen und zu melden. Wenn also ein Fehler auftritt, muss der Parser in der Lage sein, ihn zu verarbeiten und mit der Analyse der verbleibenden Eingabe fortzufahren. Ein Programm kann in verschiedenen Phasen des Kompilierungsprozesses folgende Fehlertypen aufweisen. Es gibt fรผnf gรคngige Fehlerbehebungsmethoden, die im Parser implementiert werden kรถnnen.
Wiederherstellung im Anweisungsmodus
- Falls der Parser auf einen Fehler stรถรt, hilft er Ihnen, Korrekturmaรnahmen zu ergreifen. Dadurch kรถnnen die restlichen Eingaben und Zustรคnde im Voraus analysiert werden.
- Das Hinzufรผgen eines fehlenden Semikolons ist beispielsweise eine Wiederherstellungsmethode im Anweisungsmodus. Allerdings muss der Parse-Designer beim Vornehmen dieser รnderungen vorsichtig sein, da eine falsche Korrektur zu einer Endlosschleife fรผhren kann.
Wiederherstellung im Panikmodus
- Falls der Parser auf einen Fehler stรถรt, ignoriert dieser Modus den Rest der Anweisung und verarbeitet keine Eingaben von fehlerhaften Eingaben bis hin zu Trennzeichen wie einem Semikolon. Dies ist eine einfache Methode zur Fehlerbehebung.
- Bei dieser Art von Wiederherstellungsmethode lehnt der Parser Eingabesymbole nacheinander ab, bis eine einzelne festgelegte Gruppe von Synchronisierungstoken gefunden wird. Die Synchronisierungstoken verwenden im Allgemeinen Trennzeichen wie oder.
Wiederherstellung auf Phrasenebene
- Der Compiler korrigiert das Programm, indem er Token einfรผgt oder lรถscht. Dadurch kann die Analyse an der Stelle fortgesetzt werden, an der sie sich befand. Es fรผhrt eine Korrektur fรผr die verbleibende Eingabe durch. Es kann ein Prรคfix der verbleibenden Eingabe durch eine Zeichenfolge ersetzen, was dem Parser hilft, den Prozess fortzusetzen.
Fehlerproduktionen
- Die Wiederherstellung nach Fehlerproduktion erweitert die Grammatik fรผr die Sprache, die die fehlerhaften Konstrukte generiert. Der Parser fรผhrt dann eine Fehlerdiagnose fรผr dieses Konstrukt durch.
Globale Korrektur
- Der Compiler sollte bei der Verarbeitung einer falschen Eingabezeichenfolge so wenige รnderungen wie mรถglich vornehmen. Bei einer falschen Eingabezeichenfolge a und Grammatik c suchen Algorithmen nach einem Parse-Baum fรผr eine verwandte Zeichenfolge b. Wie bei einigen Einfรผgungen, Lรถschungen und รnderungen an Token, die zum Umwandeln von a in b erforderlich sind, sind so wenig wie mรถglich erforderlich.
Grammatik
Eine Grammatik ist eine Reihe von Strukturregeln, die eine Sprache beschreiben. Grammatiken weisen jedem Satz eine Struktur zu. Dieser Begriff bezieht sich auch auf das Studium dieser Regeln, und diese Datei umfasst Morphologie, Phonologie und Syntax. Es ist in der Lage, viele der Syntax von zu beschreiben Programmiersprachen.
Regeln der Formengrammatik
- Das Nicht-Terminal-Symbol sollte links neben der mindestens einen Produktion erscheinen
- Das Zielsymbol sollte niemals rechts neben dem ::= einer Produktionsposition angezeigt werden.
- Eine Regel ist rekursiv, wenn LHS in ihrer RHS vorkommt
Notationskonventionen
Symbole der Notationskonventionen kรถnnen durch Einschlieรen des Elements in eckige Klammern angegeben werden. Es handelt sich um eine beliebige Folge von Instanzen des Elements, die durch Einschlieรen des Elements in Klammern gefolgt von einem Sternsymbol, { โฆ }*, angegeben werden kann.
Es handelt sich um eine Wahl der Alternative, die das Symbol innerhalb der Einzelregel verwenden darf. Bei Bedarf kann es in Klammern ([,]) eingeschlossen werden.
Es gibt zwei Arten von Notationskonventionen: Terminal und Nicht-Terminal
1. Terminals:
- Kleinbuchstaben im Alphabet wie a, b, c,
- OperaTorsymbole wie +,-, * usw.
- Satzzeichen wie Klammern, Raute, Komma
- 0, 1, โฆ, 9 Ziffern
- Fettgedruckte Zeichenfolgen wie id oder if, alles, was ein einzelnes Terminalsymbol darstellt
2. Nichtterminals:
- Groรbuchstaben wie A, B, C
- Kleingeschriebene kursive Namen: der Ausdruck oder einige
Kontextfreie Grammatik
Ein CFG ist eine linksrekursive Grammatik, die mindestens eine Produktion dieses Typs aufweist. Die Regeln in einer kontextfreien Grammatik sind hauptsรคchlich rekursiv. Ein Syntaxanalysator prรผft, ob ein bestimmtes Programm alle Regeln der kontextfreien Grammatik erfรผllt oder nicht. Wenn die Regeln erfรผllt sind, kรถnnen die Syntaxanalysatoren dieser Regeln einen Analysebaum fรผr dieses Programm erstellen.
expression -> expression -+ term expression -> expression โ term expression-> term term -> term * factor term -> expression/ factor term -> factor factor factor -> ( expression ) factor -> id
Grammatikableitung
Die Grammatikableitung ist eine Folge von Grammatikregeln, die das Startsymbol in eine Zeichenfolge umwandelt. Eine Ableitung beweist, dass die Zeichenfolge zur Sprache der Grammatik gehรถrt.
Ableitung ganz links
Wenn die Satzform der Eingabe gescannt und in der Reihenfolge von links nach rechts ersetzt wird, spricht man von der Ableitung ganz links. Die Satzform, die durch die Ableitung ganz links abgeleitet wird, wird als Satzform links bezeichnet.
Ableitung ganz rechts
Ableitung ganz rechts scannen und die Eingabe durch Produktionsregeln ersetzen, von rechts nach links, Reihenfolge. Es ist als Ableitung ganz rechts bekannt. Die aus der Ableitung ganz rechts abgeleitete Satzform wird als Rechtssatzform bezeichnet.
Syntax vs. Lexikalischer Analysator
| Syntaxanalysator | Lexikalischer Analysator |
|---|---|
| Der Syntaxanalysator befasst sich hauptsรคchlich mit rekursiven Konstrukten der Sprache. | Der lexikalische Analysator erleichtert die Aufgabe des Syntaxanalysators. |
| Der Syntaxanalysator arbeitet mit Tokens in einem Quellprogramm, um sinnvolle Strukturen in der Programmiersprache zu erkennen. | Der lexikalische Analysator erkennt das Token in einem Quellprogramm. |
| Es empfรคngt Eingaben in Form von Token von lexikalischen Analysatoren. | Sie ist fรผr die Gรผltigkeit eines von bereitgestellten Tokens verantwortlich
Der Syntaxanalysator |
Nachteile der Verwendung von Syntaxanalysatoren
- Es wird niemals festgestellt, ob ein Token gรผltig ist oder nicht
- Hilft Ihnen nicht dabei, zu bestimmen, ob eine an einem Token-Typ ausgefรผhrte Operation gรผltig ist oder nicht.
- Sie kรถnnen nicht entscheiden, dass das Token deklariert und initialisiert wird, bevor es verwendet wird
Zusammenfassung
- Die Syntaxanalyse ist eine zweite Phase des Compiler-Entwurfsprozesses, die nach der lexikalischen Analyse folgt
- Der syntaktische Analysator hilft Ihnen, Regeln auf den Code anzuwenden
- Satz, Lexem, Token, Schlรผsselwรถrter und reservierte Wรถrter, Fรผllwรถrter, Kommentare, Trennzeichen, Zeichensatz, Bezeichner sind einige wichtige Begriffe, die in der Syntaxanalyse bei der Compiler-Konstruktion verwendet werden
- Parse prรผft, ob die Eingabezeichenfolge wohlgeformt ist, und lehnt sie andernfalls ab
- Parsing-Techniken werden in zwei verschiedene Gruppen unterteilt: Top-Down-Parsing und Bottom-Up-Parsing
- Lexikalische, syntaktische, semantische und logische Fehler sind einige hรคufige Fehler, die bei der Analysemethode auftreten
- Eine Grammatik ist eine Reihe von Strukturregeln, die eine Sprache beschreiben
- Notationskonventionen Das Symbol kann durch Einschlieรen des Elements in eckige Klammern angegeben werden
- Ein CFG ist eine linksrekursive Grammatik, die mindestens eine Produktion dieses Typs aufweist
- Die Grammatikableitung ist eine Folge von Grammatikregeln, die das Startsymbol in eine Zeichenfolge umwandelt
- Der Syntaxanalysator befasst sich hauptsรคchlich mit rekursiven Konstrukten der Sprache, wรคhrend der lexikalische Analysator die Aufgabe des Syntaxanalysators erleichtert DBMS
- Der Nachteil der Syntaxanalysemethode besteht darin, dass sie niemals feststellen kann, ob ein Token gรผltig ist oder nicht


