Start · Sprachen · PHP · Referenz · Parle\ParserException

Parle\ParserException

Klasse

Ausnahme, die bei Parser-Fehlern der <code>Parle</code>-Erweiterung ausgelöst wird.

Kategorie: error

Signatur

class Parle\ParserException extends RuntimeException

Beschreibung

Parle\ParserException ist die spezifische Ausnahme-Klasse der Parle-Erweiterung, die bei Fehlern während des Parsens ausgelöst wird. Sie erweitert die Standard-PHP-Klasse RuntimeException und wird geworfen, wenn der Parser auf ungültige Zustände trifft, z. B. bei fehlerhaft definierten Grammatikregeln oder beim Parsen von syntaktisch ungültigem Eingabematerial.

Typische Situationen, in denen diese Ausnahme auftritt, sind: Verwenden eines noch nicht finalisierten Parsers, Konflikte in der angegebenen Grammatik (Shift-Reduce- oder Reduce-Reduce-Konflikte), oder der Versuch, Aktionen auf einem Parser auszuführen, der sich in einem Fehlerzustand befindet.

Da Parle\ParserException von RuntimeException erbt, können alle üblichen Methoden wie getMessage(), getCode(), getFile() und getTrace() genutzt werden, um Fehlerdetails abzufragen. Es empfiehlt sich, Parle-Parser-Code stets in einem try/catch-Block zu kapseln, um robuste Fehlerbehandlung zu gewährleisten.

Beispiele

Abfangen einer ParserException bei ungültigem Parser-Zustand

<?php
use Parle\Parser;
use Parle\ParserException;
use Parle\Lexer;

try {
    $parser = new Parser();
    // Grammatikregel hinzufügen
    $parser->token('T_NUM');
    $parser->push('start', 'T_NUM');
    // Parser ohne build() zu verwenden führt zu einer Exception
    $lexer = new Lexer();
    $lexer->push('[0-9]+', 1);
    $lexer->build();
    // Parser muss vor Verwendung gebaut werden
    $parser->build();
    $parser->consume('42', $lexer);
    while (Parser::ACTION_ERROR !== ($action = $parser->action())) {
        switch ($action) {
            case Parser::ACTION_SHIFT:
                $parser->advance();
                break;
            case Parser::ACTION_REDUCE:
                $parser->advance();
                break;
            case Parser::ACTION_ACCEPT:
                echo 'Eingabe erfolgreich geparst.' . PHP_EOL;
                break 2;
        }
    }
    if (Parser::ACTION_ERROR === $action) {
        throw new ParserException('Fehler beim Parsen der Eingabe.');
    }
} catch (ParserException $e) {
    echo 'Parser-Fehler: ' . $e->getMessage() . PHP_EOL;
} catch (RuntimeException $e) {
    echo 'Laufzeitfehler: ' . $e->getMessage() . PHP_EOL;
}
Eingabe erfolgreich geparst.

Unterscheiden zwischen ParserException und allgemeiner RuntimeException

<?php
use Parle\ParserException;

function parseInput(string $input): void {
    // Simulierter Aufruf, der eine ParserException auslösen kann
    if ($input === '') {
        throw new ParserException('Leere Eingabe ist nicht erlaubt.', 100);
    }
    // ... weiterer Parser-Code
}

try {
    parseInput('');
} catch (ParserException $e) {
    // Spezifisch auf Parle-Parser-Fehler reagieren
    echo sprintf(
        'Parle-Parser-Fehler [%d]: %s in %s (Zeile %d)%s',
        $e->getCode(),
        $e->getMessage(),
        $e->getFile(),
        $e->getLine(),
        PHP_EOL
    );
} catch (\RuntimeException $e) {
    echo 'Allgemeiner Laufzeitfehler: ' . $e->getMessage() . PHP_EOL;
}
Parle-Parser-Fehler [100]: Leere Eingabe ist nicht erlaubt. in /pfad/zur/datei.php (Zeile 8)

// Wichtig · Fallstricke

Wichtig: Die Parle-Erweiterung ist eine PECL-Erweiterung und muss separat installiert werden. Sie ist standardmäßig nicht in PHP enthalten. Stellen Sie sicher, dass die Erweiterung korrekt installiert und in der php.ini aktiviert ist, bevor Sie Parle\ParserException verwenden.

Da Parle\ParserException von RuntimeException erbt, wird sie auch von catch (\RuntimeException $e)-Blöcken abgefangen. Für eine präzise Fehlerbehandlung sollte der spezifischere catch (Parle\ParserException $e)-Block immer vor dem allgemeinen RuntimeException-Block stehen.