Lexikalische Analyse (Analyzer) im Compiler-Design mit Beispiel

⚡ Intelligente Zusammenfassung

Die lexikalische Analyse ist die erste Phase des Compilerentwurfs. Dabei wandelt ein Lexer einen Strom von Quellzeichen in sinnvolle Token um. Er entfernt Leerzeichen und Kommentare, speichert die Token in der Symboltabelle und meldet lexikalische Fehler an den Parser.

  • 🔤 Erste Compilerphase: Die lexikalische Analyse liest die Quellzeichen und wandelt sie in eine Folge von Token um.
  • 🧩 Schlüsselbegriffe: Ein Lexem ist eine übereinstimmende Zeichenfolge, ein Token ist seine Kategorie und ein Muster definiert die Regel.
  • ???? ️ So funktioniert es: Der Parser fordert „nächstes Token abrufen“ an, und der Scanner gibt Tokens auf Anfrage zurück.
  • 🧹 Aufräumfunktion: Der Lexer entfernt Leerzeichen und Kommentare, erweitert Makros und füllt die Symboltabelle.
  • ⚠️ Lexikalische Fehler: Ungültige Zeichen oder falsch geschriebene Bezeichner lösen Fehler aus, die durch Wiederherstellungstechniken wie Löschen oder Vertauschen behoben werden.
  • 🔀 Lexer vs Parser: Der Lexer identifiziert Tokens; der Parser erstellt während der Syntaxanalyse einen Syntaxbaum.

Lexikalische Analyse

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:

Lexikalischer Analysator Architektur
Lexikalischer Analysator Architektur
  1. „Get next token“ ist ein Befehl, der vom Parser an den lexikalischen Analysator gesendet wird.
  2. Beim Empfang dieses Befehls durchsucht der lexikalische Analysator die Eingabe, bis er das nächste Token findet.
  3. 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 Erstelle ein Sixpacktract-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 JavaSkript, 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

Häufig gestellte Fragen

Zu den gängigen Tools gehören Lex und seine Open-Source-Version Flex. Man schreibt Token-Muster als reguläre Ausdrücke, und das Tool generiert automatisch den Scanner-Quellcode, sodass man den Tokenizer nicht manuell programmieren muss.

Ein lexikalischer Analysator definiert jedes Token als regulären Ausdruck und implementiert den Abgleich mithilfe endlicher Automaten. Er durchsucht die Zeichen von links nach rechts und gibt die längste gültige Übereinstimmung als nächstes Token aus.

Eine Symboltabelle ist eine Datenstruktur, in der der lexikalische Analysator Bezeichner und deren Attribute wie Name und Typ speichert. Later Compilerphasen lesen und aktualisieren es auf track Variablen und Funktionen.

KI kann Token-reguläre Ausdrücke aus Beispielen generieren und mehrdeutige oder überlappende Ausdrücke erkennen.ping Muster erkennen und Scannerfehler erklären. Dies beschleunigt das Erstellen und Debuggen eines Lexers für eine neue Sprache oder DSL.

Nicht ganz. Compiler verwenden feste Regeln und endliche Automaten zur Tokenisierung von Code, während KI-Modelle Text in statistische Teilwort-Tokens zerlegen. Die Ziele unterscheiden sich: exaktes Parsen versus flexibles Sprachverständnis.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: