77 lines
2.3 KiB
C++
77 lines
2.3 KiB
C++
/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
|
|
* Use of this file is governed by the BSD 3-clause license that
|
|
* can be found in the LICENSE.txt file in the project root.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "misc/IntervalSet.h"
|
|
|
|
namespace antlr4 {
|
|
namespace atn {
|
|
|
|
/// <summary>
|
|
/// An ATN transition between any two ATN states. Subclasses define
|
|
/// atom, set, epsilon, action, predicate, rule transitions.
|
|
/// <p/>
|
|
/// This is a one way link. It emanates from a state (usually via a list of
|
|
/// transitions) and has a target state.
|
|
/// <p/>
|
|
/// Since we never have to change the ATN transitions once we construct it,
|
|
/// we can fix these transitions as specific classes. The DFA transitions
|
|
/// on the other hand need to update the labels as it adds transitions to
|
|
/// the states. We'll use the term Edge for the DFA to distinguish them from
|
|
/// ATN transitions.
|
|
/// </summary>
|
|
class ANTLR4CPP_PUBLIC Transition {
|
|
public:
|
|
// constants for serialization
|
|
enum SerializationType {
|
|
EPSILON = 1,
|
|
RANGE = 2,
|
|
RULE = 3,
|
|
PREDICATE = 4, // e.g., {isType(input.LT(1))}?
|
|
ATOM = 5,
|
|
ACTION = 6,
|
|
SET = 7, // ~(A|B) or ~atom, wildcard, which convert to next 2
|
|
NOT_SET = 8,
|
|
WILDCARD = 9,
|
|
PRECEDENCE = 10,
|
|
};
|
|
|
|
static const std::vector<std::string> serializationNames;
|
|
|
|
/// The target of this transition.
|
|
// ml: this is a reference into the ATN.
|
|
ATNState *target;
|
|
|
|
virtual ~Transition();
|
|
|
|
protected:
|
|
Transition(ATNState *target);
|
|
|
|
public:
|
|
virtual SerializationType getSerializationType() const = 0;
|
|
|
|
/**
|
|
* Determines if the transition is an "epsilon" transition.
|
|
*
|
|
* <p>The default implementation returns {@code false}.</p>
|
|
*
|
|
* @return {@code true} if traversing this transition in the ATN does not
|
|
* consume an input symbol; otherwise, {@code false} if traversing this
|
|
* transition consumes (matches) an input symbol.
|
|
*/
|
|
virtual bool isEpsilon() const;
|
|
virtual misc::IntervalSet label() const;
|
|
virtual bool matches(size_t symbol, size_t minVocabSymbol, size_t maxVocabSymbol) const = 0;
|
|
|
|
virtual std::string toString() const;
|
|
|
|
Transition(Transition const&) = delete;
|
|
Transition& operator=(Transition const&) = delete;
|
|
};
|
|
|
|
} // namespace atn
|
|
} // namespace antlr4
|