1 /* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
2 * Use of this file is governed by the BSD 3-clause license that
3 * can be found in the LICENSE.txt file in the project root.
6 #include "dfa/DFASerializer.h"
7 #include "dfa/LexerDFASerializer.h"
8 #include "support/CPPUtils.h"
9 #include "atn/StarLoopEntryState.h"
10 #include "atn/ATNConfigSet.h"
14 using namespace antlr4;
15 using namespace antlr4::dfa;
16 using namespace antlrcpp;
18 DFA::DFA(atn::DecisionState *atnStartState) : DFA(atnStartState, 0) {
21 DFA::DFA(atn::DecisionState *atnStartState, size_t decision)
22 : atnStartState(atnStartState), s0(nullptr), decision(decision) {
24 _precedenceDfa = false;
25 if (is<atn::StarLoopEntryState *>(atnStartState)) {
26 if (static_cast<atn::StarLoopEntryState *>(atnStartState)->isPrecedenceDecision) {
27 _precedenceDfa = true;
28 s0 = new DFAState(std::unique_ptr<atn::ATNConfigSet>(new atn::ATNConfigSet()));
29 s0->isAcceptState = false;
30 s0->requiresFullContext = false;
35 DFA::DFA(DFA &&other) : atnStartState(other.atnStartState), decision(other.decision) {
36 // Source states are implicitly cleared by the move.
37 states = std::move(other.states);
39 other.atnStartState = nullptr;
43 _precedenceDfa = other._precedenceDfa;
44 other._precedenceDfa = false;
48 bool s0InList = (s0 == nullptr);
49 for (auto *state : states) {
59 bool DFA::isPrecedenceDfa() const {
60 return _precedenceDfa;
63 DFAState* DFA::getPrecedenceStartState(int precedence) const {
64 assert(_precedenceDfa); // Only precedence DFAs may contain a precedence start state.
66 auto iterator = s0->edges.find(precedence);
67 if (iterator == s0->edges.end())
70 return iterator->second;
73 void DFA::setPrecedenceStartState(int precedence, DFAState *startState, SingleWriteMultipleReadLock &lock) {
74 if (!isPrecedenceDfa()) {
75 throw IllegalStateException("Only precedence DFAs may contain a precedence start state.");
84 s0->edges[precedence] = startState;
89 std::vector<DFAState *> DFA::getStates() const {
90 std::vector<DFAState *> result;
91 for (auto *state : states)
92 result.push_back(state);
94 std::sort(result.begin(), result.end(), [](DFAState *o1, DFAState *o2) -> bool {
95 return o1->stateNumber < o2->stateNumber;
101 std::string DFA::toString(const std::vector<std::string> &tokenNames) {
105 DFASerializer serializer(this, tokenNames);
107 return serializer.toString();
110 std::string DFA::toString(const Vocabulary &vocabulary) const {
115 DFASerializer serializer(this, vocabulary);
116 return serializer.toString();
119 std::string DFA::toLexerString() {
123 LexerDFASerializer serializer(this);
125 return serializer.toString();