Start · Sprachen · PHP · Referenz · Parle\LexerException

Parle\LexerException

Klasse

Ausnahme, die bei Lexer-Fehlern der Parle-Erweiterung ausgelöst wird.

Kategorie: error

Signatur

class Parle\LexerException extends \RuntimeException

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;
}
Lexer-Fehler: ...

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;
}
Token ID: 1, Wert: 123 Token ID: 2, Wert: abc

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