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