xref: /plugin/combo/vendor/antlr/antlr4-php-runtime/src/Error/Exceptions/FailedPredicateException.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeaudeclare(strict_types=1);
4*37748cd8SNickeau
5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\Error\Exceptions;
6*37748cd8SNickeau
7*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Atn\Transitions\PredicateTransition;
8*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Parser;
9*37748cd8SNickeau
10*37748cd8SNickeau/**
11*37748cd8SNickeau * A semantic predicate failed during validation. Validation of predicates
12*37748cd8SNickeau * occurs when normally parsing the alternative just like matching a token.
13*37748cd8SNickeau * Disambiguating predicate evaluation occurs when we test a predicate during
14*37748cd8SNickeau * prediction.
15*37748cd8SNickeau */
16*37748cd8SNickeauclass FailedPredicateException extends RecognitionException
17*37748cd8SNickeau{
18*37748cd8SNickeau    /** @var int */
19*37748cd8SNickeau    private $ruleIndex;
20*37748cd8SNickeau
21*37748cd8SNickeau    /** @var int */
22*37748cd8SNickeau    private $predicateIndex;
23*37748cd8SNickeau
24*37748cd8SNickeau    /** @var string|null */
25*37748cd8SNickeau    private $predicate;
26*37748cd8SNickeau
27*37748cd8SNickeau    public function __construct(Parser $recognizer, string $predicate, ?string $message = null)
28*37748cd8SNickeau    {
29*37748cd8SNickeau        parent::__construct(
30*37748cd8SNickeau            $recognizer,
31*37748cd8SNickeau            $recognizer->getInputStream(),
32*37748cd8SNickeau            $recognizer->getContext(),
33*37748cd8SNickeau            $this->formatMessage($predicate, $message)
34*37748cd8SNickeau        );
35*37748cd8SNickeau
36*37748cd8SNickeau        $interpreter = $recognizer->getInterpreter();
37*37748cd8SNickeau
38*37748cd8SNickeau        if ($interpreter === null) {
39*37748cd8SNickeau            throw new \RuntimeException('Unexpected null interpreter.');
40*37748cd8SNickeau        }
41*37748cd8SNickeau
42*37748cd8SNickeau        $s = $interpreter->atn->states[$recognizer->getState()];
43*37748cd8SNickeau
44*37748cd8SNickeau        $trans = $s->getTransition(0);
45*37748cd8SNickeau
46*37748cd8SNickeau        if ($trans instanceof PredicateTransition) {
47*37748cd8SNickeau            $this->ruleIndex = $trans->ruleIndex;
48*37748cd8SNickeau            $this->predicateIndex = $trans->predIndex;
49*37748cd8SNickeau        } else {
50*37748cd8SNickeau            $this->ruleIndex = 0;
51*37748cd8SNickeau            $this->predicateIndex = 0;
52*37748cd8SNickeau        }
53*37748cd8SNickeau
54*37748cd8SNickeau        $this->predicate = $predicate;
55*37748cd8SNickeau        $this->setOffendingToken($recognizer->getCurrentToken());
56*37748cd8SNickeau    }
57*37748cd8SNickeau
58*37748cd8SNickeau    public function getRuleIndex() : int
59*37748cd8SNickeau    {
60*37748cd8SNickeau        return $this->ruleIndex;
61*37748cd8SNickeau    }
62*37748cd8SNickeau
63*37748cd8SNickeau    public function getPredicateIndex() : int
64*37748cd8SNickeau    {
65*37748cd8SNickeau        return $this->predicateIndex;
66*37748cd8SNickeau    }
67*37748cd8SNickeau
68*37748cd8SNickeau    public function getPredicate() : ?string
69*37748cd8SNickeau    {
70*37748cd8SNickeau        return $this->predicate;
71*37748cd8SNickeau    }
72*37748cd8SNickeau
73*37748cd8SNickeau    public function formatMessage(string $predicate, ?string $message = null) : string
74*37748cd8SNickeau    {
75*37748cd8SNickeau        if ($message !== null) {
76*37748cd8SNickeau            return $message;
77*37748cd8SNickeau        }
78*37748cd8SNickeau
79*37748cd8SNickeau        return 'failed predicate: {' . $predicate . '}?';
80*37748cd8SNickeau    }
81*37748cd8SNickeau}
82