summaryrefslogtreecommitdiff
path: root/deps/v8/third_party/antlr4/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/third_party/antlr4/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp')
-rw-r--r--deps/v8/third_party/antlr4/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp813
1 files changed, 0 insertions, 813 deletions
diff --git a/deps/v8/third_party/antlr4/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp b/deps/v8/third_party/antlr4/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp
deleted file mode 100644
index be679ace02..0000000000
--- a/deps/v8/third_party/antlr4/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp
+++ /dev/null
@@ -1,813 +0,0 @@
-/* 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/ATNDeserializationOptions.h"
-
-#include "atn/ATN.h"
-#include "atn/ATNState.h"
-#include "atn/ATNType.h"
-
-#include "atn/BasicBlockStartState.h"
-#include "atn/BasicState.h"
-#include "atn/BlockEndState.h"
-#include "atn/DecisionState.h"
-#include "atn/EpsilonTransition.h"
-#include "atn/LoopEndState.h"
-#include "atn/PlusBlockStartState.h"
-#include "atn/PlusLoopbackState.h"
-#include "atn/RuleStartState.h"
-#include "atn/RuleStopState.h"
-#include "atn/RuleTransition.h"
-#include "atn/StarLoopEntryState.h"
-#include "atn/StarLoopbackState.h"
-#include "atn/TokensStartState.h"
-
-#include "Token.h"
-#include "atn/ActionTransition.h"
-#include "atn/AtomTransition.h"
-#include "atn/NotSetTransition.h"
-#include "atn/PrecedencePredicateTransition.h"
-#include "atn/PredicateTransition.h"
-#include "atn/RangeTransition.h"
-#include "atn/SetTransition.h"
-#include "atn/StarBlockStartState.h"
-#include "atn/WildcardTransition.h"
-
-#include "Exceptions.h"
-#include "misc/IntervalSet.h"
-#include "support/CPPUtils.h"
-#include "support/StringUtils.h"
-
-#include "atn/LexerChannelAction.h"
-#include "atn/LexerCustomAction.h"
-#include "atn/LexerModeAction.h"
-#include "atn/LexerMoreAction.h"
-#include "atn/LexerPopModeAction.h"
-#include "atn/LexerPushModeAction.h"
-#include "atn/LexerSkipAction.h"
-#include "atn/LexerTypeAction.h"
-
-#include "atn/ATNDeserializer.h"
-
-#include <string>
-
-using namespace antlr4;
-using namespace antlr4::atn;
-using namespace antlrcpp;
-
-const size_t ATNDeserializer::SERIALIZED_VERSION = 3;
-
-namespace {
-
-uint32_t deserializeInt32(const std::vector<uint16_t>& data, size_t offset) {
- return (uint32_t)data[offset] | ((uint32_t)data[offset + 1] << 16);
-}
-
-ssize_t readUnicodeInt(const std::vector<uint16_t>& data, int& p) {
- return static_cast<ssize_t>(data[p++]);
-}
-
-ssize_t readUnicodeInt32(const std::vector<uint16_t>& data, int& p) {
- auto result = deserializeInt32(data, p);
- p += 2;
- return static_cast<ssize_t>(result);
-}
-
-// We templatize this on the function type so the optimizer can inline
-// the 16- or 32-bit readUnicodeInt/readUnicodeInt32 as needed.
-template <typename F>
-void deserializeSets(const std::vector<uint16_t>& data, int& p,
- std::vector<misc::IntervalSet>& sets, F readUnicode) {
- int nsets = data[p++];
- for (int i = 0; i < nsets; i++) {
- int nintervals = data[p++];
- misc::IntervalSet set;
-
- bool containsEof = data[p++] != 0;
- if (containsEof) {
- set.add(-1);
- }
-
- for (int j = 0; j < nintervals; j++) {
- auto a = readUnicode(data, p);
- auto b = readUnicode(data, p);
- set.add(a, b);
- }
- sets.push_back(set);
- }
-}
-
-} // namespace
-
-ATNDeserializer::ATNDeserializer()
- : ATNDeserializer(ATNDeserializationOptions::getDefaultOptions()) {}
-
-ATNDeserializer::ATNDeserializer(const ATNDeserializationOptions& dso)
- : deserializationOptions(dso) {}
-
-ATNDeserializer::~ATNDeserializer() {}
-
-/**
- * This value should never change. Updates following this version are
- * reflected as change in the unique ID SERIALIZED_UUID.
- */
-Guid ATNDeserializer::ADDED_PRECEDENCE_TRANSITIONS() {
- return Guid("1DA0C57D-6C06-438A-9B27-10BCB3CE0F61");
-}
-
-Guid ATNDeserializer::ADDED_LEXER_ACTIONS() {
- return Guid("AADB8D7E-AEEF-4415-AD2B-8204D6CF042E");
-}
-
-Guid ATNDeserializer::ADDED_UNICODE_SMP() {
- return Guid("59627784-3BE5-417A-B9EB-8131A7286089");
-}
-
-Guid ATNDeserializer::SERIALIZED_UUID() { return ADDED_UNICODE_SMP(); }
-
-Guid ATNDeserializer::BASE_SERIALIZED_UUID() {
- return Guid("33761B2D-78BB-4A43-8B0B-4F5BEE8AACF3");
-}
-
-std::vector<Guid>& ATNDeserializer::SUPPORTED_UUIDS() {
- static std::vector<Guid> singleton = {
- BASE_SERIALIZED_UUID(), ADDED_PRECEDENCE_TRANSITIONS(),
- ADDED_LEXER_ACTIONS(), ADDED_UNICODE_SMP()};
- return singleton;
-}
-
-bool ATNDeserializer::isFeatureSupported(const Guid& feature,
- const Guid& actualUuid) {
- auto featureIterator =
- std::find(SUPPORTED_UUIDS().begin(), SUPPORTED_UUIDS().end(), feature);
- if (featureIterator == SUPPORTED_UUIDS().end()) {
- return false;
- }
- auto actualIterator =
- std::find(SUPPORTED_UUIDS().begin(), SUPPORTED_UUIDS().end(), actualUuid);
- if (actualIterator == SUPPORTED_UUIDS().end()) {
- return false;
- }
-
- return std::distance(featureIterator, actualIterator) >= 0;
-}
-
-ATN ATNDeserializer::deserialize(const std::vector<uint16_t>& input) {
- // Don't adjust the first value since that's the version number.
- std::vector<uint16_t> data(input.size());
- data[0] = input[0];
- for (size_t i = 1; i < input.size(); ++i) {
- data[i] = input[i] - 2;
- }
-
- int p = 0;
- int version = data[p++];
- if (version != SERIALIZED_VERSION) {
- std::string reason = "Could not deserialize ATN with version" +
- std::to_string(version) + "(expected " +
- std::to_string(SERIALIZED_VERSION) + ").";
-
- throw UnsupportedOperationException(reason);
- }
-
- Guid uuid = toUUID(data.data(), p);
- p += 8;
- auto uuidIterator =
- std::find(SUPPORTED_UUIDS().begin(), SUPPORTED_UUIDS().end(), uuid);
- if (uuidIterator == SUPPORTED_UUIDS().end()) {
- std::string reason = "Could not deserialize ATN with UUID " +
- uuid.toString() + " (expected " +
- SERIALIZED_UUID().toString() + " or a legacy UUID).";
-
- throw UnsupportedOperationException(reason);
- }
-
- bool supportsPrecedencePredicates =
- isFeatureSupported(ADDED_PRECEDENCE_TRANSITIONS(), uuid);
- bool supportsLexerActions = isFeatureSupported(ADDED_LEXER_ACTIONS(), uuid);
-
- ATNType grammarType = (ATNType)data[p++];
- size_t maxTokenType = data[p++];
- ATN atn(grammarType, maxTokenType);
-
- //
- // STATES
- //
- std::vector<std::pair<LoopEndState*, size_t>> loopBackStateNumbers;
- std::vector<std::pair<BlockStartState*, size_t>> endStateNumbers;
- size_t nstates = data[p++];
- for (size_t i = 0; i < nstates; i++) {
- size_t stype = data[p++];
- // ignore bad type of states
- if (stype == ATNState::ATN_INVALID_TYPE) {
- atn.addState(nullptr);
- continue;
- }
-
- size_t ruleIndex = data[p++];
- if (ruleIndex == 0xFFFF) {
- ruleIndex = INVALID_INDEX;
- }
-
- ATNState* s = stateFactory(stype, ruleIndex);
- if (stype == ATNState::LOOP_END) { // special case
- int loopBackStateNumber = data[p++];
- loopBackStateNumbers.push_back({(LoopEndState*)s, loopBackStateNumber});
- } else if (is<BlockStartState*>(s)) {
- int endStateNumber = data[p++];
- endStateNumbers.push_back({(BlockStartState*)s, endStateNumber});
- }
- atn.addState(s);
- }
-
- // delay the assignment of loop back and end states until we know all the
- // state instances have been initialized
- for (auto& pair : loopBackStateNumbers) {
- pair.first->loopBackState = atn.states[pair.second];
- }
-
- for (auto& pair : endStateNumbers) {
- pair.first->endState = (BlockEndState*)atn.states[pair.second];
- }
-
- size_t numNonGreedyStates = data[p++];
- for (size_t i = 0; i < numNonGreedyStates; i++) {
- size_t stateNumber = data[p++];
- // The serialized ATN must be specifying the right states, so that the
- // cast below is correct.
- ((DecisionState*)atn.states[stateNumber])->nonGreedy = true;
- }
-
- if (supportsPrecedencePredicates) {
- size_t numPrecedenceStates = data[p++];
- for (size_t i = 0; i < numPrecedenceStates; i++) {
- size_t stateNumber = data[p++];
- ((RuleStartState*)atn.states[stateNumber])->isLeftRecursiveRule = true;
- }
- }
-
- //
- // RULES
- //
- size_t nrules = data[p++];
- for (size_t i = 0; i < nrules; i++) {
- size_t s = data[p++];
- // Also here, the serialized atn must ensure to point to the correct class
- // type.
- RuleStartState* startState = (RuleStartState*)atn.states[s];
- atn.ruleToStartState.push_back(startState);
- if (atn.grammarType == ATNType::LEXER) {
- size_t tokenType = data[p++];
- if (tokenType == 0xFFFF) {
- tokenType = Token::EOF;
- }
-
- atn.ruleToTokenType.push_back(tokenType);
-
- if (!isFeatureSupported(ADDED_LEXER_ACTIONS(), uuid)) {
- // this piece of unused metadata was serialized prior to the
- // addition of LexerAction
- // int actionIndexIgnored = data[p++];
- p++;
- }
- }
- }
-
- atn.ruleToStopState.resize(nrules);
- for (ATNState* state : atn.states) {
- if (!is<RuleStopState*>(state)) {
- continue;
- }
-
- RuleStopState* stopState = static_cast<RuleStopState*>(state);
- atn.ruleToStopState[state->ruleIndex] = stopState;
- atn.ruleToStartState[state->ruleIndex]->stopState = stopState;
- }
-
- //
- // MODES
- //
- size_t nmodes = data[p++];
- for (size_t i = 0; i < nmodes; i++) {
- size_t s = data[p++];
- atn.modeToStartState.push_back(
- static_cast<TokensStartState*>(atn.states[s]));
- }
-
- //
- // SETS
- //
- std::vector<misc::IntervalSet> sets;
-
- // First, deserialize sets with 16-bit arguments <= U+FFFF.
- deserializeSets(data, p, sets, readUnicodeInt);
-
- // Next, if the ATN was serialized with the Unicode SMP feature,
- // deserialize sets with 32-bit arguments <= U+10FFFF.
- if (isFeatureSupported(ADDED_UNICODE_SMP(), uuid)) {
- deserializeSets(data, p, sets, readUnicodeInt32);
- }
-
- //
- // EDGES
- //
- int nedges = data[p++];
- for (int i = 0; i < nedges; i++) {
- size_t src = data[p];
- size_t trg = data[p + 1];
- size_t ttype = data[p + 2];
- size_t arg1 = data[p + 3];
- size_t arg2 = data[p + 4];
- size_t arg3 = data[p + 5];
- Transition* trans =
- edgeFactory(atn, ttype, src, trg, arg1, arg2, arg3, sets);
- ATNState* srcState = atn.states[src];
- srcState->addTransition(trans);
- p += 6;
- }
-
- // edges for rule stop states can be derived, so they aren't serialized
- for (ATNState* state : atn.states) {
- for (size_t i = 0; i < state->transitions.size(); i++) {
- Transition* t = state->transitions[i];
- if (!is<RuleTransition*>(t)) {
- continue;
- }
-
- RuleTransition* ruleTransition = static_cast<RuleTransition*>(t);
- size_t outermostPrecedenceReturn = INVALID_INDEX;
- if (atn.ruleToStartState[ruleTransition->target->ruleIndex]
- ->isLeftRecursiveRule) {
- if (ruleTransition->precedence == 0) {
- outermostPrecedenceReturn = ruleTransition->target->ruleIndex;
- }
- }
-
- EpsilonTransition* returnTransition = new EpsilonTransition(
- ruleTransition->followState,
- outermostPrecedenceReturn); /* mem check: freed in ANTState d-tor */
- atn.ruleToStopState[ruleTransition->target->ruleIndex]->addTransition(
- returnTransition);
- }
- }
-
- for (ATNState* state : atn.states) {
- if (is<BlockStartState*>(state)) {
- BlockStartState* startState = static_cast<BlockStartState*>(state);
-
- // we need to know the end state to set its start state
- if (startState->endState == nullptr) {
- throw IllegalStateException();
- }
-
- // block end states can only be associated to a single block start state
- if (startState->endState->startState != nullptr) {
- throw IllegalStateException();
- }
-
- startState->endState->startState = static_cast<BlockStartState*>(state);
- }
-
- if (is<PlusLoopbackState*>(state)) {
- PlusLoopbackState* loopbackState = static_cast<PlusLoopbackState*>(state);
- for (size_t i = 0; i < loopbackState->transitions.size(); i++) {
- ATNState* target = loopbackState->transitions[i]->target;
- if (is<PlusBlockStartState*>(target)) {
- (static_cast<PlusBlockStartState*>(target))->loopBackState =
- loopbackState;
- }
- }
- } else if (is<StarLoopbackState*>(state)) {
- StarLoopbackState* loopbackState = static_cast<StarLoopbackState*>(state);
- for (size_t i = 0; i < loopbackState->transitions.size(); i++) {
- ATNState* target = loopbackState->transitions[i]->target;
- if (is<StarLoopEntryState*>(target)) {
- (static_cast<StarLoopEntryState*>(target))->loopBackState =
- loopbackState;
- }
- }
- }
- }
-
- //
- // DECISIONS
- //
- size_t ndecisions = data[p++];
- for (size_t i = 1; i <= ndecisions; i++) {
- size_t s = data[p++];
- DecisionState* decState = dynamic_cast<DecisionState*>(atn.states[s]);
- if (decState == nullptr) throw IllegalStateException();
-
- atn.decisionToState.push_back(decState);
- decState->decision = (int)i - 1;
- }
-
- //
- // LEXER ACTIONS
- //
- if (atn.grammarType == ATNType::LEXER) {
- if (supportsLexerActions) {
- atn.lexerActions.resize(data[p++]);
- for (size_t i = 0; i < atn.lexerActions.size(); i++) {
- LexerActionType actionType = (LexerActionType)data[p++];
- int data1 = data[p++];
- if (data1 == 0xFFFF) {
- data1 = -1;
- }
-
- int data2 = data[p++];
- if (data2 == 0xFFFF) {
- data2 = -1;
- }
-
- atn.lexerActions[i] = lexerActionFactory(actionType, data1, data2);
- }
- } else {
- // for compatibility with older serialized ATNs, convert the old
- // serialized action index for action transitions to the new
- // form, which is the index of a LexerCustomAction
- for (ATNState* state : atn.states) {
- for (size_t i = 0; i < state->transitions.size(); i++) {
- Transition* transition = state->transitions[i];
- if (!is<ActionTransition*>(transition)) {
- continue;
- }
-
- size_t ruleIndex =
- static_cast<ActionTransition*>(transition)->ruleIndex;
- size_t actionIndex =
- static_cast<ActionTransition*>(transition)->actionIndex;
- Ref<LexerCustomAction> lexerAction =
- std::make_shared<LexerCustomAction>(ruleIndex, actionIndex);
- state->transitions[i] = new ActionTransition(
- transition->target, ruleIndex, atn.lexerActions.size(),
- false); /* mem-check freed in ATNState d-tor */
- delete transition; // ml: no longer needed since we just replaced it.
- atn.lexerActions.push_back(lexerAction);
- }
- }
- }
- }
-
- markPrecedenceDecisions(atn);
-
- if (deserializationOptions.isVerifyATN()) {
- verifyATN(atn);
- }
-
- if (deserializationOptions.isGenerateRuleBypassTransitions() &&
- atn.grammarType == ATNType::PARSER) {
- atn.ruleToTokenType.resize(atn.ruleToStartState.size());
- for (size_t i = 0; i < atn.ruleToStartState.size(); i++) {
- atn.ruleToTokenType[i] = int(atn.maxTokenType + i + 1);
- }
-
- for (std::vector<RuleStartState*>::size_type i = 0;
- i < atn.ruleToStartState.size(); i++) {
- BasicBlockStartState* bypassStart =
- new BasicBlockStartState(); /* mem check: freed in ATN d-tor */
- bypassStart->ruleIndex = (int)i;
- atn.addState(bypassStart);
-
- BlockEndState* bypassStop =
- new BlockEndState(); /* mem check: freed in ATN d-tor */
- bypassStop->ruleIndex = (int)i;
- atn.addState(bypassStop);
-
- bypassStart->endState = bypassStop;
- atn.defineDecisionState(bypassStart);
-
- bypassStop->startState = bypassStart;
-
- ATNState* endState;
- Transition* excludeTransition = nullptr;
- if (atn.ruleToStartState[i]->isLeftRecursiveRule) {
- // wrap from the beginning of the rule to the StarLoopEntryState
- endState = nullptr;
- for (ATNState* state : atn.states) {
- if (state->ruleIndex != i) {
- continue;
- }
-
- if (!is<StarLoopEntryState*>(state)) {
- continue;
- }
-
- ATNState* maybeLoopEndState =
- state->transitions[state->transitions.size() - 1]->target;
- if (!is<LoopEndState*>(maybeLoopEndState)) {
- continue;
- }
-
- if (maybeLoopEndState->epsilonOnlyTransitions &&
- is<RuleStopState*>(maybeLoopEndState->transitions[0]->target)) {
- endState = state;
- break;
- }
- }
-
- if (endState == nullptr) {
- throw UnsupportedOperationException(
- "Couldn't identify final state of the precedence rule prefix "
- "section.");
- }
-
- excludeTransition = (static_cast<StarLoopEntryState*>(endState))
- ->loopBackState->transitions[0];
- } else {
- endState = atn.ruleToStopState[i];
- }
-
- // all non-excluded transitions that currently target end state need to
- // target blockEnd instead
- for (ATNState* state : atn.states) {
- for (Transition* transition : state->transitions) {
- if (transition == excludeTransition) {
- continue;
- }
-
- if (transition->target == endState) {
- transition->target = bypassStop;
- }
- }
- }
-
- // all transitions leaving the rule start state need to leave blockStart
- // instead
- while (atn.ruleToStartState[i]->transitions.size() > 0) {
- Transition* transition = atn.ruleToStartState[i]->removeTransition(
- atn.ruleToStartState[i]->transitions.size() - 1);
- bypassStart->addTransition(transition);
- }
-
- // link the new states
- atn.ruleToStartState[i]->addTransition(new EpsilonTransition(
- bypassStart)); /* mem check: freed in ATNState d-tor */
- bypassStop->addTransition(new EpsilonTransition(
- endState)); /* mem check: freed in ATNState d-tor */
-
- ATNState* matchState =
- new BasicState(); /* mem check: freed in ATN d-tor */
- atn.addState(matchState);
- matchState->addTransition(new AtomTransition(
- bypassStop,
- atn.ruleToTokenType[i])); /* mem check: freed in ATNState d-tor */
- bypassStart->addTransition(new EpsilonTransition(
- matchState)); /* mem check: freed in ATNState d-tor */
- }
-
- if (deserializationOptions.isVerifyATN()) {
- // reverify after modification
- verifyATN(atn);
- }
- }
-
- return atn;
-}
-
-/**
- * Analyze the {@link StarLoopEntryState} states in the specified ATN to set
- * the {@link StarLoopEntryState#isPrecedenceDecision} field to the
- * correct value.
- *
- * @param atn The ATN.
- */
-void ATNDeserializer::markPrecedenceDecisions(const ATN& atn) {
- for (ATNState* state : atn.states) {
- if (!is<StarLoopEntryState*>(state)) {
- continue;
- }
-
- /* We analyze the ATN to determine if this ATN decision state is the
- * decision for the closure block that determines whether a
- * precedence rule should continue or complete.
- */
- if (atn.ruleToStartState[state->ruleIndex]->isLeftRecursiveRule) {
- ATNState* maybeLoopEndState =
- state->transitions[state->transitions.size() - 1]->target;
- if (is<LoopEndState*>(maybeLoopEndState)) {
- if (maybeLoopEndState->epsilonOnlyTransitions &&
- is<RuleStopState*>(maybeLoopEndState->transitions[0]->target)) {
- static_cast<StarLoopEntryState*>(state)->isPrecedenceDecision = true;
- }
- }
- }
- }
-}
-
-void ATNDeserializer::verifyATN(const ATN& atn) {
- // verify assumptions
- for (ATNState* state : atn.states) {
- if (state == nullptr) {
- continue;
- }
-
- checkCondition(state->epsilonOnlyTransitions ||
- state->transitions.size() <= 1);
-
- if (is<PlusBlockStartState*>(state)) {
- checkCondition(
- (static_cast<PlusBlockStartState*>(state))->loopBackState != nullptr);
- }
-
- if (is<StarLoopEntryState*>(state)) {
- StarLoopEntryState* starLoopEntryState =
- static_cast<StarLoopEntryState*>(state);
- checkCondition(starLoopEntryState->loopBackState != nullptr);
- checkCondition(starLoopEntryState->transitions.size() == 2);
-
- if (is<StarBlockStartState*>(
- starLoopEntryState->transitions[0]->target)) {
- checkCondition(static_cast<LoopEndState*>(
- starLoopEntryState->transitions[1]->target) !=
- nullptr);
- checkCondition(!starLoopEntryState->nonGreedy);
- } else if (is<LoopEndState*>(
- starLoopEntryState->transitions[0]->target)) {
- checkCondition(is<StarBlockStartState*>(
- starLoopEntryState->transitions[1]->target));
- checkCondition(starLoopEntryState->nonGreedy);
- } else {
- throw IllegalStateException();
- }
- }
-
- if (is<StarLoopbackState*>(state)) {
- checkCondition(state->transitions.size() == 1);
- checkCondition(is<StarLoopEntryState*>(state->transitions[0]->target));
- }
-
- if (is<LoopEndState*>(state)) {
- checkCondition((static_cast<LoopEndState*>(state))->loopBackState !=
- nullptr);
- }
-
- if (is<RuleStartState*>(state)) {
- checkCondition((static_cast<RuleStartState*>(state))->stopState !=
- nullptr);
- }
-
- if (is<BlockStartState*>(state)) {
- checkCondition((static_cast<BlockStartState*>(state))->endState !=
- nullptr);
- }
-
- if (is<BlockEndState*>(state)) {
- checkCondition((static_cast<BlockEndState*>(state))->startState !=
- nullptr);
- }
-
- if (is<DecisionState*>(state)) {
- DecisionState* decisionState = static_cast<DecisionState*>(state);
- checkCondition(decisionState->transitions.size() <= 1 ||
- decisionState->decision >= 0);
- } else {
- checkCondition(state->transitions.size() <= 1 ||
- is<RuleStopState*>(state));
- }
- }
-}
-
-void ATNDeserializer::checkCondition(bool condition) {
- checkCondition(condition, "");
-}
-
-void ATNDeserializer::checkCondition(bool condition,
- const std::string& message) {
- if (!condition) {
- throw IllegalStateException(message);
- }
-}
-
-Guid ATNDeserializer::toUUID(const unsigned short* data, size_t offset) {
- return Guid((uint16_t*)data + offset, true);
-}
-
-/* mem check: all created instances are freed in the d-tor of the ATNState they
- * are added to. */
-Transition* ATNDeserializer::edgeFactory(
- const ATN& atn, size_t type, size_t /*src*/, size_t trg, size_t arg1,
- size_t arg2, size_t arg3, const std::vector<misc::IntervalSet>& sets) {
- ATNState* target = atn.states[trg];
- switch (type) {
- case Transition::EPSILON:
- return new EpsilonTransition(target);
- case Transition::RANGE:
- if (arg3 != 0) {
- return new RangeTransition(target, Token::EOF, arg2);
- } else {
- return new RangeTransition(target, arg1, arg2);
- }
- case Transition::RULE:
- return new RuleTransition(static_cast<RuleStartState*>(atn.states[arg1]),
- arg2, (int)arg3, target);
- case Transition::PREDICATE:
- return new PredicateTransition(target, arg1, arg2, arg3 != 0);
- case Transition::PRECEDENCE:
- return new PrecedencePredicateTransition(target, (int)arg1);
- case Transition::ATOM:
- if (arg3 != 0) {
- return new AtomTransition(target, Token::EOF);
- } else {
- return new AtomTransition(target, arg1);
- }
- case Transition::ACTION:
- return new ActionTransition(target, arg1, arg2, arg3 != 0);
- case Transition::SET:
- return new SetTransition(target, sets[arg1]);
- case Transition::NOT_SET:
- return new NotSetTransition(target, sets[arg1]);
- case Transition::WILDCARD:
- return new WildcardTransition(target);
- }
-
- throw IllegalArgumentException("The specified transition type is not valid.");
-}
-
-/* mem check: all created instances are freed in the d-tor of the ATN. */
-ATNState* ATNDeserializer::stateFactory(size_t type, size_t ruleIndex) {
- ATNState* s;
- switch (type) {
- case ATNState::ATN_INVALID_TYPE:
- return nullptr;
- case ATNState::BASIC:
- s = new BasicState();
- break;
- case ATNState::RULE_START:
- s = new RuleStartState();
- break;
- case ATNState::BLOCK_START:
- s = new BasicBlockStartState();
- break;
- case ATNState::PLUS_BLOCK_START:
- s = new PlusBlockStartState();
- break;
- case ATNState::STAR_BLOCK_START:
- s = new StarBlockStartState();
- break;
- case ATNState::TOKEN_START:
- s = new TokensStartState();
- break;
- case ATNState::RULE_STOP:
- s = new RuleStopState();
- break;
- case ATNState::BLOCK_END:
- s = new BlockEndState();
- break;
- case ATNState::STAR_LOOP_BACK:
- s = new StarLoopbackState();
- break;
- case ATNState::STAR_LOOP_ENTRY:
- s = new StarLoopEntryState();
- break;
- case ATNState::PLUS_LOOP_BACK:
- s = new PlusLoopbackState();
- break;
- case ATNState::LOOP_END:
- s = new LoopEndState();
- break;
- default:
- std::string message =
- "The specified state type " + std::to_string(type) + " is not valid.";
- throw IllegalArgumentException(message);
- }
-
- s->ruleIndex = ruleIndex;
- return s;
-}
-
-Ref<LexerAction> ATNDeserializer::lexerActionFactory(LexerActionType type,
- int data1, int data2) {
- switch (type) {
- case LexerActionType::CHANNEL:
- return std::make_shared<LexerChannelAction>(data1);
-
- case LexerActionType::CUSTOM:
- return std::make_shared<LexerCustomAction>(data1, data2);
-
- case LexerActionType::MODE:
- return std::make_shared<LexerModeAction>(data1);
-
- case LexerActionType::MORE:
- return LexerMoreAction::getInstance();
-
- case LexerActionType::POP_MODE:
- return LexerPopModeAction::getInstance();
-
- case LexerActionType::PUSH_MODE:
- return std::make_shared<LexerPushModeAction>(data1);
-
- case LexerActionType::SKIP:
- return LexerSkipAction::getInstance();
-
- case LexerActionType::TYPE:
- return std::make_shared<LexerTypeAction>(data1);
-
- default:
- throw IllegalArgumentException("The specified lexer action type " +
- std::to_string(static_cast<size_t>(type)) +
- " is not valid.");
- }
-}