Lexikalische Analyse

In der Informatik ist lexikalische Analyse der Prozess, eine Folge von Charakteren in eine Folge von Jetons umzuwandeln. Ein Programm oder Funktion, die lexikalische Analyse durchführt, werden einen lexikalischen Analysator, lexer, oder Scanner genannt. Ein lexer besteht häufig als eine einzelne Funktion, die durch einen parser oder eine andere Funktion genannt wird.

Lexikalische Grammatik

Die Spezifizierung einer Programmiersprache schließt häufig eine Reihe von Regeln ein, der den lexer definiert. Diese Regeln bestehen gewöhnlich aus regelmäßigen Ausdrücken, und sie definieren den Satz von möglichen Charakter-Folgen, die verwendet werden, um individuelle Jetons oder lexemes zu bilden.

Auf Programmiersprachen, die Blöcke mit Jetons (z.B, "{" und "}") im Vergleich mit Abseitsregel-Sprachen abgrenzen, die Blöcke mit der Einrückung abgrenzen, wird Leerraum auch durch einen regelmäßigen Ausdruck definiert und beeinflusst die Anerkennung anderer Jetons, aber trägt Jetons nicht selbst bei. Wie man sagt, ist Leerraum auf solchen Sprachen unbedeutend.

Jeton

Ein Jeton ist eine Reihe von Charakteren, kategorisiert ordnungsmäßig als ein Symbol (z.B, BEZEICHNER, ZAHL, KOMMA). Der Prozess von sich formenden Jetons von einem Eingangsstrom von Charakteren wird tokenization genannt, und der lexer kategorisiert sie gemäß einem Symbol-Typ. Ein Jeton kann wie irgendetwas aussehen, was nützlich ist, für einen Eingangstextstrom oder Textdatei zu bearbeiten.

Ein lexikalischer Analysator tut allgemein nichts mit Kombinationen von Jetons, eine Aufgabe ist nach einem parser abgereist. Zum Beispiel erkennt ein typischer lexikalischer Analysator Parenthesen als Jetons an, aber tut nichts, um sicherzustellen, dass jeder" (" wird mit" verglichen)".

Denken Sie diesen Ausdruck auf der C Programmiersprache:

:

Tokenized im folgenden Tisch:

Jetons werden oft durch regelmäßige Ausdrücke definiert, die durch einen lexikalischen Generator von Analysator wie lex verstanden werden. Der lexikalische Analysator (entweder erzeugt automatisch durch ein Werkzeug wie lex oder mit der Hand gemacht) liest in einem Strom von Charakteren, identifiziert den lexemes im Strom, und kategorisiert sie in Jetons. Das wird "tokenizing" genannt. Wenn der lexer einen ungültigen Jeton findet, wird er einen Fehler ausgeben.

Im Anschluss an tokenizing analysiert grammatisch. Von dort können die interpretierten Daten in Datenstrukturen für den allgemeinen Gebrauch, die Interpretation oder das Kompilieren geladen werden.

Scanner

Die erste Stufe, der Scanner, basiert gewöhnlich auf einer Zustandsmaschine (FSM). Es hat innerhalb seiner Information über die möglichen Folgen von Charakteren verschlüsselt, die innerhalb von einigen der Jetons enthalten werden können, die es behandelt (individuelle Beispiele dieser Charakter-Folgen sind als lexemes bekannt). Zum Beispiel kann ein Jeton der ganzen Zahl jede Folge von numerischen Ziffer-Charakteren enthalten. In vielen Fällen kann der erste non-whitespace Charakter verwendet werden, um die Art des Jetons abzuleiten, der folgt und nachfolgende Eingangscharaktere dann einer nach dem anderen bis zum Erreichen eines Charakters bearbeitet werden, der nicht im Satz von Charakteren ist, die für diesen Jeton annehmbar sind (das ist bekannt, weil die maximalen Regel oder längste Match-Regel schmatzend kauen). Auf einigen Sprachen sind die lexeme Entwicklungsregeln mehr kompliziert und können das Zurückverfolgen einschließen vorher liest Charaktere.

Tokenizer

Tokenization ist der Prozess des Abgrenzens und vielleicht Klassifizierens von Abteilungen einer Reihe von Eingangscharakteren. Die resultierenden Jetons werden dann zu einer anderen Form der Verarbeitung verzichtet. Der Prozess kann als eine Teilaufgabe betrachtet werden, Eingang grammatisch zu analysieren.

Nehmen Sie zum Beispiel,

:

Die Schnur wird auf Räumen nicht implizit segmentiert, wie ein englischer Sprecher tun würde. Der rohe Eingang, die 43 Charaktere, muss in die 9 Jetons mit einem gegebenen Raumbegrenzungszeichen (d. h. das Zusammenbringen der Schnur oder des regelmäßigen Ausdrucks) ausführlich gespalten werden.

Die Jetons konnten in XML, vertreten werden

</Satz>

</Quelle>

Oder ein S-Ausdruck,

(Satz

((Wort) (Wort schnell) (Wort braun)

(Wortfuchs) (Wortsprünge) (Wort)

(Wort) (Wort faul) (Worthund)))

</Quelle>

Ein lexeme ist jedoch nur eine Reihe von Charakteren, die bekannt sind, von einer bestimmten Art (z.B, eine Schnur zu sein, wörtlich, eine Folge von Briefen). Um einen Jeton zu bauen, braucht der lexikalische Analysator eine zweite Bühne, den Schätzer, der die Charaktere des lexeme durchsieht, um einen Wert zu erzeugen. Der mit seinem Wert verbundene Typ des lexeme ist, was richtig einen Jeton einsetzt, der einem parser gegeben werden kann. (Einige Jetons wie Parenthesen haben Werte nicht wirklich, und so kann die Schätzer-Funktion für diese nichts zurückgeben. Die Schätzer für ganze Zahlen, Bezeichner und Schnuren können beträchtlich komplizierter sein. Manchmal können Schätzer einen lexeme völlig unterdrücken, es vor dem parser verbergend, der für whitespace und Anmerkungen nützlich ist.)

Zum Beispiel, im Quellcode eines Computerprogramms, die Schnur

:

könnte (mit whitespace unterdrückt) in den lexikalischen Scheinstrom umgewandelt werden:

NENNEN SIE "net_worth_future"

KOMMT GLEICH

OPEN_PARENTHESIS

NENNEN SIE "Vermögen"

MINUS

NENNEN SIE "Verbindlichkeiten"

CLOSE_PARENTHESIS

STRICHPUNKT

Obwohl es möglich und manchmal, wegen des Genehmigens von Beschränkungen von vorhandenem parsers notwendig ist, oder wenn die Liste von Jetons klein ist, um zu schreiben, dass ein lexer mit der Hand, lexers häufig durch automatisierte Werkzeuge erzeugt werden. Diese Werkzeuge akzeptieren allgemein regelmäßige Ausdrücke, die die im Eingangsstrom erlaubten Jetons beschreiben. Jeder regelmäßige Ausdruck wird mit einer Produktion in der lexikalischen Grammatik der Programmiersprache vereinigt, die den lexemes das Zusammenbringen des regelmäßigen Ausdrucks bewertet. Diese Werkzeuge können Quellcode erzeugen, der kompiliert und durchgeführt werden oder einen Zustandtisch für eine Zustandsmaschine bauen kann (der in den Schablone-Code für die Kompilation und Ausführung eingesteckt wird).

Regelmäßige Ausdrücke vertreten kompakt Muster, denen die Charaktere in lexemes folgen könnten. Zum Beispiel, für eine englische Sprache, könnte ein NAMEN-Jeton jeder englische alphabetische Charakter oder ein Unterstreichen, gefolgt von jeder Zahl von Beispielen jedes ASCII alphanumerischen Charakters oder eines Unterstreichens sein. Das konnte kompakt durch die Schnur vertreten werden. Das bedeutet "jeden Charakter a-z, A-Z oder _, gefolgt von 0 oder mehr von a-z, A-Z, _ oder 0-9".

Regelmäßige Ausdrücke und die Zustandsmaschinen, die sie erzeugen, sind nicht stark genug, um rekursive Muster, solcher als "n öffnende Parenthesen zu behandeln, die von einer Behauptung gefolgt sind, die von n Schlussparenthesen gefolgt ist." Sie sind dazu nicht fähig, Zählung zu behalten und nachzuprüfen, dass n dasselbe an beiden Seiten ist - wenn Sie keinen begrenzten Satz von erlaubten Werten für n haben. Es nimmt einen flüggen parser, um solche Muster in ihrer vollen Allgemeinheit anzuerkennen. Ein parser kann Parenthesen auf einem Stapel stoßen und dann versuchen, sie knallen zu lassen von und zu sehen, ob der Stapel am Ende leer ist. (sieh Beispiel im SICP-Buch).

Das Programmierwerkzeug von Lex und sein Bearbeiter werden entworfen, um Code für schnelle lexikalische auf einer formellen Beschreibung der lexikalischen Syntax gestützte Analysatoren zu erzeugen. Es wird genügend für Anwendungen mit einem komplizierten Satz von lexikalischen Regeln und strengen Leistungsvoraussetzungen nicht allgemein betrachtet; zum Beispiel verwendet die GNU-Bearbeiter-Sammlung (gcc) handschriftlichen lexers.

Generator von Lexer

Lexikalische Analyse kann häufig in einem einzelnen Pass durchgeführt werden, wenn das Lesen ein Charakter auf einmal getan wird. Einzelner Pass lexers kann durch Werkzeuge erzeugt werden, die beugen.

Die lex/flex Familie von Generatoren verwendet eine tabellengesteuerte Annäherung, die viel weniger effizient ist als die direkt codierte Annäherung. Mit der letzten Annäherung erzeugt der Generator einen Motor, der direkt springt, um Staaten über goto Behauptungen fortzusetzen. Werkzeuge wie re2c und Quex haben sich erwiesen (z.B. RE2C - Ein Mehr vielseitiger Scanner-Generator (1994), um Motoren zu erzeugen, die zwischen zwei bis dreimal schneller sind als, beugt erzeugte Motoren. Es ist im Allgemeinen schwierig zu reichen - schreiben Analysatoren, die besser leisten als durch diese letzten Werkzeuge erzeugte Motoren.

Das einfache Dienstprogramm, einen Scanner-Generator zu verwenden, sollte besonders in der Entwicklungsphase nicht rabattiert werden, als sich eine Sprachspezifizierung täglich ändern könnte. Die Fähigkeit, lexikalische Konstruktionen als regelmäßige Ausdrücke auszudrücken, erleichtert die Beschreibung eines lexikalischen Analysators. Einige Werkzeuge bieten die Spezifizierung prä- und Postbedingungen an, die zum Programm mit der Hand hart sind. In diesem Fall, mit einem Scanner-Generator kann viel Entwicklungsdauer sparen.

Lexikalische Generatoren von Analysator

  • ANTLR - ANTLR erzeugt behauptet-LL (k) lexers.
  • Beugen Sie - Alternative Variante des klassischen "lex" (C/C ++).
  • JFlex - A schreiben von JLex um.
  • Ragel - Eine Zustandmaschine und lexikalischer Scanner-Generator mit der Produktionsunterstützung für C, C ++, C#, Ziel-C, D, Java, Gehen und Quellcode von Ruby.

Die folgenden lexikalischen Analysatoren können Unicode behandeln:

  • JavaCC - JavaCC erzeugt lexikalische in Java geschriebene Analysatoren.
  • JLex - Ein lexikalischer Generator von Analysator für Java.
  • Quex (oder "Queχ") - Ein schneller universaler lexikalischer Generator von Analysator für C und C ++.

Siehe auch

  • Liste von parser Generatoren
  • Syntaxanalyse
  • Mit C# und Java, Pat Terry, 2005, internationale Standardbuchnummer 0 321 26360 X 624 kompilierend
  • Algorithmen + Datenstrukturen = Programme, Niklaus Wirth, 1975, internationale Standardbuchnummer 0-13-022418-9
  • Bearbeiter-Aufbau, Niklaus Wirth, 1996, internationale Standardbuchnummer 0-201-40353-6
  • Sebesta, R. W. (2006). Konzepte von Programmiersprachen (Die siebente Ausgabe) Seiten 177. Boston: Pearson/Addison-Wesley.
  • Worterwähnungssegmentationsaufgabe-Analyse-Seite
  • Auf der Anwendbarkeit des längsten Matchs herrschen in der lexikalischen Analyse

Die Zweiteilung von Ousterhout / Vulcano
Impressum & Datenschutz