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