Signatur
Beschreibung
Parle\LexerException ist eine spezialisierte Ausnahme, die von der Parle-Erweiterung geworfen wird, wenn der Lexer (tokenisierende Komponente) auf einen Fehler stößt. Dies kann beispielsweise passieren, wenn eine ungültige Regel hinzugefügt wird, der Lexer nicht korrekt initialisiert wurde oder beim Tokenisieren eines Eingabe-Strings ein nicht erkennbares Token auftritt.
Sie erbt von \RuntimeException und lässt sich daher wie eine gewöhnliche PHP-Laufzeit-Ausnahme abfangen. Um Lexer-spezifische Fehler gezielt zu behandeln, sollte sie in einem eigenen catch-Block vor dem allgemeinen \RuntimeException-Block stehen.
Die Parle-Erweiterung stellt zwei separate Ausnahme-Typen bereit: Parle\LexerException für Fehler im Lexer und Parle\ParserException für Fehler im Parser. Durch diese Trennung lässt sich der Ursprung eines Fehlers (Tokenisierung vs. Syntaxanalyse) im Fehlerbehandlungs-Code klar unterscheiden.
Beispiele
Abfangen einer LexerException beim Hinzufügen einer ungültigen Regel
<?php
try {
$lexer = new Parle\Lexer();
// Versuche, einen ungültigen regulären Ausdruck als Regel hinzuzufügen
$lexer->push('[unclosed', Parle\Lexer::ICASE);
$lexer->build();
} catch (Parle\LexerException $e) {
echo 'Lexer-Fehler: ' . $e->getMessage() . PHP_EOL;
} catch (\RuntimeException $e) {
echo 'Allgemeiner Laufzeitfehler: ' . $e->getMessage() . PHP_EOL;
}
Unterscheidung von Lexer- und Parser-Ausnahmen
<?php
function tokenize(string $input): void {
$lexer = new Parle\RLexer();
$lexer->push('[0-9]+', 1);
$lexer->push('[a-z]+', 2);
$lexer->build();
$lexer->consume($input);
while (true) {
$lexer->advance();
$token = $lexer->getToken();
if ($token->id === Parle\RLexer::EOI) {
break;
}
echo 'Token ID: ' . $token->id . ', Wert: ' . $token->value . PHP_EOL;
}
}
try {
tokenize('123 abc');
} catch (Parle\LexerException $e) {
echo 'Lexer-Fehler aufgetreten: ' . $e->getMessage() . PHP_EOL;
} catch (Parle\ParserException $e) {
echo 'Parser-Fehler aufgetreten: ' . $e->getMessage() . PHP_EOL;
} catch (\Exception $e) {
echo 'Unbekannter Fehler: ' . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Erweiterung erforderlich: Parle\LexerException steht nur zur Verfügung, wenn die parle-Erweiterung installiert und in der php.ini aktiviert ist. Sie ist nicht Bestandteil der PHP-Standardinstallation.
Da die Klasse von \RuntimeException erbt, werden alle Standard-Methoden wie getMessage(), getCode(), getFile() und getTrace() unterstützt. Beim Aufbau eigener Fehlerbehandlung sollte Parle\LexerException immer vor allgemeineren Ausnahme-Typen abgefangen werden.