Skip to main content

Token (Lexem)

Was ist Token (Lexem)?

In der Informatik ist ein Token (Lexem) der Prozess der Umwandlung einer Folge von Zeichen (wie in einem Computerprogramm oder einer Webseite) in eine Sequenz von Token (sogenannte Zeichenkette (englisch: strings) mit einer zugewiesenen und somit identifizierten Bedeutung). Ein Programm, das lexikalische Analysen durchführt, kann als Lexer, Tokenizer oder Scanner bezeichnet werden, obwohl Scanner auch ein Begriff für die erste Stufe eines Lexers ist. Ein Lexer wird normalerweise mit einem Parser (Programm, dass syntaktische Analysen durchführt) kombiniert, der zusammen die Syntax von Programmiersprachen, Webseiten usw. analysiert.

Anwendungen des Prozesses

Ein Token (Lexem) bildet die erste Phase eines Compiler-Frontends (Analysestufe) in der modernen Verarbeitung. Die Analyse erfolgt im Allgemeinen in einem Durchgang.
In älteren Programmiersprachen wie ALGOL war die Anfangsphase stattdessen die Zeilenrekonstruktion, die das Unstropping (Methode zum expliziten Markieren von Buchstabensequenzen mit einer speziellen Eigenschaft, z. B. als Schlüsselwort) und das Entfernen von Leerzeichen und Kommentaren ausführte. Diese Schritte werden jetzt als Teil des Lexers ausgeführt.

Lexer und Parser werden am häufigsten für Compiler verwendet, können aber auch für andere Computersprachwerkzeuge wie Pretty Printers oder Linters eingesetzt werden. Das Lexing kann in zwei Phasen unterteilt werden: das Scannen, bei dem die Eingabezeile in syntaktische Einheiten namens Lexeme unterteilt wird und diese in Tokenklassen kategorisiert werden; und das Auswerten, das Lexeme in verarbeitete Werte umwandelt.

Lexer sind im Allgemeinen ziemlich einfach, wobei der größte Teil der Komplexität des Parser- oder semantischen Analysephasen überlassen wird und oft durch einen Lexer-Generator, insbesondere Lex oder Derivate, erzeugt werden kann. Lexer können jedoch manchmal eine gewisse Komplexität aufweisen, wie beispielsweise eine Phrasenstrukturverarbeitung, um Eingaben und den Parser zu vereinfachen. Sie können teilweise oder vollständig von Hand geschrieben werden, um entweder Funktionen oder Leistung zu unterstützen.

Definition Token (Lexem)

Ein Lexem ist eine Folge von Zeichen im Quellprogramm, die mit dem Muster für ein Token übereinstimmt und vom lexikalischen Analysator als Instanz dieses Tokens identifiziert wird. Ein Token ist eine Zeichenfolge mit einer zugewiesenen und somit identifizierten Bedeutung. Es wird als ein Paar aufgebaut, das aus einem Token-Namen und einem optionalen Token-Wert besteht. Der Token-Name ist eine Kategorie lexikalischer Einheiten. Übliche Token-Namen sind:

  • Bezeichner: Namen, die der Programmierer wählt;
  • Stichwort: Namen, die bereits in der Programmiersprache integriert sind;
  • Trennzeichen: Interpunktionszeichen und gepaarte Trennzeichen;
  • Operator: Symbole, die mit Argumenten arbeiten und Ergebnisse erzeugen;
  • Literal: numerische, logische, textuelle Referenzliterale;
  • Kommentar: Zeile, Block.

Der Ausdruck in der Programmiersprache C lautet: x = a + b * 2.

Die lexikalische Analyse dieses Ausdrucks ergibt die folgende Sequenz von Token (Lexem):
[(Bezeichner, x), (Operator, =), (Bezeichner, a), (Operator, +), (Bezeichner, b), (Operator, *), (Literal, 2), (Separator, ;)].

Ein Token (Lexem) Name ist ein Teil der Sprache in der Linguistik.

Lexikalische Grammatik

Die Spezifikation einer Programmiersprache enthält oft eine Reihe von Regeln – die lexikalische Grammatik –, welche die lexikalische Syntax definiert. Die lexikalische Syntax ist i. d. R. eine reguläre Sprache, wobei die Grammatikregeln aus regulären Ausdrücken bestehen. Sie definieren eine Menge möglicher Zeichenfolgen (Lexeme) eines Tokens. Ein Lexer erkennt Zeichenfolgen und für jede Art von Zeichenfolge, die identifiziert wird, ergreift das lexikalische Programm eine Aktion, indem es am einfachsten ein Token erzeugt.

Zwei wichtige gemeinsame lexikalische Kategorien sind Leerzeichen und Kommentare. Diese sind auch in der Grammatik definiert und werden vom Lexer verarbeitet, können aber verworfen werden (keine Tokens erzeugen) und als nicht signifikant angesehen werden. Es gibt zwei wichtige Ausnahmen: Erstens sind in sogenannten Off-Side-Regelsprachen, die Blöcke mit Einrückung begrenzen, initiale Leerzeichen signifikant, da sie die Blockstruktur bestimmen und im Allgemeinen auf der Lexer-Ebene behandelt werden. Zweitens müssen in einigen Anwendungen von Lexikern Kommentare und Leerzeichen beibehalten werden (z. B.: Drucker sollte die Kommentare ausgeben, Debugging-Tools können dem Programmierer Nachrichten bereitstellen).

Tokenisierung

Hierbei handelt es sich um den Prozess des Abgrenzens und möglicherweise des Klassifizierens von Abschnitten einer Zeichenfolge von Eingabezeichen. Der resultierende Token (Lexem) wird dann an eine andere Form der Verarbeitung weitergeleitet. Der Prozess kann als Unteraufgabe der Analyse von Eingaben betrachtet werden.

Wenn eine Tokenklasse mehr als ein mögliches Lexem repräsentiert, speichert der Lexer häufig genug Informationen, um das ursprüngliche Token (Lexem) zu reproduzieren, sodass es in der semantischen Analyse verwendet werden kann. Der Parser ruft diese Information typischerweise vom Lexer ab und speichert sie im abstrakten Syntaxbaum. Dies ist notwendig, um einen Informationsverlust bei Zahlen und Bezeichnern zu vermeiden.

Der Token (Lexem) wird basierend auf den spezifischen Regeln des Lexers identifiziert. Zu den Methoden, mit denen Tokens identifiziert werden können, gehören reguläre Ausdrücke, bestimmte Zeichenfolgen, die als “Flag” bezeichnet werden, spezifische Trennzeichen und eine explizite Definition durch ein Wörterbuch. Sonderzeichen, einschließlich Interpunktionszeichen, werden häufig von Lexikern verwendet, um Token (Lexem) aufgrund ihrer natürlichen Verwendung in geschriebenen und Programmiersprachen zu identifizieren.

Die Kategorisierung der Token (Lexem) erfolgt oft nach dem Zeicheninhalt oder nach dem Kontext innerhalb des Datenstroms. Die Regeln werden durch den Lexer definiert. Die Kategorien beinhalten häufig Grammatikelemente der Sprache, die im Datenstrom verwendet wird. Programmiersprachen kategorisieren Token (Lexem) oft als Bezeichner, Operatoren, Gruppierungssymbole oder nach dem Datentyp. Schriftliche Sprachen kategorisieren Token als Substantive, Verben, Adjektive oder Interpunktionszeichen. Kategorien werden für die Nachbearbeitung der Token entweder vom Parser oder von anderen Funktionen im Programm verwendet.

Ein lexikalischer Analysator macht im Allgemeinen nichts mit Kombinationen von Token, da es eine Aufgabe ist, die der Parser übernimmt. Zum Beispiel erkennt ein typischer lexikalischer Analysator Klammern als Token, stellt jedoch nicht sicher, dass jede “(” mit einem “)” übereinstimmt.

Tokens werden oft durch reguläre Ausdrücke definiert, die von einem lexikalischen Analysator-Generator wie Lex verstanden werden. Der lexikalische Analysator (automatisch generiert von einem Werkzeug wie Lex oder von Hand gefertigt) liest einen Strom von Zeichen ein, identifiziert die Lexeme in dem Strom und kategorisiert sie in Token. Dies wird als Tokenisierung bezeichnet. Wenn der Lexer ein ungültiges Token findet, meldet es einen Fehler.

Nach dem Token wird geparst. Von dort können die interpretierten Daten in Datenstrukturen zur allgemeinen Verwendung, Interpretation oder Kompilierung geladen werden.

Sie haben noch Fragen?

Kontaktieren Sie uns

Kostenloser SEO-Check der OSG

Token (Lexem)
1 (20%) 2 votes