Lexikalische Analyse (Analyzer) im Compiler-Design mit Beispiel
Was ist lexikalische Analyse?
Lexikalische Analyse ist die allererste Phase im Compiler-Entwurf. Ein Lexer übernimmt den modifizierten Quellcode, der in Form von Sätzen geschrieben wird. Mit anderen Worten: Es hilft Ihnen, eine Folge von Zeichen in eine Folge von Token umzuwandeln. Der lexikalische Analysator unterteilt diese Syntax in eine Reihe von Token. Es entfernt alle zusätzlichen Leerzeichen oder Kommentare, die im Quellcode geschrieben wurden.
Programme, die im Compiler-Design eine lexikalische Analyse durchführen, werden als lexikalische Analysatoren oder Lexer bezeichnet. Ein Lexer enthält Tokenizer oder Scanner. Wenn der lexikalische Analysator erkennt, dass das Token ungültig ist, generiert er einen Fehler. Die Rolle des Lexical Analyzer beim Compiler-Design besteht darin, Zeichenströme aus dem Quellcode zu lesen, auf zulässige Token zu prüfen und die Daten bei Bedarf an den Syntaxanalysator zu übergeben.
Beispiel
How Pleasant Is The Weather?
Sehen Sie sich dieses Beispiel für eine lexikalische Analyse an; Hier können wir leicht erkennen, dass es fünf Wörter gibt: „How Pleasant, The, Weather, Is“. Das ist für uns ganz natürlich, da wir die Trennzeichen, Leerzeichen und das Satzzeichen erkennen können.
HowPl easantIs Th ewe ather?
Sehen Sie sich nun dieses Beispiel an, wir können es auch lesen. Es wird jedoch einige Zeit dauern, da an den ungeraden Stellen Trennzeichen angebracht werden. Es ist nichts, was einem sofort einfällt.
Grundlegende Terminologien
Was ist ein Lexem?
Ein Lexem ist eine Folge von Zeichen, die entsprechend dem passenden Muster eines Tokens in das Quellprogramm eingefügt werden. Es ist nichts anderes als eine Instanz eines Tokens.
Was ist ein Token?
Token im Compiler-Design sind die Zeichenfolge, die eine Informationseinheit im Quellprogramm darstellt.
Was ist Muster?
Ein Muster ist eine Beschreibung, die vom Token verwendet wird. Im Falle eines Schlüsselworts, das als Token verwendet wird, ist das Muster eine Folge von Zeichen.
Lexikalischer Analysator Architecture: Wie Token erkannt werden
Die Hauptaufgabe der lexikalischen Analyse besteht darin, Eingabezeichen im Code zu lesen und Token zu erstellen.
Der lexikalische Analysator scannt den gesamten Quellcode des Programms. Es identifiziert jedes Token einzeln. Scanner werden normalerweise so implementiert, dass sie Token nur dann erzeugen, wenn sie von einem Parser angefordert werden. So funktioniert die Erkennung von Token im Compiler-Design:
- „Get next token“ ist ein Befehl, der vom Parser an den lexikalischen Analysator gesendet wird.
- Beim Empfang dieses Befehls durchsucht der lexikalische Analysator die Eingabe, bis er das nächste Token findet.
- Es gibt das Token an Parser zurück.
Lexical Analyzer überspringt beim Erstellen dieser Token Leerzeichen und Kommentare. Wenn ein Fehler vorliegt, korreliert der Lexical-Analysator diesen Fehler mit der Quelldatei und der Zeilennummer.
Rollen des lexikalischen Analysators
Der lexikalische Analysator führt die folgenden Aufgaben aus:
- Hilft bei der Identifizierung des Tokens in der Symboltabelle
- Entfernt Leerzeichen und Kommentare aus dem Quellprogramm
- Korreliert Fehlermeldungen mit dem Quellprogramm
- Hilft Ihnen, die Makros zu erweitern, wenn sie im Quellprogramm gefunden werden
- Eingabezeichen aus dem Quellprogramm lesen
Beispiel einer lexikalischen Analyse, Tokens, Nicht-Tokens
Betrachten Sie den folgenden Code, der dem Lexical Analyzer zugeführt wird
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Beispiele für erstellte Token
Lexem | Token |
---|---|
int | Stichwort (Keyword) |
maximal | Identifizieren |
( | OperaDo. |
int | Stichwort (Keyword) |
x | Identifizieren |
, | OperaDo. |
int | Stichwort (Keyword) |
Y | Identifizieren |
) | OperaDo. |
{ | OperaDo. |
If | Stichwort (Keyword) |
Beispiele für Nontokens
Typ | Beispiele |
---|---|
Kommentar | // Dadurch werden 2 Zahlen verglichen |
Präprozessor-Direktive | #einschließen |
Präprozessor-Direktive | #define NUMS 8,9 |
Makro | ZAHLEN |
Leerzeichen | /n /b /t |
Lexikalische Fehler
Eine Zeichenfolge, die nicht in ein gültiges Token gescannt werden kann, ist ein lexikalischer Fehler. Wichtige Fakten zum lexikalischen Fehler:
- Lexikalische Fehler kommen nicht sehr häufig vor, sollten aber von einem Scanner behoben werden
- Falsche Schreibweisen von Bezeichnern, Operatoren und Schlüsselwörtern gelten als lexikalische Fehler
- Im Allgemeinen wird ein lexikalischer Fehler durch das Auftreten eines unzulässigen Zeichens verursacht, meist am Anfang eines Tokens.
Fehlerbehebung im Lexical Analyzer
Hier sind einige der häufigsten Fehlerbehebungstechniken:
- Entfernt ein Zeichen aus der verbleibenden Eingabe
- Im Panikmodus werden die aufeinanderfolgenden Zeichen immer ignoriert, bis wir ein wohlgeformtes Token erreichen
- Durch Einfügen des fehlenden Zeichens in die verbleibende Eingabe
- Ersetzen Sie ein Zeichen durch ein anderes Zeichen
- Transponieren Sie zwei Serienzeichen
Lexikalischer Analysator vs. Parser
Lexikalischer Analysator | Parser |
---|---|
Eingabeprogramm scannen | Führen Sie eine Syntaxanalyse durch |
Identifizieren Sie Token | Erstellen Sie eine abstrakte Darstellung des Codes |
Fügen Sie Token in die Symboltabelle ein | Symboltabelleneinträge aktualisieren |
Es erzeugt lexikalische Fehler | Es generiert einen Analysebaum des Quellcodes |
Warum Lexical und Parser trennen?
- Die Einfachheit des Designs: Es erleichtert den Prozess der lexikalischen Analyse und der Syntaxanalyse durch die Eliminierung unerwünschter Token
- So verbessern Sie die Compiler-Effizienz: Hilft Ihnen, die Compiler-Effizienz zu verbessern
- Spezialisierung: Zur Verbesserung des lexikalischen Analyseprozesses können spezielle Techniken eingesetzt werden
- Portabilität: Nur der Scanner muss mit der Außenwelt kommunizieren
- Höhere Portabilität: Eingabegerätespezifische Besonderheiten auf den Lexer beschränkt
Vorteile der lexikalischen Analyse
- Die lexikalische Analysemethode wird von Programmen wie Compilern verwendet, die die analysierten Daten aus dem Code eines Programmierers verwenden können, um einen kompilierten binären ausführbaren Code zu erstellen
- Es wird von Webbrowsern verwendet, um eine Webseite mithilfe geparster Daten von zu formatieren und anzuzeigen JavaScript, HTML, CSS
- Ein separater lexikalischer Analysator hilft Ihnen, einen spezialisierten und potenziell effizienteren Prozessor für die Aufgabe zu konstruieren
Nachteil der lexikalischen Analyse
- Sie müssen viel Zeit damit verbringen, das Quellprogramm zu lesen und es in Form von Token zu partitionieren
- Einige reguläre Ausdrücke sind im Vergleich zu PEG- oder EBNF-Regeln recht schwer zu verstehen
- Es ist mehr Aufwand erforderlich, um den Lexer und seine Token-Beschreibungen zu entwickeln und zu debuggen
- Für die Generierung der Lexer-Tabellen und die Erstellung der Token ist zusätzlicher Laufzeitaufwand erforderlich
Zusammenfassung
- Die lexikalische Analyse ist die allererste Phase im Compiler-Design
- Lexeme und Tokens sind die Zeichenfolgen, die entsprechend dem passenden Muster eines Tokens in das Quellprogramm eingebunden werden
- Der lexikalische Analysator ist implementiert, um den gesamten Quellcode des Programms zu scannen
- Der lexikalische Analysator hilft bei der Identifizierung von Token in der Symboltabelle
- Eine Zeichenfolge, die nicht in ein gültiges Token gescannt werden kann, ist ein lexikalischer Fehler
- Entfernt ein Zeichen aus der verbleibenden Eingabe. Dies ist eine nützliche Methode zur Fehlerbehebung
- Lexical Analyzer scannt das Eingabeprogramm, während der Parser eine Syntaxanalyse durchführt
- Es vereinfacht den Prozess der lexikalischen Analyse und der Syntaxanalyse durch die Eliminierung unerwünschter Token
- Der lexikalische Analysator wird von Webbrowsern verwendet, um eine Webseite mithilfe analysierter Daten aus JavaScript, HTML und CSS zu formatieren und anzuzeigen
- Der größte Nachteil der Verwendung des Lexical-Analysators besteht darin, dass zusätzlicher Laufzeitaufwand erforderlich ist, um die Lexer-Tabellen zu generieren und die Token zu erstellen