xref: /plugin/combo/vendor/antlr/antlr4-php-runtime/src/Atn/LexerATNConfig.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
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