| /* 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. |
| */ |
| |
| #include "atn/ATNConfigSet.h" |
| #include "atn/SemanticContext.h" |
| #include "atn/ATNConfig.h" |
| #include "misc/MurmurHash.h" |
| |
| #include "dfa/DFAState.h" |
| |
| using namespace antlr4::dfa; |
| using namespace antlr4::atn; |
| |
| DFAState::PredPrediction::PredPrediction(const Ref<SemanticContext> &pred, int alt) : pred(pred) { |
| InitializeInstanceFields(); |
| this->alt = alt; |
| } |
| |
| DFAState::PredPrediction::~PredPrediction() { |
| } |
| |
| std::string DFAState::PredPrediction::toString() { |
| return std::string("(") + pred->toString() + ", " + std::to_string(alt) + ")"; |
| } |
| |
| void DFAState::PredPrediction::InitializeInstanceFields() { |
| alt = 0; |
| } |
| |
| DFAState::DFAState() { |
| InitializeInstanceFields(); |
| } |
| |
| DFAState::DFAState(int state) : DFAState() { |
| stateNumber = state; |
| } |
| |
| DFAState::DFAState(std::unique_ptr<ATNConfigSet> configs_) : DFAState() { |
| configs = std::move(configs_); |
| } |
| |
| DFAState::~DFAState() { |
| for (auto *predicate : predicates) { |
| delete predicate; |
| } |
| } |
| |
| std::set<size_t> DFAState::getAltSet() { |
| std::set<size_t> alts; |
| if (configs != nullptr) { |
| for (size_t i = 0; i < configs->size(); i++) { |
| alts.insert(configs->get(i)->alt); |
| } |
| } |
| return alts; |
| } |
| |
| size_t DFAState::hashCode() const { |
| size_t hash = misc::MurmurHash::initialize(7); |
| hash = misc::MurmurHash::update(hash, configs->hashCode()); |
| hash = misc::MurmurHash::finish(hash, 1); |
| return hash; |
| } |
| |
| bool DFAState::operator == (const DFAState &o) const { |
| // compare set of ATN configurations in this set with other |
| if (this == &o) { |
| return true; |
| } |
| |
| return *configs == *o.configs; |
| } |
| |
| std::string DFAState::toString() { |
| std::stringstream ss; |
| ss << stateNumber; |
| if (configs) { |
| ss << ":" << configs->toString(); |
| } |
| if (isAcceptState) { |
| ss << " => "; |
| if (!predicates.empty()) { |
| for (size_t i = 0; i < predicates.size(); i++) { |
| ss << predicates[i]->toString(); |
| } |
| } else { |
| ss << prediction; |
| } |
| } |
| return ss.str(); |
| } |
| |
| void DFAState::InitializeInstanceFields() { |
| stateNumber = -1; |
| isAcceptState = false; |
| prediction = 0; |
| requiresFullContext = false; |
| } |