it-swarm.com.de

Was ist der Unterschied zwischen einem Token und einem Lexem?

In Compiler Construction von Aho Ullman und Sethi wird angegeben, dass die Eingabezeichenfolge der Zeichen des Quellprogramms in eine Folge von Zeichen mit logischer Bedeutung unterteilt ist und als Token und Lexeme bezeichnet werden ist der grundlegende Unterschied?

70
user1707873

Verwendung von " Compilers Principles, Techniques & Tools, 2. Auflage. " (WorldCat) von Aho, Lam, Sethi und Ullman, AKA das Purple Book ,

Lexeme pg. 111 

Ein Lexem ist eine Folge von Zeichen im Quellprogramm, die stimmt mit dem Muster für ein Token überein und wird durch das lexikalische Zeichen identifiziert Analyzer als Instanz dieses Tokens.

Token pg. 111 

Ein Token ist ein Paar, das aus einem Token-Namen und einem optionalen Attribut besteht Wert. Der Name des Tokens ist ein abstraktes Symbol, das eine Art von .__ darstellt. lexikalische Einheit, z. B. ein bestimmtes Schlüsselwort oder eine Eingabesequenz Zeichen, die einen Bezeichner angeben. Die Token-Namen sind die Eingabe Symbole, die der Parser verarbeitet.

Muster pg. 111 

Ein Muster ist eine Beschreibung des Formulars, das die Lexeme eines Tokens verwenden können. nehmen. Im Falle eines Schlüsselworts als Token ist das Muster nur die Folge von Zeichen, aus denen das Schlüsselwort besteht. Für Bezeichner und einige Bei anderen Token ist das Muster eine komplexere Struktur, die mit .__ übereinstimmt. viele Saiten.

Abbildung 3.2: Beispiele für Tokens S.112 

[Token]       [Informal Description]                  [Sample Lexemes]
if            characters i, f                         if
else          characters e, l, s, e                   else
comparison    < or > or <= or >= or == or !=          <=, !=
id            letter followed by letters and digits   pi, score, D2
number        any numeric constant                    3.14159, 0, 6.02e23
literal       anything but ", surrounded by "'s       "core dumped"

Um diese Beziehung zu einem Lexer und Parser besser zu verstehen, beginnen wir mit dem Parser und arbeiten rückwärts zur Eingabe.

Um das Entwerfen eines Parsers zu vereinfachen, arbeitet ein Parser nicht direkt mit der Eingabe, sondern nimmt eine Liste von Token auf, die von einem Lexer generiert werden. Wenn Sie die Tokensäule in Abbildung 3.2 betrachten, sehen wir Token wie if, else, comparison, id, number und literal; Dies sind Namen von Spielmarken. Bei einem Lexer/Parser ist ein Token normalerweise eine Struktur, die nicht nur den Namen des Tokens, sondern auch die Zeichen/Symbole, aus denen sich das Token zusammensetzt, sowie die Start- und Endposition der Zeichenkette, aus der das Token besteht, zusammen mit dem Zeichen enthalten Start- und Endposition für Fehlerberichterstattung, Hervorhebung usw. 

Nun übernimmt der Lexer die Eingabe von Zeichen/Symbolen und wandelt die eingegebenen Zeichen/Symbole nach den Regeln des Lexers in Token um. Nun haben Leute, die mit Lexer/Parser arbeiten, ihre eigenen Worte für Dinge, die sie häufig verwenden. Was Sie als eine Folge von Zeichen/Symbolen betrachten, aus denen sich ein Token zusammensetzt, nennen Personen, die Lexer/Parser verwenden, Lexem. Wenn Sie Lexem sehen, denken Sie nur an eine Folge von Zeichen/Symbolen, die ein Token darstellen. In dem Vergleichsbeispiel kann die Folge von Zeichen/Symbolen unterschiedliche Muster sein, wie beispielsweise < oder > oder else oder 3.14 usw.

Eine andere Möglichkeit, sich die Beziehung zwischen den beiden vorzustellen, besteht darin, dass ein Token eine Programmierstruktur ist, die vom Parser verwendet wird und über eine Eigenschaft namens Lexem verfügt, die die Zeichen/Symbole der Eingabe enthält. Wenn Sie nun die meisten Definitionen von Token im Code betrachten, sehen Sie Lexem möglicherweise nicht als eine der Eigenschaften des Tokens. Dies liegt daran, dass ein Token die Start- und Endposition der Zeichen/Symbole, die das Token und das Lexem darstellen, wahrscheinlicher enthält. Die Folge von Zeichen/Symbolen kann je nach Bedarf von der Start- und Endposition abgeleitet werden, da die Eingabe statisch ist.

97
Guy Coder

Wenn ein Quellenprogramm in den lexikalischen Analysator eingespeist wird, beginnt es damit, die Zeichen in Folgen von Lexemen aufzuteilen. Die Lexeme werden dann beim Bau von Tokens verwendet, bei denen die Lexeme in Tokens abgebildet werden. Eine Variable namens myVar würde einem Token zugeordnet werden, das angibt, <ich würde, "num">, wobei "num" auf die Position der Variablen in der Symboltabelle zeigen soll .

Kurz gesagt:

  • Lexeme sind die aus dem Zeicheneingabestrom abgeleiteten Wörter.
  • Tokens sind Lexeme, die einem Tokennamen und einem Attributwert zugeordnet sind.


Ein Beispiel enthält:
x = a + b * 2
Was ergibt die Lexeme: {x, =, a, +, b, *, 2}
Mit entsprechenden Token: {<ich würde, 0>, <=>, <ich würde, 1>, <+>, <ich würde, 2>, <*>, <ich würde, 3>}

29
William

a) Token sind symbolische Namen für die Entitäten, aus denen sich der Text des Programms zusammensetzt; z. if für das Schlüsselwort if und id für einen Bezeichner. Diese bilden die Ausgabe von Des lexikalischen Analysators . 5

(b) Ein Muster ist eine Regel, die angibt, wann eine Folge von Zeichen aus der Eingabe ein Token darstellt. z. B. die Folge i, f für das Token if und eine beliebige Folge von alphanumerischen Zeichen, beginnend mit einem Buchstaben für die Token-ID.

(c) Ein Lexem ist eine Folge von Zeichen aus der Eingabe, die mit einem Muster übereinstimmen (und somit eine Instanz eines Tokens bilden). Zum Beispiel, wenn das Muster mit if übereinstimmt und foo123bar mit dem Muster für die ID übereinstimmt.

6
shasmoe

LEXEM- Folge von Zeichen, die mit PATTERN übereinstimmen, die den TOKEN bilden

PATTERN- Die Regel, die ein TOKEN definiert

TOKEN- Die sinnvolle Sammlung von Zeichen über dem Zeichensatz der Programmiersprache ex: ID, Konstante, Schlüsselwörter, Operatoren, Interpunktion, Literalzeichenfolge 

5
sravan kumar

Token: Die Art für (Schlüsselwörter, Bezeichner, Interpunktionszeichen, Operatoren mit mehreren Zeichen) ist einfach ein Token.

Muster: Eine Regel zur Bildung von Token aus Eingabezeichen.

Lexeme: Dies ist eine Folge von Zeichen in SOURCE PROGRAM, die mit einem Muster für ein Token übereinstimmt. Im Grunde ist es ein Element von Token. 

4
mud1t

Sehen wir uns die Arbeitsweise eines lexikalischen Analysegeräts an (auch Scanner genannt)

Nehmen wir einen Beispielausdruck:

INPUT : cout << 3+2+3;

FORMATTING PERFORMED BY SCANNER :  {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;} 

aber nicht die tatsächliche Ausgabe.

SCANNER SIEHT EINFACH WIEDERHOLT NACH EINEM LEXEME IN SOURCE-PROGRAM TEXT BIS INPUT IS EXHAUSTED

Lexem ist eine Teilzeichenfolge von Eingaben, die eine gültige Zeichenfolge von Terminals bildet, die in der Grammatik vorhanden ist. Jedes Lexem folgt einem Muster, das am Ende erklärt wird (der Teil, den der Leser möglicherweise überspringt)

(Wichtige Regel ist, nach dem längsten möglichen Präfix zu suchen, das eine gültige Zeichenfolge von Terminals bildet, bis das nächste Leerzeichen auftritt ... siehe unten)

LEXEMES:

  1. cout
  2. <<

(obwohl "<" auch eine gültige Terminal-Zeichenfolge ist, wird in der oben genannten Regel das Muster für das Lexem "<<" ausgewählt, um das vom Scanner zurückgegebene Token zu generieren)

  1. 3
  2. +
  3. 2
  4. ;

TOKENS: Token werden nacheinander (vom Scanner auf Anforderung des Parsers) zurückgegeben, wenn der Scanner ein (gültiges) Lexem findet. Der Scanner erstellt, falls nicht bereits vorhanden, einen Symboltabelleneintrag (mit Attributen: hauptsächlich Token-Kategorie und einige andere, wenn er ein Lexem findet, um sein Token zu generieren

'#' bezeichnet einen Symboltabelleneintrag. Ich habe auf die Lexemnummer in der obigen Liste hingewiesen, um das Verständnis zu erleichtern, aber es sollte technisch der tatsächliche Index der Aufzeichnung in der Symboltabelle sein.

Die folgenden Token werden vom Scanner in der oben angegebenen Reihenfolge an den Parser zurückgegeben.

  1. <Bezeichner, Nr. 1>

  2. <Operator, # 2>

  3. <Literal, # 3>

  4. <Operator, # 4>

  5. <Literal, # 5>

  6. <Operator, # 4>

  7. <Literal, # 3>

  8. <Interpunktionszeichen, # 6>

Wie Sie den Unterschied sehen können, ist ein Token ein Paar im Gegensatz zu Lexem, das eine Teilzeichenfolge der Eingabe ist.

Und das erste Element des Paares ist Token-Klasse/Kategorie

Tokenklassen sind unten aufgeführt:

  • SCHLÜSSELWÖRTER
  • IDENTIFIKATOREN
  • LITERALIEN
  • PUNKTUATOREN
  • BETREIBER
  • Und noch etwas: Scanner erkennt Leerzeichen, ignoriert sie und bildet überhaupt kein Token für ein Leerzeichen. Nicht alle Begrenzer sind Leerzeichen. Ein Leerzeichen ist eine Form von Begrenzern, die von Scannern zu diesem Zweck verwendet wird. Tabulatoren, Newlines, Spaces und Escaped Characters werden in der Eingabe zusammen als Whitespace-Trennzeichen bezeichnet. Nur wenige andere Begrenzer sind ';' ',' ':' etc, die allgemein als Lexeme anerkannt sind, die Token bilden.

    Hier werden insgesamt 8 Token zurückgegeben, für Lexeme werden jedoch nur 6 Symboltabelleneinträge vorgenommen. Lexeme sind ebenfalls insgesamt 8 (siehe Definition von Lexem)

    --- Sie können diesen Teil überspringen

    A ***pattern*** is a rule ( say, a regular expression ) that is used to check if a string-of-terminals is valid or not.

    If a substring of input composed only of grammar terminals isfollowing the rule specified by any of the listed patterns , it isvalidated as a lexeme and selected pattern will identify the categoryof lexeme, else a lexical error is reported due to either (i) notfollowing any of the rules or (ii) input consists of a badterminal-character not present in grammar itself.

    for example :
    
    1. No Pattern Exists : In C++ , "99Id_Var" is grammar-supported string-of-terminals but is not recognised by any of patterns hence lexical error is reported .
    
    2. Bad Input Character : $,@,unicode characters may not be supported as a valid character in few programming languages.`
    
    3
    Mayank narula

    Lexeme - 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.

    Token - Token ist ein Paar, das aus einem Tokennamen und einem optionalen Tokenwert besteht. Der Token-Name ist eine Kategorie einer lexikalischen Einheit. Übliche Token-Namen sind

    • bezeichner: Namen, die der Programmierer wählt
    • schlüsselwörter: Namen bereits in der Programmiersprache
    • trennzeichen (auch als Interpunktionszeichen bezeichnet): Satzzeichen und Trennzeichen
    • operatoren: Symbole, die mit Argumenten arbeiten und Ergebnisse erzeugen
    • literale: numerische, logische, Text- und Referenzliterale

    Betrachten Sie diesen Ausdruck in der Programmiersprache C:

    summe = 3 + 2;

    Tokenized und durch die folgende Tabelle dargestellt:

     Lexeme        Token category
    ------------------------------
    sum      |    Identifier
     =       |    Assignment operator
     3       |    Integer literal
     +       |    Addition operator
     2       |    Integer literal
     ;       |    End of statement
    
    3
    Rajat Bhatt

    Token: Token ist eine Folge von Zeichen, die als eine einzige logische Entität behandelt werden kann. Typische Marken sind
    1) Identifikatoren
    2) Schlüsselwörter
    3) Betreiber
    4) Sonderzeichen
    5) Konstanten 

    Pattern: Eine Reihe von Strings in der Eingabe, für die das gleiche Token als Ausgabe erzeugt wird. Diese Zeichenfolge wird durch eine Regel beschrieben, die als Muster bezeichnet wird, das dem Token zugeordnet ist.
    Lexeme: Ein Lexem ist eine Folge von Zeichen im Quellprogramm, die mit dem Muster für ein Token übereinstimmt.

    3
    pradip

    Lexeme - Ein Lexem ist eine Zeichenfolge, die die syntaktische Einheit der niedrigsten Ebene in der Programmiersprache ist.

    Token - Das Token ist eine syntaktische Kategorie, die eine Klasse von Lexemen bildet. Dies bedeutet, zu welcher Klasse das Lexem gehört, ist es ein Schlüsselwort oder eine Kennung oder etwas anderes. Eine der Hauptaufgaben des lexikalischen Analysators besteht darin, ein Paar Lexeme und Token zu erstellen, dh alle Zeichen zu sammeln.

    Nehmen wir ein Beispiel: -

    if (y <= t) 

    y = y-3;

    Lexem-Token

    ob STICHWORT

    ( LINKE PARENTHESE

    y IDENTIFIZIERER

    <= VERGLEICH

    t IDENTIFIZIERER

    ) RECHTE PARENTHESE

    y IDENTIFIZIERER

    = ASSGNMENT 

    y IDENTIFIZIERER 

    _ ARITHMATISCH 

    3 GANZE ZAHL

    ; SEMIKOLON

    Beziehung zwischen Lexeme und Token

     Relation between lexeme and token

    2
    coding_ninza

    Lexem Von Lexemen wird gesagt, dass sie eine Folge von Zeichen (alphanumerisch) in einem Token sind.

    Token Ein Token ist eine Folge von Zeichen, die als eine einzige logische Entität identifiziert werden können. Typische Token sind Schlüsselwörter, Bezeichner, Konstanten, Zeichenfolgen, Satzzeichen und Operatoren. Zahlen.

    Pattern Ein Satz von Strings, der mit der Regel als Muster bezeichnet wird. Ein Muster erläutert, was ein Token sein kann, und diese Muster werden mithilfe von regulären Ausdrücken definiert, die mit dem Token verknüpft sind.

    0
    user10715886