1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeaudeclare(strict_types=1); 4*37748cd8SNickeau 5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\Atn\Transitions; 6*37748cd8SNickeau 7*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Atn\States\ATNState; 8*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Comparison\Equatable; 9*37748cd8SNickeauuse Antlr\Antlr4\Runtime\IntervalSet; 10*37748cd8SNickeau 11*37748cd8SNickeau/** 12*37748cd8SNickeau * An ATN transition between any two ATN states. Subclasses define atom, set, 13*37748cd8SNickeau * epsilon, action, predicate, rule transitions. 14*37748cd8SNickeau * 15*37748cd8SNickeau * This is a one way link. It emanates from a state (usually via a list of 16*37748cd8SNickeau * transitions) and has a target state. 17*37748cd8SNickeau * 18*37748cd8SNickeau * Since we never have to change the ATN transitions once we construct it, 19*37748cd8SNickeau * we can fix these transitions as specific classes. The DFA transitions 20*37748cd8SNickeau * on the other hand need to update the labels as it adds transitions to 21*37748cd8SNickeau * the states. We'll use the term Edge for the DFA to distinguish them from 22*37748cd8SNickeau * ATN transitions. 23*37748cd8SNickeau */ 24*37748cd8SNickeauabstract class Transition implements Equatable 25*37748cd8SNickeau{ 26*37748cd8SNickeau public const EPSILON = 1; 27*37748cd8SNickeau public const RANGE = 2; 28*37748cd8SNickeau public const RULE = 3; 29*37748cd8SNickeau public const PREDICATE = 4; 30*37748cd8SNickeau public const ATOM = 5; 31*37748cd8SNickeau public const ACTION = 6; 32*37748cd8SNickeau public const SET = 7; 33*37748cd8SNickeau public const NOT_SET = 8; 34*37748cd8SNickeau public const WILDCARD = 9; 35*37748cd8SNickeau public const PRECEDENCE = 10; 36*37748cd8SNickeau 37*37748cd8SNickeau /** 38*37748cd8SNickeau * The target of this transition. 39*37748cd8SNickeau * 40*37748cd8SNickeau * @var ATNState 41*37748cd8SNickeau */ 42*37748cd8SNickeau public $target; 43*37748cd8SNickeau 44*37748cd8SNickeau public function __construct(ATNState $target) 45*37748cd8SNickeau { 46*37748cd8SNickeau $this->target = $target; 47*37748cd8SNickeau } 48*37748cd8SNickeau 49*37748cd8SNickeau /** 50*37748cd8SNickeau * Determines if the transition is an "epsilon" transition. The default 51*37748cd8SNickeau * implementation returns `false`. 52*37748cd8SNickeau * 53*37748cd8SNickeau * @return bool `true` if traversing this transition in the ATN does not 54*37748cd8SNickeau * consume an input symbol; otherwise, `false` if traversing 55*37748cd8SNickeau * this transition consumes (matches) an input symbol. 56*37748cd8SNickeau */ 57*37748cd8SNickeau public function isEpsilon() : bool 58*37748cd8SNickeau { 59*37748cd8SNickeau return false; 60*37748cd8SNickeau } 61*37748cd8SNickeau 62*37748cd8SNickeau public function label() : ?IntervalSet 63*37748cd8SNickeau { 64*37748cd8SNickeau return null; 65*37748cd8SNickeau } 66*37748cd8SNickeau 67*37748cd8SNickeau abstract public function getSerializationType() : int; 68*37748cd8SNickeau abstract public function matches(int $symbol, int $minVocabSymbol, int $maxVocabSymbol) : bool; 69*37748cd8SNickeau abstract public function __toString() : string; 70*37748cd8SNickeau} 71