1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeaudeclare(strict_types=1); 4*37748cd8SNickeau 5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\Atn; 6*37748cd8SNickeau 7*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Atn\States\ATNState; 8*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Atn\States\DecisionState; 9*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Comparison\Equality; 10*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Comparison\Hasher; 11*37748cd8SNickeauuse Antlr\Antlr4\Runtime\PredictionContexts\PredictionContext; 12*37748cd8SNickeau 13*37748cd8SNickeaufinal class LexerATNConfig extends ATNConfig 14*37748cd8SNickeau{ 15*37748cd8SNickeau /** @var LexerActionExecutor|null */ 16*37748cd8SNickeau private $lexerActionExecutor; 17*37748cd8SNickeau 18*37748cd8SNickeau /** @var bool */ 19*37748cd8SNickeau private $passedThroughNonGreedyDecision; 20*37748cd8SNickeau 21*37748cd8SNickeau public function __construct( 22*37748cd8SNickeau ?self $oldConfig, 23*37748cd8SNickeau ?ATNState $state, 24*37748cd8SNickeau ?PredictionContext $context = null, 25*37748cd8SNickeau ?LexerActionExecutor $executor = null, 26*37748cd8SNickeau ?int $alt = null 27*37748cd8SNickeau ) { 28*37748cd8SNickeau parent::__construct($oldConfig, $state, $context, null, $alt); 29*37748cd8SNickeau 30*37748cd8SNickeau $this->lexerActionExecutor = $executor ?? ($oldConfig->lexerActionExecutor ?? null); 31*37748cd8SNickeau $this->passedThroughNonGreedyDecision = $oldConfig ? 32*37748cd8SNickeau self::checkNonGreedyDecision($oldConfig, $this->state) : 33*37748cd8SNickeau false; 34*37748cd8SNickeau } 35*37748cd8SNickeau 36*37748cd8SNickeau public function getLexerActionExecutor() : ?LexerActionExecutor 37*37748cd8SNickeau { 38*37748cd8SNickeau return $this->lexerActionExecutor; 39*37748cd8SNickeau } 40*37748cd8SNickeau 41*37748cd8SNickeau public function isPassedThroughNonGreedyDecision() : bool 42*37748cd8SNickeau { 43*37748cd8SNickeau return $this->passedThroughNonGreedyDecision; 44*37748cd8SNickeau } 45*37748cd8SNickeau 46*37748cd8SNickeau public function hashCode() : int 47*37748cd8SNickeau { 48*37748cd8SNickeau return Hasher::hash( 49*37748cd8SNickeau $this->state->stateNumber, 50*37748cd8SNickeau $this->alt, 51*37748cd8SNickeau $this->context, 52*37748cd8SNickeau $this->semanticContext, 53*37748cd8SNickeau $this->passedThroughNonGreedyDecision, 54*37748cd8SNickeau $this->lexerActionExecutor 55*37748cd8SNickeau ); 56*37748cd8SNickeau } 57*37748cd8SNickeau 58*37748cd8SNickeau public function equals(object $other) : bool 59*37748cd8SNickeau { 60*37748cd8SNickeau if ($this === $other) { 61*37748cd8SNickeau return true; 62*37748cd8SNickeau } 63*37748cd8SNickeau 64*37748cd8SNickeau if (!$other instanceof self) { 65*37748cd8SNickeau return false; 66*37748cd8SNickeau } 67*37748cd8SNickeau 68*37748cd8SNickeau if (!parent::equals($other)) { 69*37748cd8SNickeau return false; 70*37748cd8SNickeau } 71*37748cd8SNickeau 72*37748cd8SNickeau if ($this->passedThroughNonGreedyDecision !== $other->passedThroughNonGreedyDecision) { 73*37748cd8SNickeau return false; 74*37748cd8SNickeau } 75*37748cd8SNickeau 76*37748cd8SNickeau return Equality::equals($this->lexerActionExecutor, $other->lexerActionExecutor); 77*37748cd8SNickeau } 78*37748cd8SNickeau 79*37748cd8SNickeau private static function checkNonGreedyDecision(LexerATNConfig $source, ATNState $target) : bool 80*37748cd8SNickeau { 81*37748cd8SNickeau return $source->passedThroughNonGreedyDecision || ($target instanceof DecisionState && $target->nonGreedy); 82*37748cd8SNickeau } 83*37748cd8SNickeau} 84