Syntaxanalyse: Compiler von oben nach unten & Bottom-Up-Analysetypen

Inhaltsverzeichnis:

Anonim

Was ist Syntaxanalyse?

Die Syntaxanalyse ist eine zweite Phase des Compiler-Entwurfsprozesses, in der die angegebene Eingabezeichenfolge auf Bestätigung der Regeln und der Struktur der formalen Grammatik überprüft wird. Es analysiert die syntaktische Struktur und prüft, ob die angegebene Eingabe in der richtigen Syntax der Programmiersprache vorliegt oder nicht.

Die Syntaxanalyse im Compiler-Design-Prozess erfolgt nach der lexikalischen Analysephase. Es wird auch als Analysebaum oder Syntaxbaum bezeichnet. Der Analysebaum wird mit Hilfe einer 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 Analysebaum dieses Quellprogramms. Andernfalls werden Fehlermeldungen angezeigt.

Syntaxanalysator-Prozess

In diesem Tutorial lernen Sie

  • Warum brauchen Sie Syntax Analyzer?
  • Wichtige Syntax Analyzer-Terminologie
  • Warum brauchen wir Parsing?
  • Analysetechniken
  • Fehler - Wiederherstellungsmethoden
  • Grammatik:
  • Notationskonventionen
  • Kontextfreie Grammatik
  • Grammatikableitung
  • Syntax vs. Lexical Analyzer
  • Nachteile der Verwendung von Syntaxanalysatoren

Warum brauchen Sie Syntax Analyzer?

  • Ü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 Öffnungsstrebe eine entsprechende Schließbalance hat
  • Jede Deklaration hat einen Typ und der Typ muss vorhanden sein

Wichtige Syntax Analyzer-Terminologie

Wichtige Terminologien für den Syntaxanalyseprozess:

  • Satz: Ein Satz ist eine Zeichengruppe über einem Alphabet.
  • Lexem: Ein Lexem ist die unterste syntaktische Einheit einer Sprache (z. B. total, start).
  • Token: Ein Token ist nur eine Kategorie von Lexemen.
  • Schlüsselwörter und reservierte Wörter - Dies ist ein Bezeichner, der als fester Bestandteil der Syntax einer Anweisung verwendet wird. Es ist ein reserviertes Wort, das Sie nicht als Variablennamen oder Bezeichner verwenden können.
  • Geräuschwörter - Geräuschwörter sind optional und werden in eine Anweisung eingefügt, um die Lesbarkeit des Satzes zu verbessern.
  • Kommentare - Dies ist ein sehr wichtiger Teil der Dokumentation. Es wird meistens durch, / * * / oder // Leer (Leerzeichen) angezeigt.
  • Trennzeichen - Dies ist ein syntaktisches Element, das den Anfang oder das Ende einer syntaktischen Einheit markiert. Wie eine Aussage oder ein Ausdruck "begin" ... '' end "oder {}.
  • Zeichensatz - ASCII, Unicode
  • Bezeichner - Dies ist eine Einschränkung der Länge, die Ihnen hilft, die Lesbarkeit des Satzes zu verringern.
  • Operatorsymbole - + und - führen zwei grundlegende arithmetische Operationen aus.
  • Syntaktische Elemente der Sprache

Warum brauchen wir Parsing?

Eine Analyse überprüft auch, ob die Eingabezeichenfolge wohlgeformt ist, und lehnt sie ab, wenn nicht.

Im Folgenden sind wichtige Aufgaben aufgeführt, die der Parser im Compiler-Design ausführt:

  • Hilft Ihnen, alle Arten von Syntaxfehlern zu erkennen
  • Suchen Sie die Position, an der ein 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 "korrekter" Programme nicht beeinflussen.
  • Die Analyse muss ungültige Texte zurückweisen, indem Syntaxfehler gemeldet werden

Analysetechniken

Parsing-Techniken werden in zwei verschiedene Gruppen unterteilt:

  • Top-Down-Analyse,
  • Bottom-Up-Analyse

Top-Down-Analyse:

Bei der Top-Down-Analyse beginnt die Analyse des Analysebaums an der Wurzel und geht dann in Richtung der Blätter weiter.

Zwei Arten der Top-Down-Analyse sind:

  1. Predictive Parsing:

Predictive Parse kann vorhersagen, welche Produktion verwendet werden soll, um die spezifische Eingabezeichenfolge zu ersetzen. Der Predictive 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

  1. Rekursive Abstiegsanalyse:

Diese Analysetechnik analysiert die Eingabe rekursiv, um einen Prasenbaum zu erstellen. Es 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 Erstellung des Analysebaums mit dem Verlassen und wird dann in Richtung seiner Wurzel verarbeitet. Es wird auch als Shift-Reduce-Parsing bezeichnet. Diese Art der Analyse im Compiler-Design wird mithilfe einiger Softwaretools erstellt.

Fehler - Wiederherstellungsmethoden

Häufige Fehler beim Parsen in der Systemsoftware

  • Lexikalisch : Name einer falsch eingegebenen Kennung
  • Syntaktisch : unausgeglichene Klammern 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. Also, wann immer ein Fehler aufgetreten ist, der Parser. Es sollte in der Lage sein, damit umzugehen und die verbleibenden Eingaben weiter zu analysieren. 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

  • Wenn der Parser auf einen Fehler stößt, können Sie Korrekturmaßnahmen ergreifen. Dadurch können die restlichen Eingaben und Zustände vorab analysiert werden.
  • Das Hinzufügen eines fehlenden Semikolons erfolgt beispielsweise in der Wiederherstellungsmethode im Anweisungsmodus. Der Parse-Designer muss jedoch vorsichtig sein, wenn er diese Änderungen vornimmt, da eine falsche Korrektur zu einer Endlosschleife führen kann.

Wiederherstellung im Panikmodus

  • Wenn der Parser auf einen Fehler stößt, ignoriert dieser Modus den Rest der Anweisung und verarbeitet keine Eingaben von fehlerhaften Eingaben zum Trennzeichen wie ein Semikolon. Dies ist eine einfache Methode zur Fehlerbehebung.
  • Bei dieser Art der 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 durch Einfügen oder Löschen von Token. Dies ermöglicht es ihm, von seinem Standort aus zu analysieren. Der verbleibende Eingang wird korrigiert. Es kann ein Präfix der verbleibenden Eingabe durch eine Zeichenfolge ersetzen, wodurch der Parser den Vorgang fortsetzen kann.

Fehlerproduktionen

  • Die Wiederherstellung der 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 so wenig Änderungen wie möglich vornehmen, während eine falsche Eingabezeichenfolge verarbeitet wird. Bei falscher Eingabezeichenfolge a und Grammatik c suchen Algorithmen nach einem Analysebaum für eine verwandte Zeichenfolge b. Wie bei einigen Einfügungen, Löschungen und Modifikationen von Token, die zur Umwandlung von a in b erforderlich sind, ist dies so wenig wie möglich.

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 enthält Morphologie, Phonologie und Syntax. Es ist in der Lage, viele der Syntax von Programmiersprachen zu beschreiben.

Regeln der Formgrammatik

  • Das nicht-terminale Symbol sollte links von mindestens einer Produktion erscheinen
  • Das Zielsymbol sollte niemals rechts vom :: = einer Produktion angezeigt werden
  • Eine Regel ist rekursiv, wenn LHS in ihrer RHS angezeigt wird

Notationskonventionen

Das Symbol für Notationskonventionen kann angezeigt werden, indem das Element in eckige Klammern gesetzt wird. Es handelt sich um eine beliebige Folge von Instanzen des Elements, die angegeben werden können, indem das Element in geschweifte Klammern gefolgt von einem Sternchen {…} * eingeschlossen wird.

Es ist eine Wahl der Alternative, die das Symbol innerhalb der einzelnen Regel verwenden kann. Bei Bedarf kann es in Klammern ([,]) eingeschlossen werden.

Zwei Arten von Notationskonventionen sind Terminal und Nicht-Terminals

1.Terminals:

  • Kleinbuchstaben im Alphabet wie a, b, c,
  • Bedienersymbole wie +, -, * usw.
  • Interpunktionssymbole wie Klammern, Hash, Komma
  • 0, 1,…, 9 Ziffern
  • Fettgedruckte Zeichenfolgen wie id oder if, alles, was ein einzelnes Terminalsymbol darstellt

2.Nichtklemmen:

  • Großbuchstaben wie A, B, C.
  • Kursive Kleinbuchstaben: der Ausdruck oder einige

Kontextfreie Grammatik

Ein CFG ist eine linksrekursive Grammatik, die mindestens eine Produktion dieses Typs enthält. 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 dies der Fall ist, erstellen diese Regelsyntaxanalysatoren möglicherweise einen Analysebaum für dieses Programm.

expression -> expression -+ termexpression -> expression - termexpression-> termterm -> term * factorterm -> expression/ factorterm -> factor factorfactor -> ( 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 sententiale Form der Eingabe gescannt und in der Reihenfolge von links nach rechts ersetzt wird, spricht man von einer Ableitung ganz links. Die Sententialform, die durch die Ableitung ganz links abgeleitet wird, wird als Sententialform 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 Sententialform, die aus der Ableitung ganz rechts abgeleitet wird, wird als rechtssententiale Form bezeichnet.

Syntax vs. Lexical Analyzer

Syntaxanalysator

Lexikalischer Analysator

Der Syntaxanalysator befasst sich hauptsächlich mit rekursiven Konstrukten der Sprache.

Der lexikalische Analysator erleichtert die Aufgabe des Syntaxanalysators.

Der Syntaxanalysator bearbeitet Token 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.

Es ist verantwortlich für die Gültigkeit eines von

der Syntaxanalysator

Nachteile der Verwendung von Syntaxanalysatoren

  • Es wird niemals festgestellt, ob ein Token gültig ist oder nicht
  • Sie können nicht feststellen, ob eine für einen Tokentyp 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-Designprozesses, die nach der lexikalischen Analyse erfolgt
  • Der syntaktische Analysator hilft Ihnen, Regeln auf den Code anzuwenden
  • Satz, Lexem, Token, Schlüsselwörter und reservierte Wörter, Rauschwörter, Kommentare, Trennzeichen, Zeichensatz, Bezeichner sind einige wichtige Begriffe, die in der Syntaxanalyse in der Compilerkonstruktion verwendet werden
  • Parse prüft, ob die Eingabezeichenfolge wohlgeformt ist, und lehnt sie ab, wenn nicht
  • Die Parsing-Techniken sind in zwei verschiedene Gruppen unterteilt: Top-Down-Parsing und Bottom-Up-Parsing
  • Lexikalisch, Syntaktisch, Semantisch und Logisch sind einige häufige Fehler, die während der Analysemethode auftreten
  • Eine Grammatik ist eine Reihe von Strukturregeln, die eine Sprache beschreiben
  • Das Symbol für Notationskonventionen kann angezeigt werden, indem das Element in eckige Klammern gesetzt wird
  • Ein CFG ist eine linksrekursive Grammatik, die mindestens eine Produktion dieses Typs enthält
  • 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 in DBMS erleichtert
  • Der Nachteil der Syntaxanalysemethode besteht darin, dass niemals festgestellt wird, ob ein Token gültig ist oder nicht