xref: /template/strap/vendor/antlr/antlr4-php-runtime/src/Atn/Transitions/Transition.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
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