
// Generated from SV3_1aSplitterParser.g4 by ANTLR 4.7.2

#include "SV3_1aSplitterParserListener.h"

#include "SV3_1aSplitterParser.h"

using namespace antlrcpp;
using namespace antlr4;

SV3_1aSplitterParser::SV3_1aSplitterParser(TokenStream *input) : Parser(input) {
  _interpreter = new atn::ParserATNSimulator(this, _atn, _decisionToDFA,
                                             _sharedContextCache);
}

SV3_1aSplitterParser::~SV3_1aSplitterParser() { delete _interpreter; }

std::string SV3_1aSplitterParser::getGrammarFileName() const {
  return "SV3_1aSplitterParser.g4";
}

const std::vector<std::string> &SV3_1aSplitterParser::getRuleNames() const {
  return _ruleNames;
}

dfa::Vocabulary &SV3_1aSplitterParser::getVocabulary() const {
  return _vocabulary;
}

//----------------- Source_textContext
//------------------------------------------------------------------

SV3_1aSplitterParser::Source_textContext::Source_textContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

std::vector<SV3_1aSplitterParser::DescriptionContext *>
SV3_1aSplitterParser::Source_textContext::description() {
  return getRuleContexts<SV3_1aSplitterParser::DescriptionContext>();
}

SV3_1aSplitterParser::DescriptionContext *
SV3_1aSplitterParser::Source_textContext::description(size_t i) {
  return getRuleContext<SV3_1aSplitterParser::DescriptionContext>(i);
}

size_t SV3_1aSplitterParser::Source_textContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleSource_text;
}

void SV3_1aSplitterParser::Source_textContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterSource_text(this);
}

void SV3_1aSplitterParser::Source_textContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitSource_text(this);
}

SV3_1aSplitterParser::Source_textContext *SV3_1aSplitterParser::source_text() {
  Source_textContext *_localctx =
      _tracker.createInstance<Source_textContext>(_ctx, getState());
  enterRule(_localctx, 0, SV3_1aSplitterParser::RuleSource_text);
  size_t _la = 0;

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(37);
    _errHandler->sync(this);
    _la = _input->LA(1);
    while ((((_la & ~0x3fULL) == 0) &&
            ((1ULL << _la) & ((1ULL << SV3_1aSplitterParser::MODULE) |
                              (1ULL << SV3_1aSplitterParser::ENDMODULE) |
                              (1ULL << SV3_1aSplitterParser::INTERFACE) |
                              (1ULL << SV3_1aSplitterParser::ENDINTERFACE) |
                              (1ULL << SV3_1aSplitterParser::PROGRAM) |
                              (1ULL << SV3_1aSplitterParser::ENDPROGRAM) |
                              (1ULL << SV3_1aSplitterParser::PRIMITIVE) |
                              (1ULL << SV3_1aSplitterParser::ENDPRIMITIVE) |
                              (1ULL << SV3_1aSplitterParser::PACKAGE) |
                              (1ULL << SV3_1aSplitterParser::ENDPACKAGE) |
                              (1ULL << SV3_1aSplitterParser::CHECKER) |
                              (1ULL << SV3_1aSplitterParser::ENDCHECKER) |
                              (1ULL << SV3_1aSplitterParser::CONFIG) |
                              (1ULL << SV3_1aSplitterParser::ENDCONFIG) |
                              (1ULL << SV3_1aSplitterParser::ANY))) != 0)) {
      setState(34);
      description();
      setState(39);
      _errHandler->sync(this);
      _la = _input->LA(1);
    }

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- DescriptionContext
//------------------------------------------------------------------

SV3_1aSplitterParser::DescriptionContext::DescriptionContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

SV3_1aSplitterParser::ModuleContext *
SV3_1aSplitterParser::DescriptionContext::module() {
  return getRuleContext<SV3_1aSplitterParser::ModuleContext>(0);
}

SV3_1aSplitterParser::EndmoduleContext *
SV3_1aSplitterParser::DescriptionContext::endmodule() {
  return getRuleContext<SV3_1aSplitterParser::EndmoduleContext>(0);
}

SV3_1aSplitterParser::Sv_interfaceContext *
SV3_1aSplitterParser::DescriptionContext::sv_interface() {
  return getRuleContext<SV3_1aSplitterParser::Sv_interfaceContext>(0);
}

SV3_1aSplitterParser::EndinterfaceContext *
SV3_1aSplitterParser::DescriptionContext::endinterface() {
  return getRuleContext<SV3_1aSplitterParser::EndinterfaceContext>(0);
}

SV3_1aSplitterParser::ProgramContext *
SV3_1aSplitterParser::DescriptionContext::program() {
  return getRuleContext<SV3_1aSplitterParser::ProgramContext>(0);
}

SV3_1aSplitterParser::EndprogramContext *
SV3_1aSplitterParser::DescriptionContext::endprogram() {
  return getRuleContext<SV3_1aSplitterParser::EndprogramContext>(0);
}

SV3_1aSplitterParser::PrimitiveContext *
SV3_1aSplitterParser::DescriptionContext::primitive() {
  return getRuleContext<SV3_1aSplitterParser::PrimitiveContext>(0);
}

SV3_1aSplitterParser::EndprimitiveContext *
SV3_1aSplitterParser::DescriptionContext::endprimitive() {
  return getRuleContext<SV3_1aSplitterParser::EndprimitiveContext>(0);
}

SV3_1aSplitterParser::Sv_packageContext *
SV3_1aSplitterParser::DescriptionContext::sv_package() {
  return getRuleContext<SV3_1aSplitterParser::Sv_packageContext>(0);
}

SV3_1aSplitterParser::EndpackageContext *
SV3_1aSplitterParser::DescriptionContext::endpackage() {
  return getRuleContext<SV3_1aSplitterParser::EndpackageContext>(0);
}

SV3_1aSplitterParser::CheckerContext *
SV3_1aSplitterParser::DescriptionContext::checker() {
  return getRuleContext<SV3_1aSplitterParser::CheckerContext>(0);
}

SV3_1aSplitterParser::EndcheckerContext *
SV3_1aSplitterParser::DescriptionContext::endchecker() {
  return getRuleContext<SV3_1aSplitterParser::EndcheckerContext>(0);
}

SV3_1aSplitterParser::ConfigContext *
SV3_1aSplitterParser::DescriptionContext::config() {
  return getRuleContext<SV3_1aSplitterParser::ConfigContext>(0);
}

SV3_1aSplitterParser::EndconfigContext *
SV3_1aSplitterParser::DescriptionContext::endconfig() {
  return getRuleContext<SV3_1aSplitterParser::EndconfigContext>(0);
}

tree::TerminalNode *SV3_1aSplitterParser::DescriptionContext::ANY() {
  return getToken(SV3_1aSplitterParser::ANY, 0);
}

size_t SV3_1aSplitterParser::DescriptionContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleDescription;
}

void SV3_1aSplitterParser::DescriptionContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterDescription(this);
}

void SV3_1aSplitterParser::DescriptionContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitDescription(this);
}

SV3_1aSplitterParser::DescriptionContext *SV3_1aSplitterParser::description() {
  DescriptionContext *_localctx =
      _tracker.createInstance<DescriptionContext>(_ctx, getState());
  enterRule(_localctx, 2, SV3_1aSplitterParser::RuleDescription);

  auto onExit = finally([=] { exitRule(); });
  try {
    setState(55);
    _errHandler->sync(this);
    switch (_input->LA(1)) {
      case SV3_1aSplitterParser::MODULE: {
        enterOuterAlt(_localctx, 1);
        setState(40);
        module();
        break;
      }

      case SV3_1aSplitterParser::ENDMODULE: {
        enterOuterAlt(_localctx, 2);
        setState(41);
        endmodule();
        break;
      }

      case SV3_1aSplitterParser::INTERFACE: {
        enterOuterAlt(_localctx, 3);
        setState(42);
        sv_interface();
        break;
      }

      case SV3_1aSplitterParser::ENDINTERFACE: {
        enterOuterAlt(_localctx, 4);
        setState(43);
        endinterface();
        break;
      }

      case SV3_1aSplitterParser::PROGRAM: {
        enterOuterAlt(_localctx, 5);
        setState(44);
        program();
        break;
      }

      case SV3_1aSplitterParser::ENDPROGRAM: {
        enterOuterAlt(_localctx, 6);
        setState(45);
        endprogram();
        break;
      }

      case SV3_1aSplitterParser::PRIMITIVE: {
        enterOuterAlt(_localctx, 7);
        setState(46);
        primitive();
        break;
      }

      case SV3_1aSplitterParser::ENDPRIMITIVE: {
        enterOuterAlt(_localctx, 8);
        setState(47);
        endprimitive();
        break;
      }

      case SV3_1aSplitterParser::PACKAGE: {
        enterOuterAlt(_localctx, 9);
        setState(48);
        sv_package();
        break;
      }

      case SV3_1aSplitterParser::ENDPACKAGE: {
        enterOuterAlt(_localctx, 10);
        setState(49);
        endpackage();
        break;
      }

      case SV3_1aSplitterParser::CHECKER: {
        enterOuterAlt(_localctx, 11);
        setState(50);
        checker();
        break;
      }

      case SV3_1aSplitterParser::ENDCHECKER: {
        enterOuterAlt(_localctx, 12);
        setState(51);
        endchecker();
        break;
      }

      case SV3_1aSplitterParser::CONFIG: {
        enterOuterAlt(_localctx, 13);
        setState(52);
        config();
        break;
      }

      case SV3_1aSplitterParser::ENDCONFIG: {
        enterOuterAlt(_localctx, 14);
        setState(53);
        endconfig();
        break;
      }

      case SV3_1aSplitterParser::ANY: {
        enterOuterAlt(_localctx, 15);
        setState(54);
        match(SV3_1aSplitterParser::ANY);
        break;
      }

      default:
        throw NoViableAltException(this);
    }

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ModuleContext
//------------------------------------------------------------------

SV3_1aSplitterParser::ModuleContext::ModuleContext(ParserRuleContext *parent,
                                                   size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::ModuleContext::MODULE() {
  return getToken(SV3_1aSplitterParser::MODULE, 0);
}

size_t SV3_1aSplitterParser::ModuleContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleModule;
}

void SV3_1aSplitterParser::ModuleContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterModule(this);
}

void SV3_1aSplitterParser::ModuleContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitModule(this);
}

SV3_1aSplitterParser::ModuleContext *SV3_1aSplitterParser::module() {
  ModuleContext *_localctx =
      _tracker.createInstance<ModuleContext>(_ctx, getState());
  enterRule(_localctx, 4, SV3_1aSplitterParser::RuleModule);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(57);
    match(SV3_1aSplitterParser::MODULE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EndmoduleContext
//------------------------------------------------------------------

SV3_1aSplitterParser::EndmoduleContext::EndmoduleContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::EndmoduleContext::ENDMODULE() {
  return getToken(SV3_1aSplitterParser::ENDMODULE, 0);
}

size_t SV3_1aSplitterParser::EndmoduleContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleEndmodule;
}

void SV3_1aSplitterParser::EndmoduleContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterEndmodule(this);
}

void SV3_1aSplitterParser::EndmoduleContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitEndmodule(this);
}

SV3_1aSplitterParser::EndmoduleContext *SV3_1aSplitterParser::endmodule() {
  EndmoduleContext *_localctx =
      _tracker.createInstance<EndmoduleContext>(_ctx, getState());
  enterRule(_localctx, 6, SV3_1aSplitterParser::RuleEndmodule);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(59);
    match(SV3_1aSplitterParser::ENDMODULE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- Sv_interfaceContext
//------------------------------------------------------------------

SV3_1aSplitterParser::Sv_interfaceContext::Sv_interfaceContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::Sv_interfaceContext::INTERFACE() {
  return getToken(SV3_1aSplitterParser::INTERFACE, 0);
}

size_t SV3_1aSplitterParser::Sv_interfaceContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleSv_interface;
}

void SV3_1aSplitterParser::Sv_interfaceContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterSv_interface(this);
}

void SV3_1aSplitterParser::Sv_interfaceContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitSv_interface(this);
}

SV3_1aSplitterParser::Sv_interfaceContext *
SV3_1aSplitterParser::sv_interface() {
  Sv_interfaceContext *_localctx =
      _tracker.createInstance<Sv_interfaceContext>(_ctx, getState());
  enterRule(_localctx, 8, SV3_1aSplitterParser::RuleSv_interface);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(61);
    match(SV3_1aSplitterParser::INTERFACE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EndinterfaceContext
//------------------------------------------------------------------

SV3_1aSplitterParser::EndinterfaceContext::EndinterfaceContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::EndinterfaceContext::ENDINTERFACE() {
  return getToken(SV3_1aSplitterParser::ENDINTERFACE, 0);
}

size_t SV3_1aSplitterParser::EndinterfaceContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleEndinterface;
}

void SV3_1aSplitterParser::EndinterfaceContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterEndinterface(this);
}

void SV3_1aSplitterParser::EndinterfaceContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitEndinterface(this);
}

SV3_1aSplitterParser::EndinterfaceContext *
SV3_1aSplitterParser::endinterface() {
  EndinterfaceContext *_localctx =
      _tracker.createInstance<EndinterfaceContext>(_ctx, getState());
  enterRule(_localctx, 10, SV3_1aSplitterParser::RuleEndinterface);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(63);
    match(SV3_1aSplitterParser::ENDINTERFACE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ProgramContext
//------------------------------------------------------------------

SV3_1aSplitterParser::ProgramContext::ProgramContext(ParserRuleContext *parent,
                                                     size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::ProgramContext::PROGRAM() {
  return getToken(SV3_1aSplitterParser::PROGRAM, 0);
}

size_t SV3_1aSplitterParser::ProgramContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleProgram;
}

void SV3_1aSplitterParser::ProgramContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterProgram(this);
}

void SV3_1aSplitterParser::ProgramContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitProgram(this);
}

SV3_1aSplitterParser::ProgramContext *SV3_1aSplitterParser::program() {
  ProgramContext *_localctx =
      _tracker.createInstance<ProgramContext>(_ctx, getState());
  enterRule(_localctx, 12, SV3_1aSplitterParser::RuleProgram);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(65);
    match(SV3_1aSplitterParser::PROGRAM);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EndprogramContext
//------------------------------------------------------------------

SV3_1aSplitterParser::EndprogramContext::EndprogramContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::EndprogramContext::ENDPROGRAM() {
  return getToken(SV3_1aSplitterParser::ENDPROGRAM, 0);
}

size_t SV3_1aSplitterParser::EndprogramContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleEndprogram;
}

void SV3_1aSplitterParser::EndprogramContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterEndprogram(this);
}

void SV3_1aSplitterParser::EndprogramContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitEndprogram(this);
}

SV3_1aSplitterParser::EndprogramContext *SV3_1aSplitterParser::endprogram() {
  EndprogramContext *_localctx =
      _tracker.createInstance<EndprogramContext>(_ctx, getState());
  enterRule(_localctx, 14, SV3_1aSplitterParser::RuleEndprogram);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(67);
    match(SV3_1aSplitterParser::ENDPROGRAM);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- PrimitiveContext
//------------------------------------------------------------------

SV3_1aSplitterParser::PrimitiveContext::PrimitiveContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::PrimitiveContext::PRIMITIVE() {
  return getToken(SV3_1aSplitterParser::PRIMITIVE, 0);
}

size_t SV3_1aSplitterParser::PrimitiveContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RulePrimitive;
}

void SV3_1aSplitterParser::PrimitiveContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterPrimitive(this);
}

void SV3_1aSplitterParser::PrimitiveContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitPrimitive(this);
}

SV3_1aSplitterParser::PrimitiveContext *SV3_1aSplitterParser::primitive() {
  PrimitiveContext *_localctx =
      _tracker.createInstance<PrimitiveContext>(_ctx, getState());
  enterRule(_localctx, 16, SV3_1aSplitterParser::RulePrimitive);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(69);
    match(SV3_1aSplitterParser::PRIMITIVE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EndprimitiveContext
//------------------------------------------------------------------

SV3_1aSplitterParser::EndprimitiveContext::EndprimitiveContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::EndprimitiveContext::ENDPRIMITIVE() {
  return getToken(SV3_1aSplitterParser::ENDPRIMITIVE, 0);
}

size_t SV3_1aSplitterParser::EndprimitiveContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleEndprimitive;
}

void SV3_1aSplitterParser::EndprimitiveContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterEndprimitive(this);
}

void SV3_1aSplitterParser::EndprimitiveContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitEndprimitive(this);
}

SV3_1aSplitterParser::EndprimitiveContext *
SV3_1aSplitterParser::endprimitive() {
  EndprimitiveContext *_localctx =
      _tracker.createInstance<EndprimitiveContext>(_ctx, getState());
  enterRule(_localctx, 18, SV3_1aSplitterParser::RuleEndprimitive);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(71);
    match(SV3_1aSplitterParser::ENDPRIMITIVE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- Sv_packageContext
//------------------------------------------------------------------

SV3_1aSplitterParser::Sv_packageContext::Sv_packageContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::Sv_packageContext::PACKAGE() {
  return getToken(SV3_1aSplitterParser::PACKAGE, 0);
}

size_t SV3_1aSplitterParser::Sv_packageContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleSv_package;
}

void SV3_1aSplitterParser::Sv_packageContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterSv_package(this);
}

void SV3_1aSplitterParser::Sv_packageContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitSv_package(this);
}

SV3_1aSplitterParser::Sv_packageContext *SV3_1aSplitterParser::sv_package() {
  Sv_packageContext *_localctx =
      _tracker.createInstance<Sv_packageContext>(_ctx, getState());
  enterRule(_localctx, 20, SV3_1aSplitterParser::RuleSv_package);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(73);
    match(SV3_1aSplitterParser::PACKAGE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EndpackageContext
//------------------------------------------------------------------

SV3_1aSplitterParser::EndpackageContext::EndpackageContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::EndpackageContext::ENDPACKAGE() {
  return getToken(SV3_1aSplitterParser::ENDPACKAGE, 0);
}

size_t SV3_1aSplitterParser::EndpackageContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleEndpackage;
}

void SV3_1aSplitterParser::EndpackageContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterEndpackage(this);
}

void SV3_1aSplitterParser::EndpackageContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitEndpackage(this);
}

SV3_1aSplitterParser::EndpackageContext *SV3_1aSplitterParser::endpackage() {
  EndpackageContext *_localctx =
      _tracker.createInstance<EndpackageContext>(_ctx, getState());
  enterRule(_localctx, 22, SV3_1aSplitterParser::RuleEndpackage);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(75);
    match(SV3_1aSplitterParser::ENDPACKAGE);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- CheckerContext
//------------------------------------------------------------------

SV3_1aSplitterParser::CheckerContext::CheckerContext(ParserRuleContext *parent,
                                                     size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::CheckerContext::CHECKER() {
  return getToken(SV3_1aSplitterParser::CHECKER, 0);
}

size_t SV3_1aSplitterParser::CheckerContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleChecker;
}

void SV3_1aSplitterParser::CheckerContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterChecker(this);
}

void SV3_1aSplitterParser::CheckerContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitChecker(this);
}

SV3_1aSplitterParser::CheckerContext *SV3_1aSplitterParser::checker() {
  CheckerContext *_localctx =
      _tracker.createInstance<CheckerContext>(_ctx, getState());
  enterRule(_localctx, 24, SV3_1aSplitterParser::RuleChecker);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(77);
    match(SV3_1aSplitterParser::CHECKER);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EndcheckerContext
//------------------------------------------------------------------

SV3_1aSplitterParser::EndcheckerContext::EndcheckerContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::EndcheckerContext::ENDCHECKER() {
  return getToken(SV3_1aSplitterParser::ENDCHECKER, 0);
}

size_t SV3_1aSplitterParser::EndcheckerContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleEndchecker;
}

void SV3_1aSplitterParser::EndcheckerContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterEndchecker(this);
}

void SV3_1aSplitterParser::EndcheckerContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitEndchecker(this);
}

SV3_1aSplitterParser::EndcheckerContext *SV3_1aSplitterParser::endchecker() {
  EndcheckerContext *_localctx =
      _tracker.createInstance<EndcheckerContext>(_ctx, getState());
  enterRule(_localctx, 26, SV3_1aSplitterParser::RuleEndchecker);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(79);
    match(SV3_1aSplitterParser::ENDCHECKER);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- ConfigContext
//------------------------------------------------------------------

SV3_1aSplitterParser::ConfigContext::ConfigContext(ParserRuleContext *parent,
                                                   size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::ConfigContext::CONFIG() {
  return getToken(SV3_1aSplitterParser::CONFIG, 0);
}

size_t SV3_1aSplitterParser::ConfigContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleConfig;
}

void SV3_1aSplitterParser::ConfigContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterConfig(this);
}

void SV3_1aSplitterParser::ConfigContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitConfig(this);
}

SV3_1aSplitterParser::ConfigContext *SV3_1aSplitterParser::config() {
  ConfigContext *_localctx =
      _tracker.createInstance<ConfigContext>(_ctx, getState());
  enterRule(_localctx, 28, SV3_1aSplitterParser::RuleConfig);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(81);
    match(SV3_1aSplitterParser::CONFIG);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- EndconfigContext
//------------------------------------------------------------------

SV3_1aSplitterParser::EndconfigContext::EndconfigContext(
    ParserRuleContext *parent, size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::EndconfigContext::ENDCONFIG() {
  return getToken(SV3_1aSplitterParser::ENDCONFIG, 0);
}

size_t SV3_1aSplitterParser::EndconfigContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleEndconfig;
}

void SV3_1aSplitterParser::EndconfigContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterEndconfig(this);
}

void SV3_1aSplitterParser::EndconfigContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitEndconfig(this);
}

SV3_1aSplitterParser::EndconfigContext *SV3_1aSplitterParser::endconfig() {
  EndconfigContext *_localctx =
      _tracker.createInstance<EndconfigContext>(_ctx, getState());
  enterRule(_localctx, 30, SV3_1aSplitterParser::RuleEndconfig);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(83);
    match(SV3_1aSplitterParser::ENDCONFIG);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

//----------------- AnyContext
//------------------------------------------------------------------

SV3_1aSplitterParser::AnyContext::AnyContext(ParserRuleContext *parent,
                                             size_t invokingState)
    : ParserRuleContext(parent, invokingState) {}

tree::TerminalNode *SV3_1aSplitterParser::AnyContext::ANY() {
  return getToken(SV3_1aSplitterParser::ANY, 0);
}

size_t SV3_1aSplitterParser::AnyContext::getRuleIndex() const {
  return SV3_1aSplitterParser::RuleAny;
}

void SV3_1aSplitterParser::AnyContext::enterRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->enterAny(this);
}

void SV3_1aSplitterParser::AnyContext::exitRule(
    tree::ParseTreeListener *listener) {
  auto parserListener = dynamic_cast<SV3_1aSplitterParserListener *>(listener);
  if (parserListener != nullptr) parserListener->exitAny(this);
}

SV3_1aSplitterParser::AnyContext *SV3_1aSplitterParser::any() {
  AnyContext *_localctx = _tracker.createInstance<AnyContext>(_ctx, getState());
  enterRule(_localctx, 32, SV3_1aSplitterParser::RuleAny);

  auto onExit = finally([=] { exitRule(); });
  try {
    enterOuterAlt(_localctx, 1);
    setState(85);
    match(SV3_1aSplitterParser::ANY);

  } catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

// Static vars and initialization.
std::vector<dfa::DFA> SV3_1aSplitterParser::_decisionToDFA;
atn::PredictionContextCache SV3_1aSplitterParser::_sharedContextCache;

// We own the ATN which in turn owns the ATN states.
atn::ATN SV3_1aSplitterParser::_atn;
std::vector<uint16_t> SV3_1aSplitterParser::_serializedATN;

std::vector<std::string> SV3_1aSplitterParser::_ruleNames = {
    "source_text",  "description", "module",     "endmodule",  "sv_interface",
    "endinterface", "program",     "endprogram", "primitive",  "endprimitive",
    "sv_package",   "endpackage",  "checker",    "endchecker", "config",
    "endconfig",    "any"};

std::vector<std::string> SV3_1aSplitterParser::_literalNames = {
    "",
    "",
    "",
    "'module'",
    "'endmodule'",
    "'interface'",
    "'endinterface'",
    "'program'",
    "'endprogram'",
    "'primivite'",
    "'endprimitive'",
    "'package'",
    "'endpackage'",
    "'checker'",
    "'endchecker'",
    "'config'",
    "'endconfig'"};

std::vector<std::string> SV3_1aSplitterParser::_symbolicNames = {
    "",           "One_line_comment", "Block_comment", "MODULE",
    "ENDMODULE",  "INTERFACE",        "ENDINTERFACE",  "PROGRAM",
    "ENDPROGRAM", "PRIMITIVE",        "ENDPRIMITIVE",  "PACKAGE",
    "ENDPACKAGE", "CHECKER",          "ENDCHECKER",    "CONFIG",
    "ENDCONFIG",  "String",           "Spaces",        "CR",
    "ANY"};

dfa::Vocabulary SV3_1aSplitterParser::_vocabulary(_literalNames,
                                                  _symbolicNames);

std::vector<std::string> SV3_1aSplitterParser::_tokenNames;

SV3_1aSplitterParser::Initializer::Initializer() {
  for (size_t i = 0; i < _symbolicNames.size(); ++i) {
    std::string name = _vocabulary.getLiteralName(i);
    if (name.empty()) {
      name = _vocabulary.getSymbolicName(i);
    }

    if (name.empty()) {
      _tokenNames.push_back("<INVALID>");
    } else {
      _tokenNames.push_back(name);
    }
  }

  _serializedATN = {
      0x3,  0x608b, 0xa72a, 0x8133, 0xb9ed, 0x417c, 0x3be7, 0x7786, 0x5964,
      0x3,  0x16,   0x5a,   0x4,    0x2,    0x9,    0x2,    0x4,    0x3,
      0x9,  0x3,    0x4,    0x4,    0x9,    0x4,    0x4,    0x5,    0x9,
      0x5,  0x4,    0x6,    0x9,    0x6,    0x4,    0x7,    0x9,    0x7,
      0x4,  0x8,    0x9,    0x8,    0x4,    0x9,    0x9,    0x9,    0x4,
      0xa,  0x9,    0xa,    0x4,    0xb,    0x9,    0xb,    0x4,    0xc,
      0x9,  0xc,    0x4,    0xd,    0x9,    0xd,    0x4,    0xe,    0x9,
      0xe,  0x4,    0xf,    0x9,    0xf,    0x4,    0x10,   0x9,    0x10,
      0x4,  0x11,   0x9,    0x11,   0x4,    0x12,   0x9,    0x12,   0x3,
      0x2,  0x7,    0x2,    0x26,   0xa,    0x2,    0xc,    0x2,    0xe,
      0x2,  0x29,   0xb,    0x2,    0x3,    0x3,    0x3,    0x3,    0x3,
      0x3,  0x3,    0x3,    0x3,    0x3,    0x3,    0x3,    0x3,    0x3,
      0x3,  0x3,    0x3,    0x3,    0x3,    0x3,    0x3,    0x3,    0x3,
      0x3,  0x3,    0x3,    0x3,    0x3,    0x3,    0x3,    0x5,    0x3,
      0x3a, 0xa,    0x3,    0x3,    0x4,    0x3,    0x4,    0x3,    0x5,
      0x3,  0x5,    0x3,    0x6,    0x3,    0x6,    0x3,    0x7,    0x3,
      0x7,  0x3,    0x8,    0x3,    0x8,    0x3,    0x9,    0x3,    0x9,
      0x3,  0xa,    0x3,    0xa,    0x3,    0xb,    0x3,    0xb,    0x3,
      0xc,  0x3,    0xc,    0x3,    0xd,    0x3,    0xd,    0x3,    0xe,
      0x3,  0xe,    0x3,    0xf,    0x3,    0xf,    0x3,    0x10,   0x3,
      0x10, 0x3,    0x11,   0x3,    0x11,   0x3,    0x12,   0x3,    0x12,
      0x3,  0x12,   0x2,    0x2,    0x13,   0x2,    0x4,    0x6,    0x8,
      0xa,  0xc,    0xe,    0x10,   0x12,   0x14,   0x16,   0x18,   0x1a,
      0x1c, 0x1e,   0x20,   0x22,   0x2,    0x2,    0x2,    0x57,   0x2,
      0x27, 0x3,    0x2,    0x2,    0x2,    0x4,    0x39,   0x3,    0x2,
      0x2,  0x2,    0x6,    0x3b,   0x3,    0x2,    0x2,    0x2,    0x8,
      0x3d, 0x3,    0x2,    0x2,    0x2,    0xa,    0x3f,   0x3,    0x2,
      0x2,  0x2,    0xc,    0x41,   0x3,    0x2,    0x2,    0x2,    0xe,
      0x43, 0x3,    0x2,    0x2,    0x2,    0x10,   0x45,   0x3,    0x2,
      0x2,  0x2,    0x12,   0x47,   0x3,    0x2,    0x2,    0x2,    0x14,
      0x49, 0x3,    0x2,    0x2,    0x2,    0x16,   0x4b,   0x3,    0x2,
      0x2,  0x2,    0x18,   0x4d,   0x3,    0x2,    0x2,    0x2,    0x1a,
      0x4f, 0x3,    0x2,    0x2,    0x2,    0x1c,   0x51,   0x3,    0x2,
      0x2,  0x2,    0x1e,   0x53,   0x3,    0x2,    0x2,    0x2,    0x20,
      0x55, 0x3,    0x2,    0x2,    0x2,    0x22,   0x57,   0x3,    0x2,
      0x2,  0x2,    0x24,   0x26,   0x5,    0x4,    0x3,    0x2,    0x25,
      0x24, 0x3,    0x2,    0x2,    0x2,    0x26,   0x29,   0x3,    0x2,
      0x2,  0x2,    0x27,   0x25,   0x3,    0x2,    0x2,    0x2,    0x27,
      0x28, 0x3,    0x2,    0x2,    0x2,    0x28,   0x3,    0x3,    0x2,
      0x2,  0x2,    0x29,   0x27,   0x3,    0x2,    0x2,    0x2,    0x2a,
      0x3a, 0x5,    0x6,    0x4,    0x2,    0x2b,   0x3a,   0x5,    0x8,
      0x5,  0x2,    0x2c,   0x3a,   0x5,    0xa,    0x6,    0x2,    0x2d,
      0x3a, 0x5,    0xc,    0x7,    0x2,    0x2e,   0x3a,   0x5,    0xe,
      0x8,  0x2,    0x2f,   0x3a,   0x5,    0x10,   0x9,    0x2,    0x30,
      0x3a, 0x5,    0x12,   0xa,    0x2,    0x31,   0x3a,   0x5,    0x14,
      0xb,  0x2,    0x32,   0x3a,   0x5,    0x16,   0xc,    0x2,    0x33,
      0x3a, 0x5,    0x18,   0xd,    0x2,    0x34,   0x3a,   0x5,    0x1a,
      0xe,  0x2,    0x35,   0x3a,   0x5,    0x1c,   0xf,    0x2,    0x36,
      0x3a, 0x5,    0x1e,   0x10,   0x2,    0x37,   0x3a,   0x5,    0x20,
      0x11, 0x2,    0x38,   0x3a,   0x7,    0x16,   0x2,    0x2,    0x39,
      0x2a, 0x3,    0x2,    0x2,    0x2,    0x39,   0x2b,   0x3,    0x2,
      0x2,  0x2,    0x39,   0x2c,   0x3,    0x2,    0x2,    0x2,    0x39,
      0x2d, 0x3,    0x2,    0x2,    0x2,    0x39,   0x2e,   0x3,    0x2,
      0x2,  0x2,    0x39,   0x2f,   0x3,    0x2,    0x2,    0x2,    0x39,
      0x30, 0x3,    0x2,    0x2,    0x2,    0x39,   0x31,   0x3,    0x2,
      0x2,  0x2,    0x39,   0x32,   0x3,    0x2,    0x2,    0x2,    0x39,
      0x33, 0x3,    0x2,    0x2,    0x2,    0x39,   0x34,   0x3,    0x2,
      0x2,  0x2,    0x39,   0x35,   0x3,    0x2,    0x2,    0x2,    0x39,
      0x36, 0x3,    0x2,    0x2,    0x2,    0x39,   0x37,   0x3,    0x2,
      0x2,  0x2,    0x39,   0x38,   0x3,    0x2,    0x2,    0x2,    0x3a,
      0x5,  0x3,    0x2,    0x2,    0x2,    0x3b,   0x3c,   0x7,    0x5,
      0x2,  0x2,    0x3c,   0x7,    0x3,    0x2,    0x2,    0x2,    0x3d,
      0x3e, 0x7,    0x6,    0x2,    0x2,    0x3e,   0x9,    0x3,    0x2,
      0x2,  0x2,    0x3f,   0x40,   0x7,    0x7,    0x2,    0x2,    0x40,
      0xb,  0x3,    0x2,    0x2,    0x2,    0x41,   0x42,   0x7,    0x8,
      0x2,  0x2,    0x42,   0xd,    0x3,    0x2,    0x2,    0x2,    0x43,
      0x44, 0x7,    0x9,    0x2,    0x2,    0x44,   0xf,    0x3,    0x2,
      0x2,  0x2,    0x45,   0x46,   0x7,    0xa,    0x2,    0x2,    0x46,
      0x11, 0x3,    0x2,    0x2,    0x2,    0x47,   0x48,   0x7,    0xb,
      0x2,  0x2,    0x48,   0x13,   0x3,    0x2,    0x2,    0x2,    0x49,
      0x4a, 0x7,    0xc,    0x2,    0x2,    0x4a,   0x15,   0x3,    0x2,
      0x2,  0x2,    0x4b,   0x4c,   0x7,    0xd,    0x2,    0x2,    0x4c,
      0x17, 0x3,    0x2,    0x2,    0x2,    0x4d,   0x4e,   0x7,    0xe,
      0x2,  0x2,    0x4e,   0x19,   0x3,    0x2,    0x2,    0x2,    0x4f,
      0x50, 0x7,    0xf,    0x2,    0x2,    0x50,   0x1b,   0x3,    0x2,
      0x2,  0x2,    0x51,   0x52,   0x7,    0x10,   0x2,    0x2,    0x52,
      0x1d, 0x3,    0x2,    0x2,    0x2,    0x53,   0x54,   0x7,    0x11,
      0x2,  0x2,    0x54,   0x1f,   0x3,    0x2,    0x2,    0x2,    0x55,
      0x56, 0x7,    0x12,   0x2,    0x2,    0x56,   0x21,   0x3,    0x2,
      0x2,  0x2,    0x57,   0x58,   0x7,    0x16,   0x2,    0x2,    0x58,
      0x23, 0x3,    0x2,    0x2,    0x2,    0x4,    0x27,   0x39,
  };

  atn::ATNDeserializer deserializer;
  _atn = deserializer.deserialize(_serializedATN);

  size_t count = _atn.getNumberOfDecisions();
  _decisionToDFA.reserve(count);
  for (size_t i = 0; i < count; i++) {
    _decisionToDFA.emplace_back(_atn.getDecisionState(i), i);
  }
}

SV3_1aSplitterParser::Initializer SV3_1aSplitterParser::_init;
