Start · Sprachen · PHP · Referenz · Parle\Token

Parle\Token

Klasse

Repräsentiert ein Token, wie es der <code>Parle</code>-Lexer nach der Tokenisierung zurückgibt.

seit PHP 0.5.0 Kategorie: misc

Signatur

class Parle\Token

Beschreibung

Parle\Token ist eine einfache Datenklasse, die ein einzelnes lexikalisches Token enthält, das vom Parle\Lexer oder Parle\RLexer nach dem Durchlauf über den Eingabestring erzeugt wird. Sie kapselt die Token-ID (Typ), den erkannten Textwert sowie ggf. Positionsinformationen.

Tokens sind das Ergebnis der Lexer-Phase beim Aufbau eines Parsers: Der Eingabetext wird in bedeutungstragende Einheiten (Token) zerlegt, bevor der Parser die grammatikalische Struktur analysiert. Parle\Token dient dabei als Träger dieser Einheiten und wird typischerweise über die Methode getToken() des Lexers abgerufen.

Die Klasse stellt öffentliche Eigenschaften bereit: id enthält die numerische Token-ID (entspricht dem beim Lexer registrierten Typ), value den tatsächlich erkannten Teilstring und offset die Position im Eingabetext. Diese Eigenschaften sind schreibgeschützt und werden intern vom Lexer gesetzt.

  • id – Numerische Token-ID (int); Parle\Token::EOI signalisiert das Ende der Eingabe.
  • value – Der erkannte Textwert (string) des Tokens.
  • offset – Byte-Offset (int) des Tokens im Eingabestring.

Beispiele

Einfache Tokenisierung einer arithmetischen Ausdrucks

<?php
$lexer = new Parle\Lexer();

// Token-Typen registrieren
$lexer->push("[0-9]+",  1); // Ganzzahl
$lexer->push("[+\-*/]", 2); // Operator
$lexer->push("[ \t]+",  3); // Whitespace

$lexer->build();
$lexer->consume("42 + 7");

do {
    $lexer->advance();
    $tok = $lexer->getToken();
    if ($tok->id === Parle\Token::EOI) {
        break;
    }
    printf("ID: %d  Wert: '%s'  Offset: %d\n", $tok->id, $tok->value, $tok->offset);
} while (true);
ID: 1 Wert: '42' Offset: 0 ID: 3 Wert: ' ' Offset: 2 ID: 2 Wert: '+' Offset: 3 ID: 3 Wert: ' ' Offset: 4 ID: 1 Wert: '7' Offset: 5

Token-ID EOI prüfen und unbekannte Token erkennen

<?php
$lexer = new Parle\Lexer();
$lexer->push("[a-zA-Z_][a-zA-Z0-9_]*", 1); // Bezeichner
$lexer->push("[0-9]+",                    2); // Zahl
$lexer->build();
$lexer->consume("foo 123 !");

do {
    $lexer->advance();
    $tok = $lexer->getToken();

    if ($tok->id === Parle\Token::EOI) {
        echo "Ende der Eingabe.\n";
        break;
    }

    if ($tok->id === Parle\Token::UNKNOWN) {
        echo "Unbekanntes Token: '{$tok->value}' an Position {$tok->offset}\n";
        continue;
    }

    echo "Token #{$tok->id}: '{$tok->value}'\n";
} while (true);
Token #1: 'foo' Token #2: '123' Unbekanntes Token: '!' an Position 8 Ende der Eingabe.

// Wichtig · Fallstricke

Klassenkonstanten: Parle\Token::EOI (End of Input, ID 0) und Parle\Token::UNKNOWN (nicht erkanntes Token) sind wichtige Sentinel-Werte, die im Tokenisierungsloop abgefragt werden sollten, um Endlos-Schleifen und unerwartetes Verhalten zu vermeiden.

Die Eigenschaften id, value und offset werden ausschließlich intern durch die Lexer-Implementierung befüllt. Eigene Instanzen von Parle\Token zu erzeugen ist möglich, aber in der Praxis ohne Nutzen, da der Lexer eigene Token-Objekte zurückgibt.

Die Parle-Erweiterung ist eine PECL-Extension und muss separat installiert werden (pecl install parle). Sie basiert auf der C++-Bibliothek Ben Hanson's Lexertl/Parsertl und ist für den Einsatz in Performance-kritischen Parsing-Szenarien gedacht.