Signatur
Beschreibung
Parle\RLexer ist Teil der Parle-Erweiterung und stellt einen leistungsfähigen, zustandsbehafteten Lexer bereit. Im Gegensatz zu Parle\Lexer unterstützt RLexer mehrere Zustände (States), was komplexe Tokenisierungsaufgaben wie das Verarbeiten von verschachtelten oder zustandsabhängigen Grammatiken ermöglicht – z. B. bei Templates, Zeichenkettenliteralen mit Escape-Sequenzen oder mehrsprachigen Syntaxen.
Lexeme (Token-Definitionen) werden über reguläre Ausdrücke registriert. Nach der Registrierung aller Regeln muss build() aufgerufen werden, bevor der Lexer tatsächlich Eingaben verarbeitet. Die zu analysierende Zeichenkette wird per push() übergeben, anschließend kann mit advance() Token für Token iteriert werden.
Einsatzgebiet: Überall dort, wo ein kontextabhängiges Tokenisieren benötigt wird – also wenn bestimmte Token nur in bestimmten Zuständen erkannt werden sollen. Typische Beispiele sind Compiler-Frontends, Template-Engines, Parser für Konfigurationsformate oder DSLs.
Die Klasse arbeitet eng mit Parle\RParser zusammen, wenn vollständiges Parsing benötigt wird.
Beispiele
Einfache Tokenisierung mit einem Zustand
<?php
// Parle-Erweiterung muss installiert sein: pecl install parle
$lex = new Parle\RLexer();
// Token-IDs selbst vergeben
define('T_NUMBER', 1);
define('T_PLUS', 2);
define('T_SPACE', 3);
// Lexeme registrieren: regulärer Ausdruck => Token-ID
$lex->push('INITIAL', '\d+', T_NUMBER);
$lex->push('INITIAL', '\+', T_PLUS);
$lex->push('INITIAL', '\s+', T_SPACE);
// Lexer bauen – danach keine weiteren push()-Aufrufe möglich
$lex->build();
// Eingabe übergeben
$lex->push('42 + 7');
// Token für Token ausgeben
while (Parle\RLexer::ISTATE_INITIAL !== $lex->getToken()->id) {
$tok = $lex->getToken();
echo "Token-ID: {$tok->id}, Wert: '{$tok->value}'\n";
$lex->advance();
}
Mehrere Zustände: einfache String-Literal-Erkennung
<?php
$lex = new Parle\RLexer();
define('T_TEXT', 1);
define('T_QUOTE_OPEN', 2);
define('T_STR_INNER', 3);
define('T_QUOTE_CLOSE',4);
// Im Zustand INITIAL: normaler Text und öffnendes Anführungszeichen
$lex->push('INITIAL', '[^"]+', T_TEXT);
$lex->push('INITIAL', '"', T_QUOTE_OPEN);
// Beim Treffen auf " in INITIAL: in Zustand STRING wechseln
$lex->pushState('STRING');
// Im Zustand STRING: Inhalt und schließendes Anführungszeichen
$lex->push('STRING', '[^"]+', T_STR_INNER);
$lex->push('STRING', '"', T_QUOTE_CLOSE);
// Beim Treffen des schließenden " zurück zu INITIAL wechseln
// (Zustandswechsel wird über das Token-Handling in der Anwendungslogik gesteuert)
$lex->build();
$input = 'Hallo "Welt" Ende';
$lex->push($input);
$names = [
T_TEXT => 'TEXT',
T_QUOTE_OPEN => 'QUOTE_OPEN',
T_STR_INNER => 'STR_INNER',
T_QUOTE_CLOSE=> 'QUOTE_CLOSE',
];
echo "Eingabe: $input\n";
// Hinweis: Konkreter Zustandswechsel-Code hängt von der Parle-Version ab
// Dieses Beispiel zeigt die Konzept-Struktur der Zustandsdefinition
// Wichtig · Fallstricke
Voraussetzung: Die Parle-PECL-Erweiterung muss installiert sein (pecl install parle). Sie ist nicht in der Standard-PHP-Distribution enthalten.
- Build-Pflicht:
build()muss nach allenpush()-Aufrufen und vor dem erstenadvance()bzw.getToken()aufgerufen werden. Danach sind keine weiteren Regeländerungen möglich. - Unterschied zu
Parle\Lexer:Parle\Lexerkennt nur einen einzigen Zustand. Sobald mehrere Lexer-Zustände benötigt werden, istRLexerdie richtige Wahl. - API-Stabilität: Die Parle-Erweiterung befindet sich noch in aktiver Entwicklung; API-Details können sich zwischen PECL-Versionen ändern. Immer die offizielle Dokumentation zur installierten Version prüfen.
- Reguläre Ausdrücke: Parle verwendet eine eigene Regex-Engine (nicht PCRE). Nicht alle PCRE-Features sind verfügbar.