Lexikalische Analyse im Compiler-Design mit Beispiel

Inhaltsverzeichnis:

Anonim

Was ist lexikalische Analyse?

Die LEXISCHE ANALYSE ist die allererste Phase im Compiler-Design. Ein Lexer nimmt den geänderten Quellcode, der in Form von Sätzen geschrieben ist. 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 zusätzlichen Platz oder Kommentar im Quellcode.

Programme, die lexikalische Analysen durchführen, werden als lexikalische Analysatoren oder Lexer bezeichnet. Ein Lexer enthält Tokenizer oder Scanner. Wenn der lexikalische Analysator feststellt, dass das Token ungültig ist, wird ein Fehler generiert. Es liest Zeichenströme aus dem Quellcode, sucht nach legalen Token und leitet die Daten bei Bedarf an den Syntaxanalysator weiter.

Beispiel

How Pleasant Is The Weather?

Siehe dieses Beispiel; Hier können wir leicht erkennen, dass es fünf Wörter gibt, wie angenehm, das, Wetter, ist. Dies ist für uns sehr natürlich, da wir die Trennzeichen, Leerzeichen und das Interpunktionssymbol erkennen können.

 HowPl easantIs Th ewe ather?

Überprüfen Sie nun dieses Beispiel, wir können dies auch lesen. Es wird jedoch einige Zeit dauern, da an den ungeraden Stellen Trennzeichen eingefügt werden. Es ist nicht etwas, das sofort zu dir kommt.

In diesem Tutorial lernen Sie

  • Grundlegende Terminologien:
  • Lexical Analyzer-Architektur: Wie Token erkannt werden
  • Rollen des Lexical Analyzer
  • Lexikalische Fehler
  • Fehlerbehebung in Lexical Analyzer
  • Lexical Analyzer vs. Parser
  • Warum Lexical und Parser trennen?
  • Vorteile der lexikalischen Analyse
  • Nachteil der lexikalischen Analyse

Grundlegende Terminologien

Was ist ein Lexem?

Ein Lexem ist eine Folge von Zeichen, die gemäß dem übereinstimmenden Muster eines Tokens im Quellprogramm enthalten sind. Es ist nichts anderes als eine Instanz eines Tokens.

Was ist ein Token?

Das Token ist eine Folge von Zeichen, die eine Informationseinheit im Quellprogramm darstellt.

Was ist Muster?

Ein Muster ist eine Beschreibung, die vom Token verwendet wird. Bei einem Schlüsselwort, das als Token verwendet wird, ist das Muster eine Folge von Zeichen.

Lexical Analyzer-Architektur: Wie Token erkannt werden

Die Hauptaufgabe der lexikalischen Analyse besteht darin, Eingabezeichen im Code zu lesen und Token zu erzeugen.

Lexical Analyzer scannt den gesamten Quellcode des Programms. Es identifiziert jedes Token einzeln. Scanner werden normalerweise so implementiert, dass Token nur auf Anforderung eines Parsers erstellt werden. So funktioniert das:

  1. "Get next token" ist ein Befehl, der vom Parser an den lexikalischen Analysator gesendet wird.
  2. Nach Erhalt 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 Leerzeichen und Kommentare, während diese Token erstellt werden. Wenn ein Fehler vorliegt, korreliert Lexical Analyzer diesen Fehler mit der Quelldatei und der Zeilennummer.

Rollen des Lexical Analyzer

Der lexikalische Analysator führt die folgenden Aufgaben aus:

  • Hilft beim Identifizieren 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
  • Lesen Sie die Eingabezeichen aus dem Quellprogramm

Beispiel für eine lexikalische Analyse, Token, Nicht-Token

Betrachten Sie den folgenden Code, der Lexical Analyzer zugeführt wird

#include int maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}

Beispiele für erstellte Token

Lexeme Zeichen
int Stichwort
maximal Kennung
(( Operator
int Stichwort
x Kennung
, Operator
int Stichwort
Y. Kennung
) Operator
{ Operator
Wenn Stichwort

Beispiele für Nontokens

Art Beispiele
Kommentar // Dadurch werden 2 Zahlen verglichen
Pre-Prozessor-Direktive #include
Pre-Prozessor-Direktive # NUMS definieren 8,9
Makro NUMS
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 sind nicht sehr häufig, sollten jedoch von einem Scanner verwaltet werden
  • Rechtschreibfehler von Bezeichnern, Operatoren und Schlüsselwörtern gelten als lexikalische Fehler
  • Im Allgemeinen wird ein lexikalischer Fehler durch das Auftreten eines illegalen Zeichens verursacht, meist am Anfang eines Tokens.

Fehlerbehebung in 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 einen wohlgeformten Token erreichen
  • Durch Einfügen des fehlenden Zeichens in die verbleibende Eingabe
  • Ersetzen Sie ein Zeichen durch ein anderes Zeichen
  • Transponieren Sie zwei Serienzeichen

Lexical Analyzer vs. Parser

Lexikalischer Analysator Parser
Scan-Eingabeprogramm Führen Sie eine Syntaxanalyse durch
Token identifizieren Erstellen Sie eine abstrakte Darstellung des Codes
Fügen Sie Token in die Symboltabelle ein Aktualisieren Sie die Einträge in der Symboltabelle
Es erzeugt lexikalische Fehler Es wird ein Analysebaum des Quellcodes generiert

Warum Lexical und Parser trennen?

  • Die Einfachheit des Designs: Es vereinfacht den Prozess der lexikalischen Analyse und der Syntaxanalyse, indem unerwünschte Token eliminiert werden
  • So verbessern Sie die Compilereffizienz: Hilft Ihnen, die Compilereffizienz zu verbessern
  • Spezialisierung: Spezielle Techniken können angewendet werden, um den lexikalischen Analyseprozess zu verbessern
  • Portabilität: Nur der Scanner muss mit der Außenwelt kommunizieren
  • Höhere Portabilität: Eingabegeräte-spezifische Besonderheiten, die auf den Lexer beschränkt sind

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 ausführbaren Binärcode zu erstellen
  • Es wird von Webbrowsern verwendet, um eine Webseite mithilfe von analysierten Daten aus JavsScript, HTML, CSS zu formatieren und anzuzeigen
  • Ein separater lexikalischer Analysator hilft Ihnen beim Aufbau eines spezialisierten und möglicherweise effizienteren Prozessors für die Aufgabe

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 ziemlich schwer zu verstehen
  • Es sind weitere Anstrengungen erforderlich, um den Lexer und seine Token-Beschreibungen zu entwickeln und zu debuggen
  • Zusätzlicher Laufzeitaufwand ist erforderlich, um die Lexertabellen zu generieren und die Token zu erstellen

Zusammenfassung

  • Die lexikalische Analyse ist die allererste Phase im Compiler-Design
  • Ein Lexem ist eine Folge von Zeichen, die gemäß dem übereinstimmenden Muster eines Tokens im Quellprogramm enthalten sind
  • Der Lexical Analyzer ist implementiert, um den gesamten Quellcode des Programms zu scannen
  • Der lexikalische Analysator hilft dabei, Token in der Symboltabelle zu identifizieren
  • Eine Zeichenfolge, die nicht in ein gültiges Token gescannt werden kann, ist ein lexikalischer Fehler
  • Das Entfernen eines Zeichens aus der verbleibenden Eingabe ist nützlich. Fehlerbehebungsmethode
  • Lexical Analyzer scannt das Eingabeprogramm, während der Parser eine Syntaxanalyse durchführt
  • Es vereinfacht den Prozess der lexikalischen Analyse und der Syntaxanalyse, indem unerwünschte Token eliminiert werden
  • Lexical Analyzer wird von Webbrowsern verwendet, um eine Webseite mithilfe von analysierten Daten aus JavsScript, HTML, CSS zu formatieren und anzuzeigen
  • Der größte Nachteil der Verwendung von Lexical Analyzer besteht darin, dass zusätzlicher Laufzeitaufwand erforderlich ist, um die Lexertabellen zu generieren und die Token zu erstellen