xref: /template/strap/vendor/antlr/antlr4-php-runtime/src/Atn/States/ATNState.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeaudeclare(strict_types=1);
4*37748cd8SNickeau
5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\Atn\States;
6*37748cd8SNickeau
7*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Atn\ATN;
8*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Atn\Transitions\Transition;
9*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Comparison\Hashable;
10*37748cd8SNickeauuse Antlr\Antlr4\Runtime\IntervalSet;
11*37748cd8SNickeau
12*37748cd8SNickeauabstract class ATNState implements Hashable
13*37748cd8SNickeau{
14*37748cd8SNickeau    public const INVALID_TYPE = 0;
15*37748cd8SNickeau    public const BASIC = 1;
16*37748cd8SNickeau    public const RULE_START = 2;
17*37748cd8SNickeau    public const BLOCK_START = 3;
18*37748cd8SNickeau    public const PLUS_BLOCK_START = 4;
19*37748cd8SNickeau    public const STAR_BLOCK_START = 5;
20*37748cd8SNickeau    public const TOKEN_START = 6;
21*37748cd8SNickeau    public const RULE_STOP = 7;
22*37748cd8SNickeau    public const BLOCK_END = 8;
23*37748cd8SNickeau    public const STAR_LOOP_BACK = 9;
24*37748cd8SNickeau    public const STAR_LOOP_ENTRY = 10;
25*37748cd8SNickeau    public const PLUS_LOOP_BACK = 11;
26*37748cd8SNickeau    public const LOOP_END = 12;
27*37748cd8SNickeau
28*37748cd8SNickeau    public const SERIALIZATION_NAMES = [
29*37748cd8SNickeau        'INVALID',
30*37748cd8SNickeau        'BASIC',
31*37748cd8SNickeau        'RULE_START',
32*37748cd8SNickeau        'BLOCK_START',
33*37748cd8SNickeau        'PLUS_BLOCK_START',
34*37748cd8SNickeau        'STAR_BLOCK_START',
35*37748cd8SNickeau        'TOKEN_START',
36*37748cd8SNickeau        'RULE_STOP',
37*37748cd8SNickeau        'BLOCK_END',
38*37748cd8SNickeau        'STAR_LOOP_BACK',
39*37748cd8SNickeau        'STAR_LOOP_ENTRY',
40*37748cd8SNickeau        'PLUS_LOOP_BACK',
41*37748cd8SNickeau        'LOOP_END',
42*37748cd8SNickeau    ];
43*37748cd8SNickeau
44*37748cd8SNickeau    public const INVALID_STATE_NUMBER = -1;
45*37748cd8SNickeau
46*37748cd8SNickeau    /**
47*37748cd8SNickeau     * Which ATN are we in?
48*37748cd8SNickeau     *
49*37748cd8SNickeau     * @var ATN|null
50*37748cd8SNickeau     */
51*37748cd8SNickeau    public $atn;
52*37748cd8SNickeau
53*37748cd8SNickeau    /** @var int */
54*37748cd8SNickeau    public $stateNumber = self::INVALID_STATE_NUMBER;
55*37748cd8SNickeau
56*37748cd8SNickeau    /**
57*37748cd8SNickeau     * Initially, at runtime, we don't have Rule objects.
58*37748cd8SNickeau     *
59*37748cd8SNickeau     * @var int
60*37748cd8SNickeau     */
61*37748cd8SNickeau    public $ruleIndex = 0;
62*37748cd8SNickeau
63*37748cd8SNickeau    /** @var bool */
64*37748cd8SNickeau    public $epsilonOnlyTransitions = false;
65*37748cd8SNickeau
66*37748cd8SNickeau    /**
67*37748cd8SNickeau     * Track the transitions emanating from this ATN state.
68*37748cd8SNickeau     *
69*37748cd8SNickeau     * @var array<Transition>
70*37748cd8SNickeau     */
71*37748cd8SNickeau    protected $transitions = [];
72*37748cd8SNickeau
73*37748cd8SNickeau    /**
74*37748cd8SNickeau     * Used to cache lookahead during parsing, not used during construction.
75*37748cd8SNickeau     *
76*37748cd8SNickeau     * @var IntervalSet|null
77*37748cd8SNickeau     */
78*37748cd8SNickeau    public $nextTokenWithinRule;
79*37748cd8SNickeau
80*37748cd8SNickeau    public function equals(object $other) : bool
81*37748cd8SNickeau    {
82*37748cd8SNickeau        if ($this === $other) {
83*37748cd8SNickeau            return true;
84*37748cd8SNickeau        }
85*37748cd8SNickeau
86*37748cd8SNickeau        return $other instanceof static
87*37748cd8SNickeau            && $this->stateNumber === $other->stateNumber;
88*37748cd8SNickeau    }
89*37748cd8SNickeau
90*37748cd8SNickeau    public function isNonGreedyExitState() : bool
91*37748cd8SNickeau    {
92*37748cd8SNickeau        return false;
93*37748cd8SNickeau    }
94*37748cd8SNickeau
95*37748cd8SNickeau    /**
96*37748cd8SNickeau     * @return array<Transition>
97*37748cd8SNickeau     */
98*37748cd8SNickeau    public function getTransitions() : array
99*37748cd8SNickeau    {
100*37748cd8SNickeau        return $this->transitions;
101*37748cd8SNickeau    }
102*37748cd8SNickeau
103*37748cd8SNickeau    public function getNumberOfTransitions() : int
104*37748cd8SNickeau    {
105*37748cd8SNickeau        return \count($this->transitions);
106*37748cd8SNickeau    }
107*37748cd8SNickeau
108*37748cd8SNickeau    public function addTransition(Transition $trans, int $index = -1) : void
109*37748cd8SNickeau    {
110*37748cd8SNickeau        if (\count($this->transitions) === 0) {
111*37748cd8SNickeau            $this->epsilonOnlyTransitions = $trans->isEpsilon();
112*37748cd8SNickeau        } elseif ($this->epsilonOnlyTransitions !== $trans->isEpsilon()) {
113*37748cd8SNickeau            $this->epsilonOnlyTransitions = false;
114*37748cd8SNickeau        }
115*37748cd8SNickeau
116*37748cd8SNickeau        if ($index === -1) {
117*37748cd8SNickeau            $this->transitions[] = $trans;
118*37748cd8SNickeau        } else {
119*37748cd8SNickeau            \array_splice($this->transitions, $index, 1, [$trans]);
120*37748cd8SNickeau        }
121*37748cd8SNickeau    }
122*37748cd8SNickeau
123*37748cd8SNickeau    public function getTransition(int $index) : Transition
124*37748cd8SNickeau    {
125*37748cd8SNickeau        return $this->transitions[$index];
126*37748cd8SNickeau    }
127*37748cd8SNickeau
128*37748cd8SNickeau    public function setTransition(Transition $trans, int $index) : void
129*37748cd8SNickeau    {
130*37748cd8SNickeau        $this->transitions[$index] = $trans;
131*37748cd8SNickeau    }
132*37748cd8SNickeau
133*37748cd8SNickeau    /**
134*37748cd8SNickeau     * @param array<Transition> $transitions
135*37748cd8SNickeau     */
136*37748cd8SNickeau    public function setTransitions(array $transitions) : void
137*37748cd8SNickeau    {
138*37748cd8SNickeau        $this->transitions = $transitions;
139*37748cd8SNickeau    }
140*37748cd8SNickeau
141*37748cd8SNickeau    public function removeTransition(int $index) : void
142*37748cd8SNickeau    {
143*37748cd8SNickeau        \array_splice($this->transitions, $index, 1);
144*37748cd8SNickeau    }
145*37748cd8SNickeau
146*37748cd8SNickeau    public function onlyHasEpsilonTransitions() : bool
147*37748cd8SNickeau    {
148*37748cd8SNickeau        return $this->epsilonOnlyTransitions;
149*37748cd8SNickeau    }
150*37748cd8SNickeau
151*37748cd8SNickeau    public function setRuleIndex(int $ruleIndex) : void
152*37748cd8SNickeau    {
153*37748cd8SNickeau        $this->ruleIndex = $ruleIndex;
154*37748cd8SNickeau    }
155*37748cd8SNickeau
156*37748cd8SNickeau    public function __toString() : string
157*37748cd8SNickeau    {
158*37748cd8SNickeau        return (string) $this->stateNumber;
159*37748cd8SNickeau    }
160*37748cd8SNickeau
161*37748cd8SNickeau    public function hashCode() : int
162*37748cd8SNickeau    {
163*37748cd8SNickeau        return $this->getStateType();
164*37748cd8SNickeau    }
165*37748cd8SNickeau
166*37748cd8SNickeau    abstract public function getStateType() : int;
167*37748cd8SNickeau}
168