Signatur
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::EOIsignalisiert 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);
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);
// 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.