diff --git a/CMakeLists.txt b/CMakeLists.txt
index 27e056b..c1944ac 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -95,7 +95,7 @@
 add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/src/SourceCompile/VObjectTypes.cpp
   COMMAND echo "       Parser Generation..."
   COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/src/parser/
-  COMMAND java -jar ${ANTLR_JAR_LOCATION} -Werror -Dlanguage=Cpp -listener -visitor -o ${PROJECT_SOURCE_DIR}/src/parser/  ${PROJECT_SOURCE_DIR}/grammar/SV3_1aPpLexer.g4  ${PROJECT_SOURCE_DIR}/grammar/SV3_1aLexer.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aSplitterLexer.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aPpParser.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aParser.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aSplitterParser.g4
+  COMMAND java -jar ${ANTLR_JAR_LOCATION} -Werror -Dlanguage=Cpp -o ${PROJECT_SOURCE_DIR}/src/parser/  ${PROJECT_SOURCE_DIR}/grammar/SV3_1aPpLexer.g4  ${PROJECT_SOURCE_DIR}/grammar/SV3_1aLexer.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aSplitterLexer.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aPpParser.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aParser.g4 ${PROJECT_SOURCE_DIR}/grammar/SV3_1aSplitterParser.g4
   COMMAND echo "       Serializer, Parser Listener, code generation..."
   COMMAND SourceCompile/generate_parser_listener.tcl ;
   COMMAND API/generate_python_listener_api.tcl ;
diff --git a/src/parser/SV3_1aParser.cpp b/src/parser/SV3_1aParser.cpp
index 50b4b74..b96cfb7 100644
--- a/src/parser/SV3_1aParser.cpp
+++ b/src/parser/SV3_1aParser.cpp
@@ -3,7 +3,6 @@
 
 
 #include "SV3_1aParserListener.h"
-#include "SV3_1aParserVisitor.h"
 
 #include "SV3_1aParser.h"
 
@@ -67,14 +66,6 @@
     parserListener->exitTop_level_rule(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Top_level_ruleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTop_level_rule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Top_level_ruleContext* SV3_1aParser::top_level_rule() {
   Top_level_ruleContext *_localctx = _tracker.createInstance<Top_level_ruleContext>(_ctx, getState());
   enterRule(_localctx, 0, SV3_1aParser::RuleTop_level_rule);
@@ -136,14 +127,6 @@
     parserListener->exitTop_level_library_rule(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Top_level_library_ruleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTop_level_library_rule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Top_level_library_ruleContext* SV3_1aParser::top_level_library_rule() {
   Top_level_library_ruleContext *_localctx = _tracker.createInstance<Top_level_library_ruleContext>(_ctx, getState());
   enterRule(_localctx, 2, SV3_1aParser::RuleTop_level_library_rule);
@@ -201,14 +184,6 @@
     parserListener->exitLibrary_text(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Library_textContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLibrary_text(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Library_textContext* SV3_1aParser::library_text() {
   Library_textContext *_localctx = _tracker.createInstance<Library_textContext>(_ctx, getState());
   enterRule(_localctx, 4, SV3_1aParser::RuleLibrary_text);
@@ -283,14 +258,6 @@
     parserListener->exitLibrary_descriptions(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Library_descriptionsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLibrary_descriptions(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Library_descriptionsContext* SV3_1aParser::library_descriptions() {
   Library_descriptionsContext *_localctx = _tracker.createInstance<Library_descriptionsContext>(_ctx, getState());
   enterRule(_localctx, 6, SV3_1aParser::RuleLibrary_descriptions);
@@ -399,14 +366,6 @@
     parserListener->exitLibrary_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Library_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLibrary_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Library_declarationContext* SV3_1aParser::library_declaration() {
   Library_declarationContext *_localctx = _tracker.createInstance<Library_declarationContext>(_ctx, getState());
   enterRule(_localctx, 8, SV3_1aParser::RuleLibrary_declaration);
@@ -541,14 +500,6 @@
     parserListener->exitFile_path_spec(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::File_path_specContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFile_path_spec(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::File_path_specContext* SV3_1aParser::file_path_spec() {
   File_path_specContext *_localctx = _tracker.createInstance<File_path_specContext>(_ctx, getState());
   enterRule(_localctx, 10, SV3_1aParser::RuleFile_path_spec);
@@ -628,14 +579,6 @@
     parserListener->exitInclude_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Include_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInclude_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Include_statementContext* SV3_1aParser::include_statement() {
   Include_statementContext *_localctx = _tracker.createInstance<Include_statementContext>(_ctx, getState());
   enterRule(_localctx, 12, SV3_1aParser::RuleInclude_statement);
@@ -697,14 +640,6 @@
     parserListener->exitSource_text(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Source_textContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSource_text(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Source_textContext* SV3_1aParser::source_text() {
   Source_textContext *_localctx = _tracker.createInstance<Source_textContext>(_ctx, getState());
   enterRule(_localctx, 14, SV3_1aParser::RuleSource_text);
@@ -889,14 +824,6 @@
     parserListener->exitNull_rule(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Null_ruleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNull_rule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Null_ruleContext* SV3_1aParser::null_rule() {
   Null_ruleContext *_localctx = _tracker.createInstance<Null_ruleContext>(_ctx, getState());
   enterRule(_localctx, 16, SV3_1aParser::RuleNull_rule);
@@ -989,14 +916,6 @@
     parserListener->exitDescription(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::DescriptionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDescription(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::DescriptionContext* SV3_1aParser::description() {
   DescriptionContext *_localctx = _tracker.createInstance<DescriptionContext>(_ctx, getState());
   enterRule(_localctx, 18, SV3_1aParser::RuleDescription);
@@ -1171,14 +1090,6 @@
     parserListener->exitModule_nonansi_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_nonansi_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_nonansi_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_nonansi_headerContext* SV3_1aParser::module_nonansi_header() {
   Module_nonansi_headerContext *_localctx = _tracker.createInstance<Module_nonansi_headerContext>(_ctx, getState());
   enterRule(_localctx, 20, SV3_1aParser::RuleModule_nonansi_header);
@@ -1309,14 +1220,6 @@
     parserListener->exitModule_ansi_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_ansi_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_ansi_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_ansi_headerContext* SV3_1aParser::module_ansi_header() {
   Module_ansi_headerContext *_localctx = _tracker.createInstance<Module_ansi_headerContext>(_ctx, getState());
   enterRule(_localctx, 22, SV3_1aParser::RuleModule_ansi_header);
@@ -1497,14 +1400,6 @@
     parserListener->exitModule_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_declarationContext* SV3_1aParser::module_declaration() {
   Module_declarationContext *_localctx = _tracker.createInstance<Module_declarationContext>(_ctx, getState());
   enterRule(_localctx, 24, SV3_1aParser::RuleModule_declaration);
@@ -2124,14 +2019,6 @@
     parserListener->exitEndmodule(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndmoduleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndmodule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndmoduleContext* SV3_1aParser::endmodule() {
   EndmoduleContext *_localctx = _tracker.createInstance<EndmoduleContext>(_ctx, getState());
   enterRule(_localctx, 26, SV3_1aParser::RuleEndmodule);
@@ -2185,14 +2072,6 @@
     parserListener->exitModule_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_keywordContext* SV3_1aParser::module_keyword() {
   Module_keywordContext *_localctx = _tracker.createInstance<Module_keywordContext>(_ctx, getState());
   enterRule(_localctx, 28, SV3_1aParser::RuleModule_keyword);
@@ -2280,14 +2159,6 @@
     parserListener->exitInterface_nonansi_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_nonansi_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_nonansi_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_nonansi_headerContext* SV3_1aParser::interface_nonansi_header() {
   Interface_nonansi_headerContext *_localctx = _tracker.createInstance<Interface_nonansi_headerContext>(_ctx, getState());
   enterRule(_localctx, 30, SV3_1aParser::RuleInterface_nonansi_header);
@@ -2400,14 +2271,6 @@
     parserListener->exitInterface_ansi_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_ansi_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_ansi_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_ansi_headerContext* SV3_1aParser::interface_ansi_header() {
   Interface_ansi_headerContext *_localctx = _tracker.createInstance<Interface_ansi_headerContext>(_ctx, getState());
   enterRule(_localctx, 32, SV3_1aParser::RuleInterface_ansi_header);
@@ -2570,14 +2433,6 @@
     parserListener->exitInterface_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_declarationContext* SV3_1aParser::interface_declaration() {
   Interface_declarationContext *_localctx = _tracker.createInstance<Interface_declarationContext>(_ctx, getState());
   enterRule(_localctx, 34, SV3_1aParser::RuleInterface_declaration);
@@ -3092,14 +2947,6 @@
     parserListener->exitEndinterface(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndinterfaceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndinterface(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndinterfaceContext* SV3_1aParser::endinterface() {
   EndinterfaceContext *_localctx = _tracker.createInstance<EndinterfaceContext>(_ctx, getState());
   enterRule(_localctx, 36, SV3_1aParser::RuleEndinterface);
@@ -3173,14 +3020,6 @@
     parserListener->exitProgram_nonansi_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Program_nonansi_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProgram_nonansi_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Program_nonansi_headerContext* SV3_1aParser::program_nonansi_header() {
   Program_nonansi_headerContext *_localctx = _tracker.createInstance<Program_nonansi_headerContext>(_ctx, getState());
   enterRule(_localctx, 38, SV3_1aParser::RuleProgram_nonansi_header);
@@ -3285,14 +3124,6 @@
     parserListener->exitProgram_ansi_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Program_ansi_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProgram_ansi_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Program_ansi_headerContext* SV3_1aParser::program_ansi_header() {
   Program_ansi_headerContext *_localctx = _tracker.createInstance<Program_ansi_headerContext>(_ctx, getState());
   enterRule(_localctx, 40, SV3_1aParser::RuleProgram_ansi_header);
@@ -3383,14 +3214,6 @@
     parserListener->exitEndchecker(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndcheckerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndchecker(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndcheckerContext* SV3_1aParser::endchecker() {
   EndcheckerContext *_localctx = _tracker.createInstance<EndcheckerContext>(_ctx, getState());
   enterRule(_localctx, 42, SV3_1aParser::RuleEndchecker);
@@ -3488,14 +3311,6 @@
     parserListener->exitChecker_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Checker_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChecker_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Checker_declarationContext* SV3_1aParser::checker_declaration() {
   Checker_declarationContext *_localctx = _tracker.createInstance<Checker_declarationContext>(_ctx, getState());
   enterRule(_localctx, 44, SV3_1aParser::RuleChecker_declaration);
@@ -3790,14 +3605,6 @@
     parserListener->exitProgram_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Program_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProgram_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Program_declarationContext* SV3_1aParser::program_declaration() {
   Program_declarationContext *_localctx = _tracker.createInstance<Program_declarationContext>(_ctx, getState());
   enterRule(_localctx, 46, SV3_1aParser::RuleProgram_declaration);
@@ -4289,14 +4096,6 @@
     parserListener->exitEndprogram(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndprogramContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndprogram(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndprogramContext* SV3_1aParser::endprogram() {
   EndprogramContext *_localctx = _tracker.createInstance<EndprogramContext>(_ctx, getState());
   enterRule(_localctx, 48, SV3_1aParser::RuleEndprogram);
@@ -4426,14 +4225,6 @@
     parserListener->exitClass_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_declarationContext* SV3_1aParser::class_declaration() {
   Class_declarationContext *_localctx = _tracker.createInstance<Class_declarationContext>(_ctx, getState());
   enterRule(_localctx, 50, SV3_1aParser::RuleClass_declaration);
@@ -4638,14 +4429,6 @@
     parserListener->exitEndclass(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndclassContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndclass(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndclassContext* SV3_1aParser::endclass() {
   EndclassContext *_localctx = _tracker.createInstance<EndclassContext>(_ctx, getState());
   enterRule(_localctx, 52, SV3_1aParser::RuleEndclass);
@@ -4699,14 +4482,6 @@
     parserListener->exitInterface_class_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_class_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_class_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_class_typeContext* SV3_1aParser::interface_class_type() {
   Interface_class_typeContext *_localctx = _tracker.createInstance<Interface_class_typeContext>(_ctx, getState());
   enterRule(_localctx, 54, SV3_1aParser::RuleInterface_class_type);
@@ -4821,14 +4596,6 @@
     parserListener->exitInterface_class_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_class_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_class_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_class_declarationContext* SV3_1aParser::interface_class_declaration() {
   Interface_class_declarationContext *_localctx = _tracker.createInstance<Interface_class_declarationContext>(_ctx, getState());
   enterRule(_localctx, 56, SV3_1aParser::RuleInterface_class_declaration);
@@ -4966,14 +4733,6 @@
     parserListener->exitInterface_class_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_class_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_class_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_class_itemContext* SV3_1aParser::interface_class_item() {
   Interface_class_itemContext *_localctx = _tracker.createInstance<Interface_class_itemContext>(_ctx, getState());
   enterRule(_localctx, 58, SV3_1aParser::RuleInterface_class_item);
@@ -5087,14 +4846,6 @@
     parserListener->exitInterface_class_method(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_class_methodContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_class_method(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_class_methodContext* SV3_1aParser::interface_class_method() {
   Interface_class_methodContext *_localctx = _tracker.createInstance<Interface_class_methodContext>(_ctx, getState());
   enterRule(_localctx, 60, SV3_1aParser::RuleInterface_class_method);
@@ -5148,14 +4899,6 @@
     parserListener->exitEndpackage(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndpackageContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndpackage(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndpackageContext* SV3_1aParser::endpackage() {
   EndpackageContext *_localctx = _tracker.createInstance<EndpackageContext>(_ctx, getState());
   enterRule(_localctx, 62, SV3_1aParser::RuleEndpackage);
@@ -5245,14 +4988,6 @@
     parserListener->exitPackage_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Package_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPackage_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Package_declarationContext* SV3_1aParser::package_declaration() {
   Package_declarationContext *_localctx = _tracker.createInstance<Package_declarationContext>(_ctx, getState());
   enterRule(_localctx, 64, SV3_1aParser::RulePackage_declaration);
@@ -5458,13 +5193,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimeUnitsDecl_TimeUnitDiv(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimeUnitsDecl_TimeUnitDivContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimeUnitsDecl_TimeUnitDiv(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TimeUnitsDecl_TimePrecisionTimeUnitContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TimeUnitsDecl_TimePrecisionTimeUnitContext::TIMEPRECISION() {
@@ -5503,13 +5231,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimeUnitsDecl_TimePrecisionTimeUnit(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimeUnitsDecl_TimePrecisionTimeUnitContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimeUnitsDecl_TimePrecisionTimeUnit(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TimeUnitsDecl_TimeUnitTimePrecisionContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TimeUnitsDecl_TimeUnitTimePrecisionContext::TIMEUNIT() {
@@ -5548,13 +5269,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimeUnitsDecl_TimeUnitTimePrecision(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimeUnitsDecl_TimeUnitTimePrecisionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimeUnitsDecl_TimeUnitTimePrecision(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TimeUnitsDecl_TimeUnitContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TimeUnitsDecl_TimeUnitContext::TIMEUNIT() {
@@ -5581,13 +5295,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimeUnitsDecl_TimeUnit(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimeUnitsDecl_TimeUnitContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimeUnitsDecl_TimeUnit(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TimeUnitsDecl_TimePrecisionContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TimeUnitsDecl_TimePrecisionContext::TIMEPRECISION() {
@@ -5614,13 +5321,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimeUnitsDecl_TimePrecision(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimeUnitsDecl_TimePrecisionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimeUnitsDecl_TimePrecision(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Timeunits_declarationContext* SV3_1aParser::timeunits_declaration() {
   Timeunits_declarationContext *_localctx = _tracker.createInstance<Timeunits_declarationContext>(_ctx, getState());
   enterRule(_localctx, 66, SV3_1aParser::RuleTimeunits_declaration);
@@ -5775,14 +5475,6 @@
     parserListener->exitParameter_port_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Parameter_port_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParameter_port_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Parameter_port_listContext* SV3_1aParser::parameter_port_list() {
   Parameter_port_listContext *_localctx = _tracker.createInstance<Parameter_port_listContext>(_ctx, getState());
   enterRule(_localctx, 68, SV3_1aParser::RuleParameter_port_list);
@@ -5915,14 +5607,6 @@
     parserListener->exitParameter_port_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Parameter_port_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParameter_port_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Parameter_port_declarationContext* SV3_1aParser::parameter_port_declaration() {
   Parameter_port_declarationContext *_localctx = _tracker.createInstance<Parameter_port_declarationContext>(_ctx, getState());
   enterRule(_localctx, 70, SV3_1aParser::RuleParameter_port_declaration);
@@ -6025,14 +5709,6 @@
     parserListener->exitList_of_ports(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_portsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_ports(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_portsContext* SV3_1aParser::list_of_ports() {
   List_of_portsContext *_localctx = _tracker.createInstance<List_of_portsContext>(_ctx, getState());
   enterRule(_localctx, 72, SV3_1aParser::RuleList_of_ports);
@@ -6127,14 +5803,6 @@
     parserListener->exitList_of_port_declarations(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_port_declarationsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_port_declarations(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_port_declarationsContext* SV3_1aParser::list_of_port_declarations() {
   List_of_port_declarationsContext *_localctx = _tracker.createInstance<List_of_port_declarationsContext>(_ctx, getState());
   enterRule(_localctx, 74, SV3_1aParser::RuleList_of_port_declarations);
@@ -6309,14 +5977,6 @@
     parserListener->exitPort_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Port_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPort_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Port_declarationContext* SV3_1aParser::port_declaration() {
   Port_declarationContext *_localctx = _tracker.createInstance<Port_declarationContext>(_ctx, getState());
   enterRule(_localctx, 76, SV3_1aParser::RulePort_declaration);
@@ -6445,14 +6105,6 @@
     parserListener->exitPort(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::PortContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPort(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::PortContext* SV3_1aParser::port() {
   PortContext *_localctx = _tracker.createInstance<PortContext>(_ctx, getState());
   enterRule(_localctx, 78, SV3_1aParser::RulePort);
@@ -6558,14 +6210,6 @@
     parserListener->exitPort_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Port_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPort_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Port_expressionContext* SV3_1aParser::port_expression() {
   Port_expressionContext *_localctx = _tracker.createInstance<Port_expressionContext>(_ctx, getState());
   enterRule(_localctx, 80, SV3_1aParser::RulePort_expression);
@@ -6676,14 +6320,6 @@
     parserListener->exitPort_reference(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Port_referenceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPort_reference(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Port_referenceContext* SV3_1aParser::port_reference() {
   Port_referenceContext *_localctx = _tracker.createInstance<Port_referenceContext>(_ctx, getState());
   enterRule(_localctx, 82, SV3_1aParser::RulePort_reference);
@@ -6741,13 +6377,6 @@
   if (parserListener != nullptr)
     parserListener->exitPortDir_Inp(this);
 }
-
-antlrcpp::Any SV3_1aParser::PortDir_InpContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPortDir_Inp(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PortDir_OutContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PortDir_OutContext::OUTPUT() {
@@ -6766,13 +6395,6 @@
   if (parserListener != nullptr)
     parserListener->exitPortDir_Out(this);
 }
-
-antlrcpp::Any SV3_1aParser::PortDir_OutContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPortDir_Out(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PortDir_RefContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PortDir_RefContext::REF() {
@@ -6791,13 +6413,6 @@
   if (parserListener != nullptr)
     parserListener->exitPortDir_Ref(this);
 }
-
-antlrcpp::Any SV3_1aParser::PortDir_RefContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPortDir_Ref(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PortDir_InoutContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PortDir_InoutContext::INOUT() {
@@ -6816,13 +6431,6 @@
   if (parserListener != nullptr)
     parserListener->exitPortDir_Inout(this);
 }
-
-antlrcpp::Any SV3_1aParser::PortDir_InoutContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPortDir_Inout(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Port_directionContext* SV3_1aParser::port_direction() {
   Port_directionContext *_localctx = _tracker.createInstance<Port_directionContext>(_ctx, getState());
   enterRule(_localctx, 84, SV3_1aParser::RulePort_direction);
@@ -6911,14 +6519,6 @@
     parserListener->exitNet_port_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_port_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_port_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_port_headerContext* SV3_1aParser::net_port_header() {
   Net_port_headerContext *_localctx = _tracker.createInstance<Net_port_headerContext>(_ctx, getState());
   enterRule(_localctx, 86, SV3_1aParser::RuleNet_port_header);
@@ -6985,14 +6585,6 @@
     parserListener->exitVariable_port_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Variable_port_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVariable_port_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Variable_port_headerContext* SV3_1aParser::variable_port_header() {
   Variable_port_headerContext *_localctx = _tracker.createInstance<Variable_port_headerContext>(_ctx, getState());
   enterRule(_localctx, 88, SV3_1aParser::RuleVariable_port_header);
@@ -7067,14 +6659,6 @@
     parserListener->exitInterface_port_header(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_port_headerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_port_header(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_port_headerContext* SV3_1aParser::interface_port_header() {
   Interface_port_headerContext *_localctx = _tracker.createInstance<Interface_port_headerContext>(_ctx, getState());
   enterRule(_localctx, 90, SV3_1aParser::RuleInterface_port_header);
@@ -7232,14 +6816,6 @@
     parserListener->exitAnsi_port_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ansi_port_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAnsi_port_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ansi_port_declarationContext* SV3_1aParser::ansi_port_declaration() {
   Ansi_port_declarationContext *_localctx = _tracker.createInstance<Ansi_port_declarationContext>(_ctx, getState());
   enterRule(_localctx, 92, SV3_1aParser::RuleAnsi_port_declaration);
@@ -7507,14 +7083,6 @@
     parserListener->exitElaboration_system_task(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Elaboration_system_taskContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitElaboration_system_task(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Elaboration_system_taskContext* SV3_1aParser::elaboration_system_task() {
   Elaboration_system_taskContext *_localctx = _tracker.createInstance<Elaboration_system_taskContext>(_ctx, getState());
   enterRule(_localctx, 94, SV3_1aParser::RuleElaboration_system_task);
@@ -7720,14 +7288,6 @@
     parserListener->exitModule_common_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_common_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_common_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_common_itemContext* SV3_1aParser::module_common_item() {
   Module_common_itemContext *_localctx = _tracker.createInstance<Module_common_itemContext>(_ctx, getState());
   enterRule(_localctx, 96, SV3_1aParser::RuleModule_common_item);
@@ -7884,14 +7444,6 @@
     parserListener->exitModule_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_itemContext* SV3_1aParser::module_item() {
   Module_itemContext *_localctx = _tracker.createInstance<Module_itemContext>(_ctx, getState());
   enterRule(_localctx, 98, SV3_1aParser::RuleModule_item);
@@ -7982,14 +7534,6 @@
     parserListener->exitModule_or_generate_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_or_generate_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_or_generate_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_or_generate_itemContext* SV3_1aParser::module_or_generate_item() {
   Module_or_generate_itemContext *_localctx = _tracker.createInstance<Module_or_generate_itemContext>(_ctx, getState());
   enterRule(_localctx, 100, SV3_1aParser::RuleModule_or_generate_item);
@@ -8118,14 +7662,6 @@
     parserListener->exitModule_or_generate_item_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_or_generate_item_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_or_generate_item_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_or_generate_item_declarationContext* SV3_1aParser::module_or_generate_item_declaration() {
   Module_or_generate_item_declarationContext *_localctx = _tracker.createInstance<Module_or_generate_item_declarationContext>(_ctx, getState());
   enterRule(_localctx, 102, SV3_1aParser::RuleModule_or_generate_item_declaration);
@@ -8269,14 +7805,6 @@
     parserListener->exitNon_port_module_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Non_port_module_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNon_port_module_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Non_port_module_itemContext* SV3_1aParser::non_port_module_item() {
   Non_port_module_itemContext *_localctx = _tracker.createInstance<Non_port_module_itemContext>(_ctx, getState());
   enterRule(_localctx, 104, SV3_1aParser::RuleNon_port_module_item);
@@ -8416,14 +7944,6 @@
     parserListener->exitParameter_override(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Parameter_overrideContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParameter_override(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Parameter_overrideContext* SV3_1aParser::parameter_override() {
   Parameter_overrideContext *_localctx = _tracker.createInstance<Parameter_overrideContext>(_ctx, getState());
   enterRule(_localctx, 106, SV3_1aParser::RuleParameter_override);
@@ -8529,14 +8049,6 @@
     parserListener->exitBind_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bind_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBind_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bind_directiveContext* SV3_1aParser::bind_directive() {
   Bind_directiveContext *_localctx = _tracker.createInstance<Bind_directiveContext>(_ctx, getState());
   enterRule(_localctx, 108, SV3_1aParser::RuleBind_directive);
@@ -8642,14 +8154,6 @@
     parserListener->exitBind_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bind_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBind_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bind_instantiationContext* SV3_1aParser::bind_instantiation() {
   Bind_instantiationContext *_localctx = _tracker.createInstance<Bind_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 110, SV3_1aParser::RuleBind_instantiation);
@@ -8764,14 +8268,6 @@
     parserListener->exitInterface_or_generate_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_or_generate_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_or_generate_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_or_generate_itemContext* SV3_1aParser::interface_or_generate_item() {
   Interface_or_generate_itemContext *_localctx = _tracker.createInstance<Interface_or_generate_itemContext>(_ctx, getState());
   enterRule(_localctx, 112, SV3_1aParser::RuleInterface_or_generate_item);
@@ -8976,14 +8472,6 @@
     parserListener->exitExtern_tf_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Extern_tf_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExtern_tf_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Extern_tf_declarationContext* SV3_1aParser::extern_tf_declaration() {
   Extern_tf_declarationContext *_localctx = _tracker.createInstance<Extern_tf_declarationContext>(_ctx, getState());
   enterRule(_localctx, 114, SV3_1aParser::RuleExtern_tf_declaration);
@@ -9066,14 +8554,6 @@
     parserListener->exitInterface_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_itemContext* SV3_1aParser::interface_item() {
   Interface_itemContext *_localctx = _tracker.createInstance<Interface_itemContext>(_ctx, getState());
   enterRule(_localctx, 116, SV3_1aParser::RuleInterface_item);
@@ -9172,14 +8652,6 @@
     parserListener->exitNon_port_interface_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Non_port_interface_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNon_port_interface_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Non_port_interface_itemContext* SV3_1aParser::non_port_interface_item() {
   Non_port_interface_itemContext *_localctx = _tracker.createInstance<Non_port_interface_itemContext>(_ctx, getState());
   enterRule(_localctx, 118, SV3_1aParser::RuleNon_port_interface_item);
@@ -9298,14 +8770,6 @@
     parserListener->exitProgram_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Program_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProgram_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Program_itemContext* SV3_1aParser::program_item() {
   Program_itemContext *_localctx = _tracker.createInstance<Program_itemContext>(_ctx, getState());
   enterRule(_localctx, 120, SV3_1aParser::RuleProgram_item);
@@ -9412,14 +8876,6 @@
     parserListener->exitNon_port_program_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Non_port_program_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNon_port_program_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Non_port_program_itemContext* SV3_1aParser::non_port_program_item() {
   Non_port_program_itemContext *_localctx = _tracker.createInstance<Non_port_program_itemContext>(_ctx, getState());
   enterRule(_localctx, 122, SV3_1aParser::RuleNon_port_program_item);
@@ -9606,14 +9062,6 @@
     parserListener->exitProgram_generate_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Program_generate_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProgram_generate_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Program_generate_itemContext* SV3_1aParser::program_generate_item() {
   Program_generate_itemContext *_localctx = _tracker.createInstance<Program_generate_itemContext>(_ctx, getState());
   enterRule(_localctx, 124, SV3_1aParser::RuleProgram_generate_item);
@@ -9703,14 +9151,6 @@
     parserListener->exitChecker_port_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Checker_port_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChecker_port_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Checker_port_listContext* SV3_1aParser::checker_port_list() {
   Checker_port_listContext *_localctx = _tracker.createInstance<Checker_port_listContext>(_ctx, getState());
   enterRule(_localctx, 126, SV3_1aParser::RuleChecker_port_list);
@@ -9807,14 +9247,6 @@
     parserListener->exitChecker_port_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Checker_port_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChecker_port_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Checker_port_itemContext* SV3_1aParser::checker_port_item() {
   Checker_port_itemContext *_localctx = _tracker.createInstance<Checker_port_itemContext>(_ctx, getState());
   enterRule(_localctx, 128, SV3_1aParser::RuleChecker_port_item);
@@ -9940,14 +9372,6 @@
     parserListener->exitChecker_or_generate_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Checker_or_generate_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChecker_or_generate_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Checker_or_generate_itemContext* SV3_1aParser::checker_or_generate_item() {
   Checker_or_generate_itemContext *_localctx = _tracker.createInstance<Checker_or_generate_itemContext>(_ctx, getState());
   enterRule(_localctx, 130, SV3_1aParser::RuleChecker_or_generate_item);
@@ -10115,14 +9539,6 @@
     parserListener->exitChecker_or_generate_item_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Checker_or_generate_item_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChecker_or_generate_item_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Checker_or_generate_item_declarationContext* SV3_1aParser::checker_or_generate_item_declaration() {
   Checker_or_generate_item_declarationContext *_localctx = _tracker.createInstance<Checker_or_generate_item_declarationContext>(_ctx, getState());
   enterRule(_localctx, 132, SV3_1aParser::RuleChecker_or_generate_item_declaration);
@@ -10294,14 +9710,6 @@
     parserListener->exitChecker_generate_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Checker_generate_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChecker_generate_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Checker_generate_itemContext* SV3_1aParser::checker_generate_item() {
   Checker_generate_itemContext *_localctx = _tracker.createInstance<Checker_generate_itemContext>(_ctx, getState());
   enterRule(_localctx, 134, SV3_1aParser::RuleChecker_generate_item);
@@ -10427,14 +9835,6 @@
     parserListener->exitClass_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_itemContext* SV3_1aParser::class_item() {
   Class_itemContext *_localctx = _tracker.createInstance<Class_itemContext>(_ctx, getState());
   enterRule(_localctx, 136, SV3_1aParser::RuleClass_item);
@@ -10669,14 +10069,6 @@
     parserListener->exitClass_property(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_propertyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_property(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_propertyContext* SV3_1aParser::class_property() {
   Class_propertyContext *_localctx = _tracker.createInstance<Class_propertyContext>(_ctx, getState());
   enterRule(_localctx, 138, SV3_1aParser::RuleClass_property);
@@ -10788,14 +10180,6 @@
     parserListener->exitPure_virtual_qualifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pure_virtual_qualifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPure_virtual_qualifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pure_virtual_qualifierContext* SV3_1aParser::pure_virtual_qualifier() {
   Pure_virtual_qualifierContext *_localctx = _tracker.createInstance<Pure_virtual_qualifierContext>(_ctx, getState());
   enterRule(_localctx, 140, SV3_1aParser::RulePure_virtual_qualifier);
@@ -10847,14 +10231,6 @@
     parserListener->exitExtern_qualifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Extern_qualifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExtern_qualifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Extern_qualifierContext* SV3_1aParser::extern_qualifier() {
   Extern_qualifierContext *_localctx = _tracker.createInstance<Extern_qualifierContext>(_ctx, getState());
   enterRule(_localctx, 142, SV3_1aParser::RuleExtern_qualifier);
@@ -10948,14 +10324,6 @@
     parserListener->exitClass_method(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_methodContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_method(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_methodContext* SV3_1aParser::class_method() {
   Class_methodContext *_localctx = _tracker.createInstance<Class_methodContext>(_ctx, getState());
   enterRule(_localctx, 144, SV3_1aParser::RuleClass_method);
@@ -11134,14 +10502,6 @@
     parserListener->exitClass_constructor_prototype(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_constructor_prototypeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_constructor_prototype(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_constructor_prototypeContext* SV3_1aParser::class_constructor_prototype() {
   Class_constructor_prototypeContext *_localctx = _tracker.createInstance<Class_constructor_prototypeContext>(_ctx, getState());
   enterRule(_localctx, 146, SV3_1aParser::RuleClass_constructor_prototype);
@@ -11258,14 +10618,6 @@
     parserListener->exitClass_constraint(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_constraintContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_constraint(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_constraintContext* SV3_1aParser::class_constraint() {
   Class_constraintContext *_localctx = _tracker.createInstance<Class_constraintContext>(_ctx, getState());
   enterRule(_localctx, 148, SV3_1aParser::RuleClass_constraint);
@@ -11336,13 +10688,6 @@
   if (parserListener != nullptr)
     parserListener->exitClassItemQualifier_Static(this);
 }
-
-antlrcpp::Any SV3_1aParser::ClassItemQualifier_StaticContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClassItemQualifier_Static(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- ClassItemQualifier_LocalContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::ClassItemQualifier_LocalContext::LOCAL() {
@@ -11361,13 +10706,6 @@
   if (parserListener != nullptr)
     parserListener->exitClassItemQualifier_Local(this);
 }
-
-antlrcpp::Any SV3_1aParser::ClassItemQualifier_LocalContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClassItemQualifier_Local(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- ClassItemQualifier_ProtectedContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::ClassItemQualifier_ProtectedContext::PROTECTED() {
@@ -11386,13 +10724,6 @@
   if (parserListener != nullptr)
     parserListener->exitClassItemQualifier_Protected(this);
 }
-
-antlrcpp::Any SV3_1aParser::ClassItemQualifier_ProtectedContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClassItemQualifier_Protected(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Class_item_qualifierContext* SV3_1aParser::class_item_qualifier() {
   Class_item_qualifierContext *_localctx = _tracker.createInstance<Class_item_qualifierContext>(_ctx, getState());
   enterRule(_localctx, 150, SV3_1aParser::RuleClass_item_qualifier);
@@ -11475,13 +10806,6 @@
   if (parserListener != nullptr)
     parserListener->exitPropQualifier_ClassItem(this);
 }
-
-antlrcpp::Any SV3_1aParser::PropQualifier_ClassItemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPropQualifier_ClassItem(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PropQualifier_RandContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PropQualifier_RandContext::RAND() {
@@ -11500,13 +10824,6 @@
   if (parserListener != nullptr)
     parserListener->exitPropQualifier_Rand(this);
 }
-
-antlrcpp::Any SV3_1aParser::PropQualifier_RandContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPropQualifier_Rand(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PropQualifier_RandcContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PropQualifier_RandcContext::RANDC() {
@@ -11525,13 +10842,6 @@
   if (parserListener != nullptr)
     parserListener->exitPropQualifier_Randc(this);
 }
-
-antlrcpp::Any SV3_1aParser::PropQualifier_RandcContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPropQualifier_Randc(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Property_qualifierContext* SV3_1aParser::property_qualifier() {
   Property_qualifierContext *_localctx = _tracker.createInstance<Property_qualifierContext>(_ctx, getState());
   enterRule(_localctx, 152, SV3_1aParser::RuleProperty_qualifier);
@@ -11616,13 +10926,6 @@
   if (parserListener != nullptr)
     parserListener->exitMethodQualifier_Virtual(this);
 }
-
-antlrcpp::Any SV3_1aParser::MethodQualifier_VirtualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMethodQualifier_Virtual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- MethodQualifier_ClassItemContext ------------------------------------------------------------------
 
 SV3_1aParser::Class_item_qualifierContext* SV3_1aParser::MethodQualifier_ClassItemContext::class_item_qualifier() {
@@ -11641,13 +10944,6 @@
   if (parserListener != nullptr)
     parserListener->exitMethodQualifier_ClassItem(this);
 }
-
-antlrcpp::Any SV3_1aParser::MethodQualifier_ClassItemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMethodQualifier_ClassItem(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Method_qualifierContext* SV3_1aParser::method_qualifier() {
   Method_qualifierContext *_localctx = _tracker.createInstance<Method_qualifierContext>(_ctx, getState());
   enterRule(_localctx, 154, SV3_1aParser::RuleMethod_qualifier);
@@ -11722,14 +11018,6 @@
     parserListener->exitMethod_prototype(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Method_prototypeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMethod_prototype(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Method_prototypeContext* SV3_1aParser::method_prototype() {
   Method_prototypeContext *_localctx = _tracker.createInstance<Method_prototypeContext>(_ctx, getState());
   enterRule(_localctx, 156, SV3_1aParser::RuleMethod_prototype);
@@ -11804,14 +11092,6 @@
     parserListener->exitSuper_dot_new(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Super_dot_newContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSuper_dot_new(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Super_dot_newContext* SV3_1aParser::super_dot_new() {
   Super_dot_newContext *_localctx = _tracker.createInstance<Super_dot_newContext>(_ctx, getState());
   enterRule(_localctx, 158, SV3_1aParser::RuleSuper_dot_new);
@@ -11937,14 +11217,6 @@
     parserListener->exitClass_constructor_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_constructor_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_constructor_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_constructor_declarationContext* SV3_1aParser::class_constructor_declaration() {
   Class_constructor_declarationContext *_localctx = _tracker.createInstance<Class_constructor_declarationContext>(_ctx, getState());
   enterRule(_localctx, 160, SV3_1aParser::RuleClass_constructor_declaration);
@@ -12219,14 +11491,6 @@
     parserListener->exitConstraint_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constraint_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstraint_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constraint_declarationContext* SV3_1aParser::constraint_declaration() {
   Constraint_declarationContext *_localctx = _tracker.createInstance<Constraint_declarationContext>(_ctx, getState());
   enterRule(_localctx, 162, SV3_1aParser::RuleConstraint_declaration);
@@ -12301,14 +11565,6 @@
     parserListener->exitConstraint_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constraint_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstraint_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constraint_blockContext* SV3_1aParser::constraint_block() {
   Constraint_blockContext *_localctx = _tracker.createInstance<Constraint_blockContext>(_ctx, getState());
   enterRule(_localctx, 164, SV3_1aParser::RuleConstraint_block);
@@ -12466,14 +11722,6 @@
     parserListener->exitConstraint_block_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constraint_block_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstraint_block_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constraint_block_itemContext* SV3_1aParser::constraint_block_item() {
   Constraint_block_itemContext *_localctx = _tracker.createInstance<Constraint_block_itemContext>(_ctx, getState());
   enterRule(_localctx, 166, SV3_1aParser::RuleConstraint_block_item);
@@ -12633,14 +11881,6 @@
     parserListener->exitSolve_before_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Solve_before_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSolve_before_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Solve_before_listContext* SV3_1aParser::solve_before_list() {
   Solve_before_listContext *_localctx = _tracker.createInstance<Solve_before_listContext>(_ctx, getState());
   enterRule(_localctx, 168, SV3_1aParser::RuleSolve_before_list);
@@ -12755,14 +11995,6 @@
     parserListener->exitConstraint_primary(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constraint_primaryContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstraint_primary(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constraint_primaryContext* SV3_1aParser::constraint_primary() {
   Constraint_primaryContext *_localctx = _tracker.createInstance<Constraint_primaryContext>(_ctx, getState());
   enterRule(_localctx, 170, SV3_1aParser::RuleConstraint_primary);
@@ -12943,14 +12175,6 @@
     parserListener->exitConstraint_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constraint_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstraint_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constraint_expressionContext* SV3_1aParser::constraint_expression() {
   Constraint_expressionContext *_localctx = _tracker.createInstance<Constraint_expressionContext>(_ctx, getState());
   enterRule(_localctx, 172, SV3_1aParser::RuleConstraint_expression);
@@ -13115,14 +12339,6 @@
     parserListener->exitUniqueness_constraint(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Uniqueness_constraintContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUniqueness_constraint(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Uniqueness_constraintContext* SV3_1aParser::uniqueness_constraint() {
   Uniqueness_constraintContext *_localctx = _tracker.createInstance<Uniqueness_constraintContext>(_ctx, getState());
   enterRule(_localctx, 174, SV3_1aParser::RuleUniqueness_constraint);
@@ -13190,14 +12406,6 @@
     parserListener->exitConstraint_set(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constraint_setContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstraint_set(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constraint_setContext* SV3_1aParser::constraint_set() {
   Constraint_setContext *_localctx = _tracker.createInstance<Constraint_setContext>(_ctx, getState());
   enterRule(_localctx, 176, SV3_1aParser::RuleConstraint_set);
@@ -13361,14 +12569,6 @@
     parserListener->exitDist_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dist_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDist_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dist_listContext* SV3_1aParser::dist_list() {
   Dist_listContext *_localctx = _tracker.createInstance<Dist_listContext>(_ctx, getState());
   enterRule(_localctx, 178, SV3_1aParser::RuleDist_list);
@@ -13435,14 +12635,6 @@
     parserListener->exitDist_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dist_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDist_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dist_itemContext* SV3_1aParser::dist_item() {
   Dist_itemContext *_localctx = _tracker.createInstance<Dist_itemContext>(_ctx, getState());
   enterRule(_localctx, 180, SV3_1aParser::RuleDist_item);
@@ -13513,13 +12705,6 @@
   if (parserListener != nullptr)
     parserListener->exitDistWeight_AssignValue(this);
 }
-
-antlrcpp::Any SV3_1aParser::DistWeight_AssignValueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDistWeight_AssignValue(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- DistWeight_AssignRangeContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::DistWeight_AssignRangeContext::COLUMN() {
@@ -13546,13 +12731,6 @@
   if (parserListener != nullptr)
     parserListener->exitDistWeight_AssignRange(this);
 }
-
-antlrcpp::Any SV3_1aParser::DistWeight_AssignRangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDistWeight_AssignRange(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Dist_weightContext* SV3_1aParser::dist_weight() {
   Dist_weightContext *_localctx = _tracker.createInstance<Dist_weightContext>(_ctx, getState());
   enterRule(_localctx, 182, SV3_1aParser::RuleDist_weight);
@@ -13647,14 +12825,6 @@
     parserListener->exitConstraint_prototype(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constraint_prototypeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstraint_prototype(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constraint_prototypeContext* SV3_1aParser::constraint_prototype() {
   Constraint_prototypeContext *_localctx = _tracker.createInstance<Constraint_prototypeContext>(_ctx, getState());
   enterRule(_localctx, 184, SV3_1aParser::RuleConstraint_prototype);
@@ -13756,14 +12926,6 @@
     parserListener->exitExtern_constraint_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Extern_constraint_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExtern_constraint_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Extern_constraint_declarationContext* SV3_1aParser::extern_constraint_declaration() {
   Extern_constraint_declarationContext *_localctx = _tracker.createInstance<Extern_constraint_declarationContext>(_ctx, getState());
   enterRule(_localctx, 186, SV3_1aParser::RuleExtern_constraint_declaration);
@@ -13840,14 +13002,6 @@
     parserListener->exitIdentifier_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Identifier_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIdentifier_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Identifier_listContext* SV3_1aParser::identifier_list() {
   Identifier_listContext *_localctx = _tracker.createInstance<Identifier_listContext>(_ctx, getState());
   enterRule(_localctx, 188, SV3_1aParser::RuleIdentifier_list);
@@ -13928,14 +13082,6 @@
     parserListener->exitPackage_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Package_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPackage_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Package_itemContext* SV3_1aParser::package_item() {
   Package_itemContext *_localctx = _tracker.createInstance<Package_itemContext>(_ctx, getState());
   enterRule(_localctx, 190, SV3_1aParser::RulePackage_item);
@@ -14081,14 +13227,6 @@
     parserListener->exitPackage_or_generate_item_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Package_or_generate_item_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPackage_or_generate_item_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Package_or_generate_item_declarationContext* SV3_1aParser::package_or_generate_item_declaration() {
   Package_or_generate_item_declarationContext *_localctx = _tracker.createInstance<Package_or_generate_item_declarationContext>(_ctx, getState());
   enterRule(_localctx, 192, SV3_1aParser::RulePackage_or_generate_item_declaration);
@@ -14271,14 +13409,6 @@
     parserListener->exitAnonymous_program(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Anonymous_programContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAnonymous_program(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Anonymous_programContext* SV3_1aParser::anonymous_program() {
   Anonymous_programContext *_localctx = _tracker.createInstance<Anonymous_programContext>(_ctx, getState());
   enterRule(_localctx, 194, SV3_1aParser::RuleAnonymous_program);
@@ -14371,14 +13501,6 @@
     parserListener->exitAnonymous_program_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Anonymous_program_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAnonymous_program_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Anonymous_program_itemContext* SV3_1aParser::anonymous_program_item() {
   Anonymous_program_itemContext *_localctx = _tracker.createInstance<Anonymous_program_itemContext>(_ctx, getState());
   enterRule(_localctx, 196, SV3_1aParser::RuleAnonymous_program_item);
@@ -14490,14 +13612,6 @@
     parserListener->exitLocal_parameter_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Local_parameter_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLocal_parameter_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Local_parameter_declarationContext* SV3_1aParser::local_parameter_declaration() {
   Local_parameter_declarationContext *_localctx = _tracker.createInstance<Local_parameter_declarationContext>(_ctx, getState());
   enterRule(_localctx, 198, SV3_1aParser::RuleLocal_parameter_declaration);
@@ -14586,14 +13700,6 @@
     parserListener->exitParameter_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Parameter_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParameter_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Parameter_declarationContext* SV3_1aParser::parameter_declaration() {
   Parameter_declarationContext *_localctx = _tracker.createInstance<Parameter_declarationContext>(_ctx, getState());
   enterRule(_localctx, 200, SV3_1aParser::RuleParameter_declaration);
@@ -14678,14 +13784,6 @@
     parserListener->exitSpecparam_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Specparam_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSpecparam_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Specparam_declarationContext* SV3_1aParser::specparam_declaration() {
   Specparam_declarationContext *_localctx = _tracker.createInstance<Specparam_declarationContext>(_ctx, getState());
   enterRule(_localctx, 202, SV3_1aParser::RuleSpecparam_declaration);
@@ -14756,14 +13854,6 @@
     parserListener->exitInout_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Inout_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInout_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Inout_declarationContext* SV3_1aParser::inout_declaration() {
   Inout_declarationContext *_localctx = _tracker.createInstance<Inout_declarationContext>(_ctx, getState());
   enterRule(_localctx, 204, SV3_1aParser::RuleInout_declaration);
@@ -14833,14 +13923,6 @@
     parserListener->exitInput_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Input_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInput_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Input_declarationContext* SV3_1aParser::input_declaration() {
   Input_declarationContext *_localctx = _tracker.createInstance<Input_declarationContext>(_ctx, getState());
   enterRule(_localctx, 206, SV3_1aParser::RuleInput_declaration);
@@ -14938,14 +14020,6 @@
     parserListener->exitOutput_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Output_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOutput_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Output_declarationContext* SV3_1aParser::output_declaration() {
   Output_declarationContext *_localctx = _tracker.createInstance<Output_declarationContext>(_ctx, getState());
   enterRule(_localctx, 208, SV3_1aParser::RuleOutput_declaration);
@@ -15039,14 +14113,6 @@
     parserListener->exitInterface_port_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_port_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_port_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_port_declarationContext* SV3_1aParser::interface_port_declaration() {
   Interface_port_declarationContext *_localctx = _tracker.createInstance<Interface_port_declarationContext>(_ctx, getState());
   enterRule(_localctx, 210, SV3_1aParser::RuleInterface_port_declaration);
@@ -15127,14 +14193,6 @@
     parserListener->exitRef_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ref_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRef_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ref_declarationContext* SV3_1aParser::ref_declaration() {
   Ref_declarationContext *_localctx = _tracker.createInstance<Ref_declarationContext>(_ctx, getState());
   enterRule(_localctx, 212, SV3_1aParser::RuleRef_declaration);
@@ -15212,14 +14270,6 @@
     parserListener->exitData_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Data_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitData_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Data_declarationContext* SV3_1aParser::data_declaration() {
   Data_declarationContext *_localctx = _tracker.createInstance<Data_declarationContext>(_ctx, getState());
   enterRule(_localctx, 214, SV3_1aParser::RuleData_declaration);
@@ -15389,14 +14439,6 @@
     parserListener->exitVariable_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Variable_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVariable_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Variable_declarationContext* SV3_1aParser::variable_declaration() {
   Variable_declarationContext *_localctx = _tracker.createInstance<Variable_declarationContext>(_ctx, getState());
   enterRule(_localctx, 216, SV3_1aParser::RuleVariable_declaration);
@@ -15509,14 +14551,6 @@
     parserListener->exitPackage_import_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Package_import_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPackage_import_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Package_import_declarationContext* SV3_1aParser::package_import_declaration() {
   Package_import_declarationContext *_localctx = _tracker.createInstance<Package_import_declarationContext>(_ctx, getState());
   enterRule(_localctx, 218, SV3_1aParser::RulePackage_import_declaration);
@@ -15595,14 +14629,6 @@
     parserListener->exitPackage_import_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Package_import_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPackage_import_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Package_import_itemContext* SV3_1aParser::package_import_item() {
   Package_import_itemContext *_localctx = _tracker.createInstance<Package_import_itemContext>(_ctx, getState());
   enterRule(_localctx, 220, SV3_1aParser::RulePackage_import_item);
@@ -15695,14 +14721,6 @@
     parserListener->exitPackage_export_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Package_export_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPackage_export_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Package_export_declarationContext* SV3_1aParser::package_export_declaration() {
   Package_export_declarationContext *_localctx = _tracker.createInstance<Package_export_declarationContext>(_ctx, getState());
   enterRule(_localctx, 222, SV3_1aParser::RulePackage_export_declaration);
@@ -15794,14 +14812,6 @@
     parserListener->exitGenvar_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Genvar_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenvar_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Genvar_declarationContext* SV3_1aParser::genvar_declaration() {
   Genvar_declarationContext *_localctx = _tracker.createInstance<Genvar_declarationContext>(_ctx, getState());
   enterRule(_localctx, 224, SV3_1aParser::RuleGenvar_declaration);
@@ -15923,14 +14933,6 @@
     parserListener->exitNet_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_declarationContext* SV3_1aParser::net_declaration() {
   Net_declarationContext *_localctx = _tracker.createInstance<Net_declarationContext>(_ctx, getState());
   enterRule(_localctx, 226, SV3_1aParser::RuleNet_declaration);
@@ -16242,14 +15244,6 @@
     parserListener->exitType_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Type_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitType_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Type_declarationContext* SV3_1aParser::type_declaration() {
   Type_declarationContext *_localctx = _tracker.createInstance<Type_declarationContext>(_ctx, getState());
   enterRule(_localctx, 228, SV3_1aParser::RuleType_declaration);
@@ -16463,14 +15457,6 @@
     parserListener->exitEnum_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Enum_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnum_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Enum_keywordContext* SV3_1aParser::enum_keyword() {
   Enum_keywordContext *_localctx = _tracker.createInstance<Enum_keywordContext>(_ctx, getState());
   enterRule(_localctx, 230, SV3_1aParser::RuleEnum_keyword);
@@ -16520,14 +15506,6 @@
     parserListener->exitStruct_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Struct_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStruct_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Struct_keywordContext* SV3_1aParser::struct_keyword() {
   Struct_keywordContext *_localctx = _tracker.createInstance<Struct_keywordContext>(_ctx, getState());
   enterRule(_localctx, 232, SV3_1aParser::RuleStruct_keyword);
@@ -16577,14 +15555,6 @@
     parserListener->exitUnion_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Union_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnion_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Union_keywordContext* SV3_1aParser::union_keyword() {
   Union_keywordContext *_localctx = _tracker.createInstance<Union_keywordContext>(_ctx, getState());
   enterRule(_localctx, 234, SV3_1aParser::RuleUnion_keyword);
@@ -16634,14 +15604,6 @@
     parserListener->exitClass_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_keywordContext* SV3_1aParser::class_keyword() {
   Class_keywordContext *_localctx = _tracker.createInstance<Class_keywordContext>(_ctx, getState());
   enterRule(_localctx, 236, SV3_1aParser::RuleClass_keyword);
@@ -16695,14 +15657,6 @@
     parserListener->exitInterface_class_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_class_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_class_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_class_keywordContext* SV3_1aParser::interface_class_keyword() {
   Interface_class_keywordContext *_localctx = _tracker.createInstance<Interface_class_keywordContext>(_ctx, getState());
   enterRule(_localctx, 238, SV3_1aParser::RuleInterface_class_keyword);
@@ -16782,14 +15736,6 @@
     parserListener->exitNet_type_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_type_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_type_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_type_declarationContext* SV3_1aParser::net_type_declaration() {
   Net_type_declarationContext *_localctx = _tracker.createInstance<Net_type_declarationContext>(_ctx, getState());
   enterRule(_localctx, 240, SV3_1aParser::RuleNet_type_declaration);
@@ -16912,13 +15858,6 @@
   if (parserListener != nullptr)
     parserListener->exitLifetime_Static(this);
 }
-
-antlrcpp::Any SV3_1aParser::Lifetime_StaticContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLifetime_Static(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Lifetime_AutomaticContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Lifetime_AutomaticContext::AUTOMATIC() {
@@ -16937,13 +15876,6 @@
   if (parserListener != nullptr)
     parserListener->exitLifetime_Automatic(this);
 }
-
-antlrcpp::Any SV3_1aParser::Lifetime_AutomaticContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLifetime_Automatic(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::LifetimeContext* SV3_1aParser::lifetime() {
   LifetimeContext *_localctx = _tracker.createInstance<LifetimeContext>(_ctx, getState());
   enterRule(_localctx, 242, SV3_1aParser::RuleLifetime);
@@ -17044,14 +15976,6 @@
     parserListener->exitCasting_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Casting_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCasting_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Casting_typeContext* SV3_1aParser::casting_type() {
   Casting_typeContext *_localctx = _tracker.createInstance<Casting_typeContext>(_ctx, getState());
   enterRule(_localctx, 244, SV3_1aParser::RuleCasting_type);
@@ -17287,14 +16211,6 @@
     parserListener->exitData_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Data_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitData_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Data_typeContext* SV3_1aParser::data_type() {
   Data_typeContext *_localctx = _tracker.createInstance<Data_typeContext>(_ctx, getState());
   enterRule(_localctx, 246, SV3_1aParser::RuleData_type);
@@ -17708,14 +16624,6 @@
     parserListener->exitPacked_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Packed_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPacked_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Packed_keywordContext* SV3_1aParser::packed_keyword() {
   Packed_keywordContext *_localctx = _tracker.createInstance<Packed_keywordContext>(_ctx, getState());
   enterRule(_localctx, 248, SV3_1aParser::RulePacked_keyword);
@@ -17765,14 +16673,6 @@
     parserListener->exitString_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::String_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitString_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::String_typeContext* SV3_1aParser::string_type() {
   String_typeContext *_localctx = _tracker.createInstance<String_typeContext>(_ctx, getState());
   enterRule(_localctx, 250, SV3_1aParser::RuleString_type);
@@ -17822,14 +16722,6 @@
     parserListener->exitString_value(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::String_valueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitString_value(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::String_valueContext* SV3_1aParser::string_value() {
   String_valueContext *_localctx = _tracker.createInstance<String_valueContext>(_ctx, getState());
   enterRule(_localctx, 252, SV3_1aParser::RuleString_value);
@@ -17879,14 +16771,6 @@
     parserListener->exitChandle_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Chandle_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChandle_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Chandle_typeContext* SV3_1aParser::chandle_type() {
   Chandle_typeContext *_localctx = _tracker.createInstance<Chandle_typeContext>(_ctx, getState());
   enterRule(_localctx, 254, SV3_1aParser::RuleChandle_type);
@@ -17936,14 +16820,6 @@
     parserListener->exitEvent_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Event_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEvent_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Event_typeContext* SV3_1aParser::event_type() {
   Event_typeContext *_localctx = _tracker.createInstance<Event_typeContext>(_ctx, getState());
   enterRule(_localctx, 256, SV3_1aParser::RuleEvent_type);
@@ -17993,14 +16869,6 @@
     parserListener->exitConst_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Const_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConst_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Const_typeContext* SV3_1aParser::const_type() {
   Const_typeContext *_localctx = _tracker.createInstance<Const_typeContext>(_ctx, getState());
   enterRule(_localctx, 258, SV3_1aParser::RuleConst_type);
@@ -18062,14 +16930,6 @@
     parserListener->exitData_type_or_implicit(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Data_type_or_implicitContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitData_type_or_implicit(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Data_type_or_implicitContext* SV3_1aParser::data_type_or_implicit() {
   Data_type_or_implicitContext *_localctx = _tracker.createInstance<Data_type_or_implicitContext>(_ctx, getState());
   enterRule(_localctx, 260, SV3_1aParser::RuleData_type_or_implicit);
@@ -18162,14 +17022,6 @@
     parserListener->exitImplicit_data_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Implicit_data_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitImplicit_data_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Implicit_data_typeContext* SV3_1aParser::implicit_data_type() {
   Implicit_data_typeContext *_localctx = _tracker.createInstance<Implicit_data_typeContext>(_ctx, getState());
   enterRule(_localctx, 262, SV3_1aParser::RuleImplicit_data_type);
@@ -18255,14 +17107,6 @@
     parserListener->exitEnum_base_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Enum_base_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnum_base_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Enum_base_typeContext* SV3_1aParser::enum_base_type() {
   Enum_base_typeContext *_localctx = _tracker.createInstance<Enum_base_typeContext>(_ctx, getState());
   enterRule(_localctx, 264, SV3_1aParser::RuleEnum_base_type);
@@ -18399,14 +17243,6 @@
     parserListener->exitEnum_name_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Enum_name_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnum_name_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Enum_name_declarationContext* SV3_1aParser::enum_name_declaration() {
   Enum_name_declarationContext *_localctx = _tracker.createInstance<Enum_name_declarationContext>(_ctx, getState());
   enterRule(_localctx, 266, SV3_1aParser::RuleEnum_name_declaration);
@@ -18493,14 +17329,6 @@
     parserListener->exitClass_scope(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_scopeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_scope(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_scopeContext* SV3_1aParser::class_scope() {
   Class_scopeContext *_localctx = _tracker.createInstance<Class_scopeContext>(_ctx, getState());
   enterRule(_localctx, 268, SV3_1aParser::RuleClass_scope);
@@ -18596,14 +17424,6 @@
     parserListener->exitClass_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_typeContext* SV3_1aParser::class_type() {
   Class_typeContext *_localctx = _tracker.createInstance<Class_typeContext>(_ctx, getState());
   enterRule(_localctx, 270, SV3_1aParser::RuleClass_type);
@@ -18701,14 +17521,6 @@
     parserListener->exitInteger_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Integer_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInteger_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Integer_typeContext* SV3_1aParser::integer_type() {
   Integer_typeContext *_localctx = _tracker.createInstance<Integer_typeContext>(_ctx, getState());
   enterRule(_localctx, 272, SV3_1aParser::RuleInteger_type);
@@ -18788,13 +17600,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntegerAtomType_Shortint(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntegerAtomType_ShortintContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntegerAtomType_Shortint(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- IntegerAtomType_IntContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::IntegerAtomType_IntContext::INT() {
@@ -18817,13 +17622,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntegerAtomType_Int(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntegerAtomType_IntContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntegerAtomType_Int(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- IntegerAtomType_TimeContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::IntegerAtomType_TimeContext::TIME() {
@@ -18842,13 +17640,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntegerAtomType_Time(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntegerAtomType_TimeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntegerAtomType_Time(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- IntegerAtomType_ByteContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::IntegerAtomType_ByteContext::BYTE() {
@@ -18867,13 +17658,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntegerAtomType_Byte(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntegerAtomType_ByteContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntegerAtomType_Byte(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- IntegerAtomType_LongIntContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::IntegerAtomType_LongIntContext::LONGINT() {
@@ -18892,13 +17676,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntegerAtomType_LongInt(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntegerAtomType_LongIntContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntegerAtomType_LongInt(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Integer_atom_typeContext* SV3_1aParser::integer_atom_type() {
   Integer_atom_typeContext *_localctx = _tracker.createInstance<Integer_atom_typeContext>(_ctx, getState());
   enterRule(_localctx, 274, SV3_1aParser::RuleInteger_atom_type);
@@ -19005,13 +17782,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntVec_TypeBit(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntVec_TypeBitContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntVec_TypeBit(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- IntVec_TypeRegContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::IntVec_TypeRegContext::REG() {
@@ -19030,13 +17800,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntVec_TypeReg(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntVec_TypeRegContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntVec_TypeReg(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- IntVec_TypeLogicContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::IntVec_TypeLogicContext::LOGIC() {
@@ -19055,13 +17818,6 @@
   if (parserListener != nullptr)
     parserListener->exitIntVec_TypeLogic(this);
 }
-
-antlrcpp::Any SV3_1aParser::IntVec_TypeLogicContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIntVec_TypeLogic(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Integer_vector_typeContext* SV3_1aParser::integer_vector_type() {
   Integer_vector_typeContext *_localctx = _tracker.createInstance<Integer_vector_typeContext>(_ctx, getState());
   enterRule(_localctx, 276, SV3_1aParser::RuleInteger_vector_type);
@@ -19144,13 +17900,6 @@
   if (parserListener != nullptr)
     parserListener->exitNonIntType_RealTime(this);
 }
-
-antlrcpp::Any SV3_1aParser::NonIntType_RealTimeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNonIntType_RealTime(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NonIntType_ShortRealContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NonIntType_ShortRealContext::SHORTREAL() {
@@ -19169,13 +17918,6 @@
   if (parserListener != nullptr)
     parserListener->exitNonIntType_ShortReal(this);
 }
-
-antlrcpp::Any SV3_1aParser::NonIntType_ShortRealContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNonIntType_ShortReal(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NonIntType_RealContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NonIntType_RealContext::REAL() {
@@ -19194,13 +17936,6 @@
   if (parserListener != nullptr)
     parserListener->exitNonIntType_Real(this);
 }
-
-antlrcpp::Any SV3_1aParser::NonIntType_RealContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNonIntType_Real(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Non_integer_typeContext* SV3_1aParser::non_integer_type() {
   Non_integer_typeContext *_localctx = _tracker.createInstance<Non_integer_typeContext>(_ctx, getState());
   enterRule(_localctx, 278, SV3_1aParser::RuleNon_integer_type);
@@ -19283,13 +18018,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Supply0(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_Supply0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Supply0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_WireContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_WireContext::WIRE() {
@@ -19308,13 +18036,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Wire(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_WireContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Wire(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_Supply1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_Supply1Context::SUPPLY1() {
@@ -19333,13 +18054,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Supply1(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_Supply1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Supply1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_WandContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_WandContext::WAND() {
@@ -19358,13 +18072,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Wand(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_WandContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Wand(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_Tri1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_Tri1Context::TRI1() {
@@ -19383,13 +18090,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Tri1(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_Tri1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Tri1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_Tri0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_Tri0Context::TRI0() {
@@ -19408,13 +18108,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Tri0(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_Tri0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Tri0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_TriOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_TriOrContext::TRIOR() {
@@ -19433,13 +18126,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_TriOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_TriOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_TriOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_TriContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_TriContext::TRI() {
@@ -19458,13 +18144,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Tri(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_TriContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Tri(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_TriRegContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_TriRegContext::TRIREG() {
@@ -19483,13 +18162,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_TriReg(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_TriRegContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_TriReg(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_WorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_WorContext::WOR() {
@@ -19508,13 +18180,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Wor(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_WorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Wor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_UwireContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_UwireContext::UWIRE() {
@@ -19533,13 +18198,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_Uwire(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_UwireContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_Uwire(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NetType_TriAndContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NetType_TriAndContext::TRIAND() {
@@ -19558,13 +18216,6 @@
   if (parserListener != nullptr)
     parserListener->exitNetType_TriAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::NetType_TriAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNetType_TriAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Net_typeContext* SV3_1aParser::net_type() {
   Net_typeContext *_localctx = _tracker.createInstance<Net_typeContext>(_ctx, getState());
   enterRule(_localctx, 280, SV3_1aParser::RuleNet_type);
@@ -19729,14 +18380,6 @@
     parserListener->exitNet_port_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_port_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_port_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_port_typeContext* SV3_1aParser::net_port_type() {
   Net_port_typeContext *_localctx = _tracker.createInstance<Net_port_typeContext>(_ctx, getState());
   enterRule(_localctx, 282, SV3_1aParser::RuleNet_port_type);
@@ -19843,14 +18486,6 @@
     parserListener->exitVariable_port_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Variable_port_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVariable_port_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Variable_port_typeContext* SV3_1aParser::variable_port_type() {
   Variable_port_typeContext *_localctx = _tracker.createInstance<Variable_port_typeContext>(_ctx, getState());
   enterRule(_localctx, 284, SV3_1aParser::RuleVariable_port_type);
@@ -19964,14 +18599,6 @@
     parserListener->exitVar_data_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Var_data_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVar_data_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Var_data_typeContext* SV3_1aParser::var_data_type() {
   Var_data_typeContext *_localctx = _tracker.createInstance<Var_data_typeContext>(_ctx, getState());
   enterRule(_localctx, 286, SV3_1aParser::RuleVar_data_type);
@@ -20044,13 +18671,6 @@
   if (parserListener != nullptr)
     parserListener->exitSigning_Unsigned(this);
 }
-
-antlrcpp::Any SV3_1aParser::Signing_UnsignedContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSigning_Unsigned(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Signing_SignedContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Signing_SignedContext::SIGNED() {
@@ -20069,13 +18689,6 @@
   if (parserListener != nullptr)
     parserListener->exitSigning_Signed(this);
 }
-
-antlrcpp::Any SV3_1aParser::Signing_SignedContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSigning_Signed(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::SigningContext* SV3_1aParser::signing() {
   SigningContext *_localctx = _tracker.createInstance<SigningContext>(_ctx, getState());
   enterRule(_localctx, 288, SV3_1aParser::RuleSigning);
@@ -20152,14 +18765,6 @@
     parserListener->exitSimple_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Simple_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Simple_typeContext* SV3_1aParser::simple_type() {
   Simple_typeContext *_localctx = _tracker.createInstance<Simple_typeContext>(_ctx, getState());
   enterRule(_localctx, 290, SV3_1aParser::RuleSimple_type);
@@ -20237,13 +18842,6 @@
   if (parserListener != nullptr)
     parserListener->exitRandomQualifier_RandC(this);
 }
-
-antlrcpp::Any SV3_1aParser::RandomQualifier_RandCContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRandomQualifier_RandC(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- RandomQualifier_RandContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::RandomQualifier_RandContext::RAND() {
@@ -20262,13 +18860,6 @@
   if (parserListener != nullptr)
     parserListener->exitRandomQualifier_Rand(this);
 }
-
-antlrcpp::Any SV3_1aParser::RandomQualifier_RandContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRandomQualifier_Rand(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Random_qualifierContext* SV3_1aParser::random_qualifier() {
   Random_qualifierContext *_localctx = _tracker.createInstance<Random_qualifierContext>(_ctx, getState());
   enterRule(_localctx, 292, SV3_1aParser::RuleRandom_qualifier);
@@ -20357,14 +18948,6 @@
     parserListener->exitStruct_union_member(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Struct_union_memberContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStruct_union_member(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Struct_union_memberContext* SV3_1aParser::struct_union_member() {
   Struct_union_memberContext *_localctx = _tracker.createInstance<Struct_union_memberContext>(_ctx, getState());
   enterRule(_localctx, 294, SV3_1aParser::RuleStruct_union_member);
@@ -20443,14 +19026,6 @@
     parserListener->exitData_type_or_void(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Data_type_or_voidContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitData_type_or_void(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Data_type_or_voidContext* SV3_1aParser::data_type_or_void() {
   Data_type_or_voidContext *_localctx = _tracker.createInstance<Data_type_or_voidContext>(_ctx, getState());
   enterRule(_localctx, 296, SV3_1aParser::RuleData_type_or_void);
@@ -20560,14 +19135,6 @@
     parserListener->exitStruct_union(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Struct_unionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStruct_union(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Struct_unionContext* SV3_1aParser::struct_union() {
   Struct_unionContext *_localctx = _tracker.createInstance<Struct_unionContext>(_ctx, getState());
   enterRule(_localctx, 298, SV3_1aParser::RuleStruct_union);
@@ -20643,14 +19210,6 @@
     parserListener->exitTagged_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tagged_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTagged_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tagged_keywordContext* SV3_1aParser::tagged_keyword() {
   Tagged_keywordContext *_localctx = _tracker.createInstance<Tagged_keywordContext>(_ctx, getState());
   enterRule(_localctx, 300, SV3_1aParser::RuleTagged_keyword);
@@ -20716,14 +19275,6 @@
     parserListener->exitType_reference(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Type_referenceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitType_reference(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Type_referenceContext* SV3_1aParser::type_reference() {
   Type_referenceContext *_localctx = _tracker.createInstance<Type_referenceContext>(_ctx, getState());
   enterRule(_localctx, 302, SV3_1aParser::RuleType_reference);
@@ -20824,14 +19375,6 @@
     parserListener->exitDrive_strength(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Drive_strengthContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDrive_strength(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Drive_strengthContext* SV3_1aParser::drive_strength() {
   Drive_strengthContext *_localctx = _tracker.createInstance<Drive_strengthContext>(_ctx, getState());
   enterRule(_localctx, 304, SV3_1aParser::RuleDrive_strength);
@@ -20978,13 +19521,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength0_Weak0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength0_Weak0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength0_Weak0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Strength0_Strong0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Strength0_Strong0Context::STRONG0() {
@@ -21003,13 +19539,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength0_Strong0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength0_Strong0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength0_Strong0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Strength0_Pull0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Strength0_Pull0Context::PULL0() {
@@ -21028,13 +19557,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength0_Pull0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength0_Pull0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength0_Pull0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Strength0_Supply0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Strength0_Supply0Context::SUPPLY0() {
@@ -21053,13 +19575,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength0_Supply0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength0_Supply0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength0_Supply0(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Strength0Context* SV3_1aParser::strength0() {
   Strength0Context *_localctx = _tracker.createInstance<Strength0Context>(_ctx, getState());
   enterRule(_localctx, 306, SV3_1aParser::RuleStrength0);
@@ -21150,13 +19665,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength1_Supply1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength1_Supply1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength1_Supply1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Strength1_Strong1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Strength1_Strong1Context::STRONG1() {
@@ -21175,13 +19683,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength1_Strong1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength1_Strong1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength1_Strong1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Strength1_Pull1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Strength1_Pull1Context::PULL1() {
@@ -21200,13 +19701,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength1_Pull1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength1_Pull1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength1_Pull1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Strength1_Weak1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Strength1_Weak1Context::WEAK1() {
@@ -21225,13 +19719,6 @@
   if (parserListener != nullptr)
     parserListener->exitStrength1_Weak1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Strength1_Weak1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStrength1_Weak1(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Strength1Context* SV3_1aParser::strength1() {
   Strength1Context *_localctx = _tracker.createInstance<Strength1Context>(_ctx, getState());
   enterRule(_localctx, 308, SV3_1aParser::RuleStrength1);
@@ -21322,13 +19809,6 @@
   if (parserListener != nullptr)
     parserListener->exitChargeStrength_Small(this);
 }
-
-antlrcpp::Any SV3_1aParser::ChargeStrength_SmallContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChargeStrength_Small(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- ChargeStrength_MediumContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::ChargeStrength_MediumContext::MEDIUM() {
@@ -21347,13 +19827,6 @@
   if (parserListener != nullptr)
     parserListener->exitChargeStrength_Medium(this);
 }
-
-antlrcpp::Any SV3_1aParser::ChargeStrength_MediumContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChargeStrength_Medium(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- ChargeStrength_LargeContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::ChargeStrength_LargeContext::LARGE() {
@@ -21372,13 +19845,6 @@
   if (parserListener != nullptr)
     parserListener->exitChargeStrength_Large(this);
 }
-
-antlrcpp::Any SV3_1aParser::ChargeStrength_LargeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChargeStrength_Large(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Charge_strengthContext* SV3_1aParser::charge_strength() {
   Charge_strengthContext *_localctx = _tracker.createInstance<Charge_strengthContext>(_ctx, getState());
   enterRule(_localctx, 310, SV3_1aParser::RuleCharge_strength);
@@ -21483,14 +19949,6 @@
     parserListener->exitDelay3(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay3Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay3(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay3Context* SV3_1aParser::delay3() {
   Delay3Context *_localctx = _tracker.createInstance<Delay3Context>(_ctx, getState());
   enterRule(_localctx, 312, SV3_1aParser::RuleDelay3);
@@ -21606,14 +20064,6 @@
     parserListener->exitDelay2(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay2Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay2(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay2Context* SV3_1aParser::delay2() {
   Delay2Context *_localctx = _tracker.createInstance<Delay2Context>(_ctx, getState());
   enterRule(_localctx, 314, SV3_1aParser::RuleDelay2);
@@ -21707,14 +20157,6 @@
     parserListener->exitPound_delay_value(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pound_delay_valueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPound_delay_value(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pound_delay_valueContext* SV3_1aParser::pound_delay_value() {
   Pound_delay_valueContext *_localctx = _tracker.createInstance<Pound_delay_valueContext>(_ctx, getState());
   enterRule(_localctx, 316, SV3_1aParser::RulePound_delay_value);
@@ -21814,14 +20256,6 @@
     parserListener->exitDelay_value(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay_valueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_value(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay_valueContext* SV3_1aParser::delay_value() {
   Delay_valueContext *_localctx = _tracker.createInstance<Delay_valueContext>(_ctx, getState());
   enterRule(_localctx, 318, SV3_1aParser::RuleDelay_value);
@@ -21926,14 +20360,6 @@
     parserListener->exitList_of_defparam_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_defparam_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_defparam_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_defparam_assignmentsContext* SV3_1aParser::list_of_defparam_assignments() {
   List_of_defparam_assignmentsContext *_localctx = _tracker.createInstance<List_of_defparam_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 320, SV3_1aParser::RuleList_of_defparam_assignments);
@@ -22016,14 +20442,6 @@
     parserListener->exitList_of_interface_identifiers(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_interface_identifiersContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_interface_identifiers(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_interface_identifiersContext* SV3_1aParser::list_of_interface_identifiers() {
   List_of_interface_identifiersContext *_localctx = _tracker.createInstance<List_of_interface_identifiersContext>(_ctx, getState());
   enterRule(_localctx, 322, SV3_1aParser::RuleList_of_interface_identifiers);
@@ -22118,14 +20536,6 @@
     parserListener->exitList_of_net_decl_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_net_decl_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_net_decl_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_net_decl_assignmentsContext* SV3_1aParser::list_of_net_decl_assignments() {
   List_of_net_decl_assignmentsContext *_localctx = _tracker.createInstance<List_of_net_decl_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 324, SV3_1aParser::RuleList_of_net_decl_assignments);
@@ -22200,14 +20610,6 @@
     parserListener->exitList_of_param_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_param_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_param_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_param_assignmentsContext* SV3_1aParser::list_of_param_assignments() {
   List_of_param_assignmentsContext *_localctx = _tracker.createInstance<List_of_param_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 326, SV3_1aParser::RuleList_of_param_assignments);
@@ -22292,14 +20694,6 @@
     parserListener->exitList_of_port_identifiers(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_port_identifiersContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_port_identifiers(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_port_identifiersContext* SV3_1aParser::list_of_port_identifiers() {
   List_of_port_identifiersContext *_localctx = _tracker.createInstance<List_of_port_identifiersContext>(_ctx, getState());
   enterRule(_localctx, 328, SV3_1aParser::RuleList_of_port_identifiers);
@@ -22394,14 +20788,6 @@
     parserListener->exitList_of_specparam_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_specparam_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_specparam_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_specparam_assignmentsContext* SV3_1aParser::list_of_specparam_assignments() {
   List_of_specparam_assignmentsContext *_localctx = _tracker.createInstance<List_of_specparam_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 330, SV3_1aParser::RuleList_of_specparam_assignments);
@@ -22500,14 +20886,6 @@
     parserListener->exitList_of_tf_variable_identifiers(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_tf_variable_identifiersContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_tf_variable_identifiers(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_tf_variable_identifiersContext* SV3_1aParser::list_of_tf_variable_identifiers() {
   List_of_tf_variable_identifiersContext *_localctx = _tracker.createInstance<List_of_tf_variable_identifiersContext>(_ctx, getState());
   enterRule(_localctx, 332, SV3_1aParser::RuleList_of_tf_variable_identifiers);
@@ -22638,14 +21016,6 @@
     parserListener->exitList_of_type_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_type_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_type_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_type_assignmentsContext* SV3_1aParser::list_of_type_assignments() {
   List_of_type_assignmentsContext *_localctx = _tracker.createInstance<List_of_type_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 334, SV3_1aParser::RuleList_of_type_assignments);
@@ -22744,14 +21114,6 @@
     parserListener->exitList_of_variable_decl_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_variable_decl_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_variable_decl_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_variable_decl_assignmentsContext* SV3_1aParser::list_of_variable_decl_assignments() {
   List_of_variable_decl_assignmentsContext *_localctx = _tracker.createInstance<List_of_variable_decl_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 336, SV3_1aParser::RuleList_of_variable_decl_assignments);
@@ -22834,14 +21196,6 @@
     parserListener->exitList_of_variable_identifiers(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_variable_identifiersContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_variable_identifiers(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_variable_identifiersContext* SV3_1aParser::list_of_variable_identifiers() {
   List_of_variable_identifiersContext *_localctx = _tracker.createInstance<List_of_variable_identifiersContext>(_ctx, getState());
   enterRule(_localctx, 338, SV3_1aParser::RuleList_of_variable_identifiers);
@@ -22960,14 +21314,6 @@
     parserListener->exitList_of_variable_port_identifiers(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_variable_port_identifiersContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_variable_port_identifiers(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_variable_port_identifiersContext* SV3_1aParser::list_of_variable_port_identifiers() {
   List_of_variable_port_identifiersContext *_localctx = _tracker.createInstance<List_of_variable_port_identifiersContext>(_ctx, getState());
   enterRule(_localctx, 340, SV3_1aParser::RuleList_of_variable_port_identifiers);
@@ -23090,14 +21436,6 @@
     parserListener->exitList_of_virtual_interface_decl(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_virtual_interface_declContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_virtual_interface_decl(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_virtual_interface_declContext* SV3_1aParser::list_of_virtual_interface_decl() {
   List_of_virtual_interface_declContext *_localctx = _tracker.createInstance<List_of_virtual_interface_declContext>(_ctx, getState());
   enterRule(_localctx, 342, SV3_1aParser::RuleList_of_virtual_interface_decl);
@@ -23188,14 +21526,6 @@
     parserListener->exitDefparam_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Defparam_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefparam_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Defparam_assignmentContext* SV3_1aParser::defparam_assignment() {
   Defparam_assignmentContext *_localctx = _tracker.createInstance<Defparam_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 344, SV3_1aParser::RuleDefparam_assignment);
@@ -23265,14 +21595,6 @@
     parserListener->exitNet_decl_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_decl_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_decl_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_decl_assignmentContext* SV3_1aParser::net_decl_assignment() {
   Net_decl_assignmentContext *_localctx = _tracker.createInstance<Net_decl_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 346, SV3_1aParser::RuleNet_decl_assignment);
@@ -23359,14 +21681,6 @@
     parserListener->exitParam_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Param_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParam_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Param_assignmentContext* SV3_1aParser::param_assignment() {
   Param_assignmentContext *_localctx = _tracker.createInstance<Param_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 348, SV3_1aParser::RuleParam_assignment);
@@ -23452,14 +21766,6 @@
     parserListener->exitSpecparam_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Specparam_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSpecparam_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Specparam_assignmentContext* SV3_1aParser::specparam_assignment() {
   Specparam_assignmentContext *_localctx = _tracker.createInstance<Specparam_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 350, SV3_1aParser::RuleSpecparam_assignment);
@@ -23591,14 +21897,6 @@
     parserListener->exitPulse_control_specparam(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pulse_control_specparamContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPulse_control_specparam(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pulse_control_specparamContext* SV3_1aParser::pulse_control_specparam() {
   Pulse_control_specparamContext *_localctx = _tracker.createInstance<Pulse_control_specparamContext>(_ctx, getState());
   enterRule(_localctx, 352, SV3_1aParser::RulePulse_control_specparam);
@@ -23758,14 +22056,6 @@
     parserListener->exitVariable_decl_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Variable_decl_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVariable_decl_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Variable_decl_assignmentContext* SV3_1aParser::variable_decl_assignment() {
   Variable_decl_assignmentContext *_localctx = _tracker.createInstance<Variable_decl_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 354, SV3_1aParser::RuleVariable_decl_assignment);
@@ -23918,14 +22208,6 @@
     parserListener->exitClass_new(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Class_newContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClass_new(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Class_newContext* SV3_1aParser::class_new() {
   Class_newContext *_localctx = _tracker.createInstance<Class_newContext>(_ctx, getState());
   enterRule(_localctx, 356, SV3_1aParser::RuleClass_new);
@@ -24034,14 +22316,6 @@
     parserListener->exitDynamic_array_new(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dynamic_array_newContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDynamic_array_new(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dynamic_array_newContext* SV3_1aParser::dynamic_array_new() {
   Dynamic_array_newContext *_localctx = _tracker.createInstance<Dynamic_array_newContext>(_ctx, getState());
   enterRule(_localctx, 358, SV3_1aParser::RuleDynamic_array_new);
@@ -24122,14 +22396,6 @@
     parserListener->exitUnpacked_dimension(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Unpacked_dimensionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnpacked_dimension(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Unpacked_dimensionContext* SV3_1aParser::unpacked_dimension() {
   Unpacked_dimensionContext *_localctx = _tracker.createInstance<Unpacked_dimensionContext>(_ctx, getState());
   enterRule(_localctx, 360, SV3_1aParser::RuleUnpacked_dimension);
@@ -24214,14 +22480,6 @@
     parserListener->exitPacked_dimension(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Packed_dimensionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPacked_dimension(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Packed_dimensionContext* SV3_1aParser::packed_dimension() {
   Packed_dimensionContext *_localctx = _tracker.createInstance<Packed_dimensionContext>(_ctx, getState());
   enterRule(_localctx, 362, SV3_1aParser::RulePacked_dimension);
@@ -24302,14 +22560,6 @@
     parserListener->exitAssociative_dimension(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Associative_dimensionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssociative_dimension(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Associative_dimensionContext* SV3_1aParser::associative_dimension() {
   Associative_dimensionContext *_localctx = _tracker.createInstance<Associative_dimensionContext>(_ctx, getState());
   enterRule(_localctx, 364, SV3_1aParser::RuleAssociative_dimension);
@@ -24392,14 +22642,6 @@
     parserListener->exitVariable_dimension(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Variable_dimensionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVariable_dimension(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Variable_dimensionContext* SV3_1aParser::variable_dimension() {
   Variable_dimensionContext *_localctx = _tracker.createInstance<Variable_dimensionContext>(_ctx, getState());
   enterRule(_localctx, 366, SV3_1aParser::RuleVariable_dimension);
@@ -24494,14 +22736,6 @@
     parserListener->exitQueue_dimension(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Queue_dimensionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitQueue_dimension(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Queue_dimensionContext* SV3_1aParser::queue_dimension() {
   Queue_dimensionContext *_localctx = _tracker.createInstance<Queue_dimensionContext>(_ctx, getState());
   enterRule(_localctx, 368, SV3_1aParser::RuleQueue_dimension);
@@ -24570,14 +22804,6 @@
     parserListener->exitUnsized_dimension(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Unsized_dimensionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnsized_dimension(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Unsized_dimensionContext* SV3_1aParser::unsized_dimension() {
   Unsized_dimensionContext *_localctx = _tracker.createInstance<Unsized_dimensionContext>(_ctx, getState());
   enterRule(_localctx, 370, SV3_1aParser::RuleUnsized_dimension);
@@ -24633,14 +22859,6 @@
     parserListener->exitFunction_data_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Function_data_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFunction_data_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Function_data_typeContext* SV3_1aParser::function_data_type() {
   Function_data_typeContext *_localctx = _tracker.createInstance<Function_data_typeContext>(_ctx, getState());
   enterRule(_localctx, 372, SV3_1aParser::RuleFunction_data_type);
@@ -24754,14 +22972,6 @@
     parserListener->exitFunction_data_type_or_implicit(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Function_data_type_or_implicitContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFunction_data_type_or_implicit(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Function_data_type_or_implicitContext* SV3_1aParser::function_data_type_or_implicit() {
   Function_data_type_or_implicitContext *_localctx = _tracker.createInstance<Function_data_type_or_implicitContext>(_ctx, getState());
   enterRule(_localctx, 374, SV3_1aParser::RuleFunction_data_type_or_implicit);
@@ -24854,14 +23064,6 @@
     parserListener->exitFunction_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Function_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFunction_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Function_declarationContext* SV3_1aParser::function_declaration() {
   Function_declarationContext *_localctx = _tracker.createInstance<Function_declarationContext>(_ctx, getState());
   enterRule(_localctx, 376, SV3_1aParser::RuleFunction_declaration);
@@ -24924,14 +23126,6 @@
     parserListener->exitEndfunction(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndfunctionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndfunction(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndfunctionContext* SV3_1aParser::endfunction() {
   EndfunctionContext *_localctx = _tracker.createInstance<EndfunctionContext>(_ctx, getState());
   enterRule(_localctx, 378, SV3_1aParser::RuleEndfunction);
@@ -25049,14 +23243,6 @@
     parserListener->exitFunction_body_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Function_body_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFunction_body_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Function_body_declarationContext* SV3_1aParser::function_body_declaration() {
   Function_body_declarationContext *_localctx = _tracker.createInstance<Function_body_declarationContext>(_ctx, getState());
   enterRule(_localctx, 380, SV3_1aParser::RuleFunction_body_declaration);
@@ -25461,14 +23647,6 @@
     parserListener->exitFunction_prototype(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Function_prototypeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFunction_prototype(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Function_prototypeContext* SV3_1aParser::function_prototype() {
   Function_prototypeContext *_localctx = _tracker.createInstance<Function_prototypeContext>(_ctx, getState());
   enterRule(_localctx, 382, SV3_1aParser::RuleFunction_prototype);
@@ -25627,14 +23805,6 @@
     parserListener->exitDpi_import_export(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dpi_import_exportContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDpi_import_export(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dpi_import_exportContext* SV3_1aParser::dpi_import_export() {
   Dpi_import_exportContext *_localctx = _tracker.createInstance<Dpi_import_exportContext>(_ctx, getState());
   enterRule(_localctx, 384, SV3_1aParser::RuleDpi_import_export);
@@ -25802,14 +23972,6 @@
     parserListener->exitContext_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Context_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitContext_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Context_keywordContext* SV3_1aParser::context_keyword() {
   Context_keywordContext *_localctx = _tracker.createInstance<Context_keywordContext>(_ctx, getState());
   enterRule(_localctx, 386, SV3_1aParser::RuleContext_keyword);
@@ -25863,14 +24025,6 @@
     parserListener->exitFunction_name_decl(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Function_name_declContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFunction_name_decl(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Function_name_declContext* SV3_1aParser::function_name_decl() {
   Function_name_declContext *_localctx = _tracker.createInstance<Function_name_declContext>(_ctx, getState());
   enterRule(_localctx, 388, SV3_1aParser::RuleFunction_name_decl);
@@ -25926,14 +24080,6 @@
     parserListener->exitTask_name_decl(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Task_name_declContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTask_name_decl(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Task_name_declContext* SV3_1aParser::task_name_decl() {
   Task_name_declContext *_localctx = _tracker.createInstance<Task_name_declContext>(_ctx, getState());
   enterRule(_localctx, 390, SV3_1aParser::RuleTask_name_decl);
@@ -25985,14 +24131,6 @@
     parserListener->exitPure_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pure_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPure_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pure_keywordContext* SV3_1aParser::pure_keyword() {
   Pure_keywordContext *_localctx = _tracker.createInstance<Pure_keywordContext>(_ctx, getState());
   enterRule(_localctx, 392, SV3_1aParser::RulePure_keyword);
@@ -26050,14 +24188,6 @@
     parserListener->exitTask_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Task_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTask_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Task_declarationContext* SV3_1aParser::task_declaration() {
   Task_declarationContext *_localctx = _tracker.createInstance<Task_declarationContext>(_ctx, getState());
   enterRule(_localctx, 394, SV3_1aParser::RuleTask_declaration);
@@ -26120,14 +24250,6 @@
     parserListener->exitEndtask(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndtaskContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndtask(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndtaskContext* SV3_1aParser::endtask() {
   EndtaskContext *_localctx = _tracker.createInstance<EndtaskContext>(_ctx, getState());
   enterRule(_localctx, 396, SV3_1aParser::RuleEndtask);
@@ -26241,14 +24363,6 @@
     parserListener->exitTask_body_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Task_body_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTask_body_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Task_body_declarationContext* SV3_1aParser::task_body_declaration() {
   Task_body_declarationContext *_localctx = _tracker.createInstance<Task_body_declarationContext>(_ctx, getState());
   enterRule(_localctx, 398, SV3_1aParser::RuleTask_body_declaration);
@@ -26633,14 +24747,6 @@
     parserListener->exitTf_item_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tf_item_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTf_item_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tf_item_declarationContext* SV3_1aParser::tf_item_declaration() {
   Tf_item_declarationContext *_localctx = _tracker.createInstance<Tf_item_declarationContext>(_ctx, getState());
   enterRule(_localctx, 400, SV3_1aParser::RuleTf_item_declaration);
@@ -26717,14 +24823,6 @@
     parserListener->exitTf_port_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tf_port_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTf_port_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tf_port_listContext* SV3_1aParser::tf_port_list() {
   Tf_port_listContext *_localctx = _tracker.createInstance<Tf_port_listContext>(_ctx, getState());
   enterRule(_localctx, 402, SV3_1aParser::RuleTf_port_list);
@@ -26823,14 +24921,6 @@
     parserListener->exitTf_port_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tf_port_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTf_port_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tf_port_itemContext* SV3_1aParser::tf_port_item() {
   Tf_port_itemContext *_localctx = _tracker.createInstance<Tf_port_itemContext>(_ctx, getState());
   enterRule(_localctx, 404, SV3_1aParser::RuleTf_port_item);
@@ -26943,13 +25033,6 @@
   if (parserListener != nullptr)
     parserListener->exitTfPortDir_Ref(this);
 }
-
-antlrcpp::Any SV3_1aParser::TfPortDir_RefContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTfPortDir_Ref(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TfPortDir_ConstRefContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TfPortDir_ConstRefContext::CONST() {
@@ -26972,13 +25055,6 @@
   if (parserListener != nullptr)
     parserListener->exitTfPortDir_ConstRef(this);
 }
-
-antlrcpp::Any SV3_1aParser::TfPortDir_ConstRefContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTfPortDir_ConstRef(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TfPortDir_OutContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TfPortDir_OutContext::OUTPUT() {
@@ -26997,13 +25073,6 @@
   if (parserListener != nullptr)
     parserListener->exitTfPortDir_Out(this);
 }
-
-antlrcpp::Any SV3_1aParser::TfPortDir_OutContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTfPortDir_Out(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TfPortDir_InpContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TfPortDir_InpContext::INPUT() {
@@ -27022,13 +25091,6 @@
   if (parserListener != nullptr)
     parserListener->exitTfPortDir_Inp(this);
 }
-
-antlrcpp::Any SV3_1aParser::TfPortDir_InpContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTfPortDir_Inp(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TfPortDir_InoutContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TfPortDir_InoutContext::INOUT() {
@@ -27047,13 +25109,6 @@
   if (parserListener != nullptr)
     parserListener->exitTfPortDir_Inout(this);
 }
-
-antlrcpp::Any SV3_1aParser::TfPortDir_InoutContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTfPortDir_Inout(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Tf_port_directionContext* SV3_1aParser::tf_port_direction() {
   Tf_port_directionContext *_localctx = _tracker.createInstance<Tf_port_directionContext>(_ctx, getState());
   enterRule(_localctx, 406, SV3_1aParser::RuleTf_port_direction);
@@ -27172,14 +25227,6 @@
     parserListener->exitTf_port_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tf_port_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTf_port_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tf_port_declarationContext* SV3_1aParser::tf_port_declaration() {
   Tf_port_declarationContext *_localctx = _tracker.createInstance<Tf_port_declarationContext>(_ctx, getState());
   enterRule(_localctx, 408, SV3_1aParser::RuleTf_port_declaration);
@@ -27273,14 +25320,6 @@
     parserListener->exitTask_prototype(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Task_prototypeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTask_prototype(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Task_prototypeContext* SV3_1aParser::task_prototype() {
   Task_prototypeContext *_localctx = _tracker.createInstance<Task_prototypeContext>(_ctx, getState());
   enterRule(_localctx, 410, SV3_1aParser::RuleTask_prototype);
@@ -27417,14 +25456,6 @@
     parserListener->exitBlock_item_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Block_item_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBlock_item_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Block_item_declarationContext* SV3_1aParser::block_item_declaration() {
   Block_item_declarationContext *_localctx = _tracker.createInstance<Block_item_declarationContext>(_ctx, getState());
   enterRule(_localctx, 412, SV3_1aParser::RuleBlock_item_declaration);
@@ -27589,14 +25620,6 @@
     parserListener->exitOverload_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Overload_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverload_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Overload_declarationContext* SV3_1aParser::overload_declaration() {
   Overload_declarationContext *_localctx = _tracker.createInstance<Overload_declarationContext>(_ctx, getState());
   enterRule(_localctx, 414, SV3_1aParser::RuleOverload_declaration);
@@ -27668,13 +25691,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Minus(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_MinusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Minus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_GreaterEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_GreaterEqualContext::GREATER_EQUAL() {
@@ -27693,13 +25709,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_GreaterEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_GreaterEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_GreaterEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_LessContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_LessContext::LESS() {
@@ -27718,13 +25727,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Less(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_LessContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Less(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_PercentContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_PercentContext::PERCENT() {
@@ -27743,13 +25745,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Percent(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_PercentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Percent(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_NotEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_NotEqualContext::NOTEQUAL() {
@@ -27768,13 +25763,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_NotEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_NotEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_NotEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_MultContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_MultContext::STAR() {
@@ -27793,13 +25781,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Mult(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_MultContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Mult(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_EquivContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_EquivContext::EQUIV() {
@@ -27818,13 +25799,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Equiv(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_EquivContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Equiv(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_EqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_EqualContext::ASSIGN_OP() {
@@ -27843,13 +25817,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Equal(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_EqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Equal(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_LessEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_LessEqualContext::LESS_EQUAL() {
@@ -27868,13 +25835,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_LessEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_LessEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_LessEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_PlusPlusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_PlusPlusContext::PLUSPLUS() {
@@ -27893,13 +25853,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_PlusPlus(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_PlusPlusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_PlusPlus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_GreaterContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_GreaterContext::GREATER() {
@@ -27918,13 +25871,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Greater(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_GreaterContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Greater(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_MinusMinusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_MinusMinusContext::MINUSMINUS() {
@@ -27943,13 +25889,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_MinusMinus(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_MinusMinusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_MinusMinus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_StarStarContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_StarStarContext::STARSTAR() {
@@ -27968,13 +25907,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_StarStar(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_StarStarContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_StarStar(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_PlusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_PlusContext::PLUS() {
@@ -27993,13 +25925,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Plus(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_PlusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Plus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- OverloadOp_DivContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::OverloadOp_DivContext::DIV() {
@@ -28018,13 +25943,6 @@
   if (parserListener != nullptr)
     parserListener->exitOverloadOp_Div(this);
 }
-
-antlrcpp::Any SV3_1aParser::OverloadOp_DivContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverloadOp_Div(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Overload_operatorContext* SV3_1aParser::overload_operator() {
   Overload_operatorContext *_localctx = _tracker.createInstance<Overload_operatorContext>(_ctx, getState());
   enterRule(_localctx, 416, SV3_1aParser::RuleOverload_operator);
@@ -28209,14 +26127,6 @@
     parserListener->exitOverload_proto_formals(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Overload_proto_formalsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOverload_proto_formals(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Overload_proto_formalsContext* SV3_1aParser::overload_proto_formals() {
   Overload_proto_formalsContext *_localctx = _tracker.createInstance<Overload_proto_formalsContext>(_ctx, getState());
   enterRule(_localctx, 418, SV3_1aParser::RuleOverload_proto_formals);
@@ -28295,14 +26205,6 @@
     parserListener->exitVirtual_interface_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Virtual_interface_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVirtual_interface_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Virtual_interface_declarationContext* SV3_1aParser::virtual_interface_declaration() {
   Virtual_interface_declarationContext *_localctx = _tracker.createInstance<Virtual_interface_declarationContext>(_ctx, getState());
   enterRule(_localctx, 420, SV3_1aParser::RuleVirtual_interface_declaration);
@@ -28391,14 +26293,6 @@
     parserListener->exitModport_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Modport_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModport_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Modport_itemContext* SV3_1aParser::modport_item() {
   Modport_itemContext *_localctx = _tracker.createInstance<Modport_itemContext>(_ctx, getState());
   enterRule(_localctx, 422, SV3_1aParser::RuleModport_item);
@@ -28491,14 +26385,6 @@
     parserListener->exitModport_ports_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Modport_ports_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModport_ports_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Modport_ports_declarationContext* SV3_1aParser::modport_ports_declaration() {
   Modport_ports_declarationContext *_localctx = _tracker.createInstance<Modport_ports_declarationContext>(_ctx, getState());
   enterRule(_localctx, 424, SV3_1aParser::RuleModport_ports_declaration);
@@ -28626,14 +26512,6 @@
     parserListener->exitModport_simple_ports_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Modport_simple_ports_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModport_simple_ports_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Modport_simple_ports_declarationContext* SV3_1aParser::modport_simple_ports_declaration() {
   Modport_simple_ports_declarationContext *_localctx = _tracker.createInstance<Modport_simple_ports_declarationContext>(_ctx, getState());
   enterRule(_localctx, 426, SV3_1aParser::RuleModport_simple_ports_declaration);
@@ -28720,14 +26598,6 @@
     parserListener->exitModport_simple_port(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Modport_simple_portContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModport_simple_port(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Modport_simple_portContext* SV3_1aParser::modport_simple_port() {
   Modport_simple_portContext *_localctx = _tracker.createInstance<Modport_simple_portContext>(_ctx, getState());
   enterRule(_localctx, 428, SV3_1aParser::RuleModport_simple_port);
@@ -28918,14 +26788,6 @@
     parserListener->exitModport_hierarchical_ports_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Modport_hierarchical_ports_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModport_hierarchical_ports_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Modport_hierarchical_ports_declarationContext* SV3_1aParser::modport_hierarchical_ports_declaration() {
   Modport_hierarchical_ports_declarationContext *_localctx = _tracker.createInstance<Modport_hierarchical_ports_declarationContext>(_ctx, getState());
   enterRule(_localctx, 430, SV3_1aParser::RuleModport_hierarchical_ports_declaration);
@@ -29012,14 +26874,6 @@
     parserListener->exitModport_tf_ports_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Modport_tf_ports_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModport_tf_ports_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Modport_tf_ports_declarationContext* SV3_1aParser::modport_tf_ports_declaration() {
   Modport_tf_ports_declarationContext *_localctx = _tracker.createInstance<Modport_tf_ports_declarationContext>(_ctx, getState());
   enterRule(_localctx, 432, SV3_1aParser::RuleModport_tf_ports_declaration);
@@ -29098,14 +26952,6 @@
     parserListener->exitModport_tf_port(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Modport_tf_portContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModport_tf_port(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Modport_tf_portContext* SV3_1aParser::modport_tf_port() {
   Modport_tf_portContext *_localctx = _tracker.createInstance<Modport_tf_portContext>(_ctx, getState());
   enterRule(_localctx, 434, SV3_1aParser::RuleModport_tf_port);
@@ -29202,14 +27048,6 @@
     parserListener->exitConcurrent_assertion_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Concurrent_assertion_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConcurrent_assertion_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Concurrent_assertion_itemContext* SV3_1aParser::concurrent_assertion_item() {
   Concurrent_assertion_itemContext *_localctx = _tracker.createInstance<Concurrent_assertion_itemContext>(_ctx, getState());
   enterRule(_localctx, 436, SV3_1aParser::RuleConcurrent_assertion_item);
@@ -29319,14 +27157,6 @@
     parserListener->exitConcurrent_assertion_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Concurrent_assertion_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConcurrent_assertion_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Concurrent_assertion_statementContext* SV3_1aParser::concurrent_assertion_statement() {
   Concurrent_assertion_statementContext *_localctx = _tracker.createInstance<Concurrent_assertion_statementContext>(_ctx, getState());
   enterRule(_localctx, 438, SV3_1aParser::RuleConcurrent_assertion_statement);
@@ -29432,14 +27262,6 @@
     parserListener->exitAssert_property_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assert_property_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssert_property_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assert_property_statementContext* SV3_1aParser::assert_property_statement() {
   Assert_property_statementContext *_localctx = _tracker.createInstance<Assert_property_statementContext>(_ctx, getState());
   enterRule(_localctx, 440, SV3_1aParser::RuleAssert_property_statement);
@@ -29519,14 +27341,6 @@
     parserListener->exitAssume_property_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assume_property_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssume_property_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assume_property_statementContext* SV3_1aParser::assume_property_statement() {
   Assume_property_statementContext *_localctx = _tracker.createInstance<Assume_property_statementContext>(_ctx, getState());
   enterRule(_localctx, 442, SV3_1aParser::RuleAssume_property_statement);
@@ -29606,14 +27420,6 @@
     parserListener->exitCover_property_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cover_property_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCover_property_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cover_property_statementContext* SV3_1aParser::cover_property_statement() {
   Cover_property_statementContext *_localctx = _tracker.createInstance<Cover_property_statementContext>(_ctx, getState());
   enterRule(_localctx, 444, SV3_1aParser::RuleCover_property_statement);
@@ -29689,14 +27495,6 @@
     parserListener->exitExpect_property_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Expect_property_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExpect_property_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Expect_property_statementContext* SV3_1aParser::expect_property_statement() {
   Expect_property_statementContext *_localctx = _tracker.createInstance<Expect_property_statementContext>(_ctx, getState());
   enterRule(_localctx, 446, SV3_1aParser::RuleExpect_property_statement);
@@ -29798,14 +27596,6 @@
     parserListener->exitCover_sequence_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cover_sequence_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCover_sequence_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cover_sequence_statementContext* SV3_1aParser::cover_sequence_statement() {
   Cover_sequence_statementContext *_localctx = _tracker.createInstance<Cover_sequence_statementContext>(_ctx, getState());
   enterRule(_localctx, 448, SV3_1aParser::RuleCover_sequence_statement);
@@ -29913,14 +27703,6 @@
     parserListener->exitRestrict_property_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Restrict_property_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRestrict_property_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Restrict_property_statementContext* SV3_1aParser::restrict_property_statement() {
   Restrict_property_statementContext *_localctx = _tracker.createInstance<Restrict_property_statementContext>(_ctx, getState());
   enterRule(_localctx, 450, SV3_1aParser::RuleRestrict_property_statement);
@@ -29992,14 +27774,6 @@
     parserListener->exitProperty_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Property_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProperty_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Property_instanceContext* SV3_1aParser::property_instance() {
   Property_instanceContext *_localctx = _tracker.createInstance<Property_instanceContext>(_ctx, getState());
   enterRule(_localctx, 452, SV3_1aParser::RuleProperty_instance);
@@ -30149,14 +27923,6 @@
     parserListener->exitProperty_actual_arg(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Property_actual_argContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProperty_actual_arg(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Property_actual_argContext* SV3_1aParser::property_actual_arg() {
   Property_actual_argContext *_localctx = _tracker.createInstance<Property_actual_argContext>(_ctx, getState());
   enterRule(_localctx, 454, SV3_1aParser::RuleProperty_actual_arg);
@@ -30225,14 +27991,6 @@
     parserListener->exitConcurrent_assertion_item_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Concurrent_assertion_item_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConcurrent_assertion_item_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Concurrent_assertion_item_declarationContext* SV3_1aParser::concurrent_assertion_item_declaration() {
   Concurrent_assertion_item_declarationContext *_localctx = _tracker.createInstance<Concurrent_assertion_item_declarationContext>(_ctx, getState());
   enterRule(_localctx, 456, SV3_1aParser::RuleConcurrent_assertion_item_declaration);
@@ -30307,14 +28065,6 @@
     parserListener->exitAssertion_item_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assertion_item_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssertion_item_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assertion_item_declarationContext* SV3_1aParser::assertion_item_declaration() {
   Assertion_item_declarationContext *_localctx = _tracker.createInstance<Assertion_item_declarationContext>(_ctx, getState());
   enterRule(_localctx, 458, SV3_1aParser::RuleAssertion_item_declaration);
@@ -30388,14 +28138,6 @@
     parserListener->exitEndproperty(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndpropertyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndproperty(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndpropertyContext* SV3_1aParser::endproperty() {
   EndpropertyContext *_localctx = _tracker.createInstance<EndpropertyContext>(_ctx, getState());
   enterRule(_localctx, 460, SV3_1aParser::RuleEndproperty);
@@ -30493,14 +28235,6 @@
     parserListener->exitProperty_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Property_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProperty_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Property_declarationContext* SV3_1aParser::property_declaration() {
   Property_declarationContext *_localctx = _tracker.createInstance<Property_declarationContext>(_ctx, getState());
   enterRule(_localctx, 462, SV3_1aParser::RuleProperty_declaration);
@@ -30630,14 +28364,6 @@
     parserListener->exitProperty_formal_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Property_formal_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProperty_formal_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Property_formal_typeContext* SV3_1aParser::property_formal_type() {
   Property_formal_typeContext *_localctx = _tracker.createInstance<Property_formal_typeContext>(_ctx, getState());
   enterRule(_localctx, 464, SV3_1aParser::RuleProperty_formal_type);
@@ -30766,14 +28492,6 @@
     parserListener->exitProperty_spec(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Property_specContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProperty_spec(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Property_specContext* SV3_1aParser::property_spec() {
   Property_specContext *_localctx = _tracker.createInstance<Property_specContext>(_ctx, getState());
   enterRule(_localctx, 466, SV3_1aParser::RuleProperty_spec);
@@ -30851,14 +28569,6 @@
     parserListener->exitEndcase(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndcaseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndcase(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndcaseContext* SV3_1aParser::endcase() {
   EndcaseContext *_localctx = _tracker.createInstance<EndcaseContext>(_ctx, getState());
   enterRule(_localctx, 468, SV3_1aParser::RuleEndcase);
@@ -31081,14 +28791,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::Property_exprContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProperty_expr(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::Property_exprContext* SV3_1aParser::property_expr() {
    return property_expr(0);
 }
@@ -31698,14 +29400,6 @@
     parserListener->exitProperty_case_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Property_case_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProperty_case_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Property_case_itemContext* SV3_1aParser::property_case_item() {
   Property_case_itemContext *_localctx = _tracker.createInstance<Property_case_itemContext>(_ctx, getState());
   enterRule(_localctx, 472, SV3_1aParser::RuleProperty_case_item);
@@ -31884,14 +29578,6 @@
     parserListener->exitEndsequence(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndsequenceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndsequence(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndsequenceContext* SV3_1aParser::endsequence() {
   EndsequenceContext *_localctx = _tracker.createInstance<EndsequenceContext>(_ctx, getState());
   enterRule(_localctx, 474, SV3_1aParser::RuleEndsequence);
@@ -31989,14 +29675,6 @@
     parserListener->exitSequence_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequence_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequence_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequence_declarationContext* SV3_1aParser::sequence_declaration() {
   Sequence_declarationContext *_localctx = _tracker.createInstance<Sequence_declarationContext>(_ctx, getState());
   enterRule(_localctx, 476, SV3_1aParser::RuleSequence_declaration);
@@ -32203,14 +29881,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::Sequence_exprContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequence_expr(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::Sequence_exprContext* SV3_1aParser::sequence_expr() {
    return sequence_expr(0);
 }
@@ -32557,14 +30227,6 @@
     parserListener->exitCycle_delay_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cycle_delay_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCycle_delay_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cycle_delay_rangeContext* SV3_1aParser::cycle_delay_range() {
   Cycle_delay_rangeContext *_localctx = _tracker.createInstance<Cycle_delay_rangeContext>(_ctx, getState());
   enterRule(_localctx, 480, SV3_1aParser::RuleCycle_delay_range);
@@ -32667,14 +30329,6 @@
     parserListener->exitSequence_method_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequence_method_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequence_method_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequence_method_callContext* SV3_1aParser::sequence_method_call() {
   Sequence_method_callContext *_localctx = _tracker.createInstance<Sequence_method_callContext>(_ctx, getState());
   enterRule(_localctx, 482, SV3_1aParser::RuleSequence_method_call);
@@ -32736,14 +30390,6 @@
     parserListener->exitSequence_match_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequence_match_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequence_match_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequence_match_itemContext* SV3_1aParser::sequence_match_item() {
   Sequence_match_itemContext *_localctx = _tracker.createInstance<Sequence_match_itemContext>(_ctx, getState());
   enterRule(_localctx, 484, SV3_1aParser::RuleSequence_match_item);
@@ -32821,13 +30467,6 @@
   if (parserListener != nullptr)
     parserListener->exitSeqFormatType_Data(this);
 }
-
-antlrcpp::Any SV3_1aParser::SeqFormatType_DataContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSeqFormatType_Data(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- SeqFormatType_UntypedContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::SeqFormatType_UntypedContext::UNTYPED() {
@@ -32846,13 +30485,6 @@
   if (parserListener != nullptr)
     parserListener->exitSeqFormatType_Untyped(this);
 }
-
-antlrcpp::Any SV3_1aParser::SeqFormatType_UntypedContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSeqFormatType_Untyped(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- SeqFormatType_SequenceContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::SeqFormatType_SequenceContext::SEQUENCE() {
@@ -32871,13 +30503,6 @@
   if (parserListener != nullptr)
     parserListener->exitSeqFormatType_Sequence(this);
 }
-
-antlrcpp::Any SV3_1aParser::SeqFormatType_SequenceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSeqFormatType_Sequence(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Sequence_formal_typeContext* SV3_1aParser::sequence_formal_type() {
   Sequence_formal_typeContext *_localctx = _tracker.createInstance<Sequence_formal_typeContext>(_ctx, getState());
   enterRule(_localctx, 486, SV3_1aParser::RuleSequence_formal_type);
@@ -33002,14 +30627,6 @@
     parserListener->exitSequence_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequence_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequence_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequence_instanceContext* SV3_1aParser::sequence_instance() {
   Sequence_instanceContext *_localctx = _tracker.createInstance<Sequence_instanceContext>(_ctx, getState());
   enterRule(_localctx, 488, SV3_1aParser::RuleSequence_instance);
@@ -33118,14 +30735,6 @@
     parserListener->exitSequence_list_of_arguments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequence_list_of_argumentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequence_list_of_arguments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequence_list_of_argumentsContext* SV3_1aParser::sequence_list_of_arguments() {
   Sequence_list_of_argumentsContext *_localctx = _tracker.createInstance<Sequence_list_of_argumentsContext>(_ctx, getState());
   enterRule(_localctx, 490, SV3_1aParser::RuleSequence_list_of_arguments);
@@ -33747,14 +31356,6 @@
     parserListener->exitSequence_actual_arg(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequence_actual_argContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequence_actual_arg(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequence_actual_argContext* SV3_1aParser::sequence_actual_arg() {
   Sequence_actual_argContext *_localctx = _tracker.createInstance<Sequence_actual_argContext>(_ctx, getState());
   enterRule(_localctx, 492, SV3_1aParser::RuleSequence_actual_arg);
@@ -33827,14 +31428,6 @@
     parserListener->exitFormal_list_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Formal_list_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFormal_list_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Formal_list_itemContext* SV3_1aParser::formal_list_item() {
   Formal_list_itemContext *_localctx = _tracker.createInstance<Formal_list_itemContext>(_ctx, getState());
   enterRule(_localctx, 494, SV3_1aParser::RuleFormal_list_item);
@@ -33907,14 +31500,6 @@
     parserListener->exitList_of_formals(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_formalsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_formals(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_formalsContext* SV3_1aParser::list_of_formals() {
   List_of_formalsContext *_localctx = _tracker.createInstance<List_of_formalsContext>(_ctx, getState());
   enterRule(_localctx, 496, SV3_1aParser::RuleList_of_formals);
@@ -34021,14 +31606,6 @@
     parserListener->exitActual_arg_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Actual_arg_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitActual_arg_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Actual_arg_listContext* SV3_1aParser::actual_arg_list() {
   Actual_arg_listContext *_localctx = _tracker.createInstance<Actual_arg_listContext>(_ctx, getState());
   enterRule(_localctx, 498, SV3_1aParser::RuleActual_arg_list);
@@ -34212,14 +31789,6 @@
     parserListener->exitActual_arg_expr(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Actual_arg_exprContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitActual_arg_expr(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Actual_arg_exprContext* SV3_1aParser::actual_arg_expr() {
   Actual_arg_exprContext *_localctx = _tracker.createInstance<Actual_arg_exprContext>(_ctx, getState());
   enterRule(_localctx, 500, SV3_1aParser::RuleActual_arg_expr);
@@ -34292,14 +31861,6 @@
     parserListener->exitBoolean_abbrev(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Boolean_abbrevContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBoolean_abbrev(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Boolean_abbrevContext* SV3_1aParser::boolean_abbrev() {
   Boolean_abbrevContext *_localctx = _tracker.createInstance<Boolean_abbrevContext>(_ctx, getState());
   enterRule(_localctx, 502, SV3_1aParser::RuleBoolean_abbrev);
@@ -34381,14 +31942,6 @@
     parserListener->exitConsecutive_repetition(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Consecutive_repetitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConsecutive_repetition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Consecutive_repetitionContext* SV3_1aParser::consecutive_repetition() {
   Consecutive_repetitionContext *_localctx = _tracker.createInstance<Consecutive_repetitionContext>(_ctx, getState());
   enterRule(_localctx, 504, SV3_1aParser::RuleConsecutive_repetition);
@@ -34450,14 +32003,6 @@
     parserListener->exitNon_consecutive_repetition(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Non_consecutive_repetitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNon_consecutive_repetition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Non_consecutive_repetitionContext* SV3_1aParser::non_consecutive_repetition() {
   Non_consecutive_repetitionContext *_localctx = _tracker.createInstance<Non_consecutive_repetitionContext>(_ctx, getState());
   enterRule(_localctx, 506, SV3_1aParser::RuleNon_consecutive_repetition);
@@ -34519,14 +32064,6 @@
     parserListener->exitGoto_repetition(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Goto_repetitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGoto_repetition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Goto_repetitionContext* SV3_1aParser::goto_repetition() {
   Goto_repetitionContext *_localctx = _tracker.createInstance<Goto_repetitionContext>(_ctx, getState());
   enterRule(_localctx, 508, SV3_1aParser::RuleGoto_repetition);
@@ -34584,14 +32121,6 @@
     parserListener->exitConst_or_range_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Const_or_range_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConst_or_range_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Const_or_range_expressionContext* SV3_1aParser::const_or_range_expression() {
   Const_or_range_expressionContext *_localctx = _tracker.createInstance<Const_or_range_expressionContext>(_ctx, getState());
   enterRule(_localctx, 510, SV3_1aParser::RuleConst_or_range_expression);
@@ -34668,14 +32197,6 @@
     parserListener->exitCycle_delay_const_range_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cycle_delay_const_range_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCycle_delay_const_range_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cycle_delay_const_range_expressionContext* SV3_1aParser::cycle_delay_const_range_expression() {
   Cycle_delay_const_range_expressionContext *_localctx = _tracker.createInstance<Cycle_delay_const_range_expressionContext>(_ctx, getState());
   enterRule(_localctx, 512, SV3_1aParser::RuleCycle_delay_const_range_expression);
@@ -34764,14 +32285,6 @@
     parserListener->exitExpression_or_dist(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Expression_or_distContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExpression_or_dist(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Expression_or_distContext* SV3_1aParser::expression_or_dist() {
   Expression_or_distContext *_localctx = _tracker.createInstance<Expression_or_distContext>(_ctx, getState());
   enterRule(_localctx, 514, SV3_1aParser::RuleExpression_or_dist);
@@ -34846,14 +32359,6 @@
     parserListener->exitAssertion_variable_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assertion_variable_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssertion_variable_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assertion_variable_declarationContext* SV3_1aParser::assertion_variable_declaration() {
   Assertion_variable_declarationContext *_localctx = _tracker.createInstance<Assertion_variable_declarationContext>(_ctx, getState());
   enterRule(_localctx, 516, SV3_1aParser::RuleAssertion_variable_declaration);
@@ -34935,14 +32440,6 @@
     parserListener->exitLet_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Let_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLet_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Let_declarationContext* SV3_1aParser::let_declaration() {
   Let_declarationContext *_localctx = _tracker.createInstance<Let_declarationContext>(_ctx, getState());
   enterRule(_localctx, 518, SV3_1aParser::RuleLet_declaration);
@@ -35069,14 +32566,6 @@
     parserListener->exitLet_port_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Let_port_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLet_port_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Let_port_listContext* SV3_1aParser::let_port_list() {
   Let_port_listContext *_localctx = _tracker.createInstance<Let_port_listContext>(_ctx, getState());
   enterRule(_localctx, 520, SV3_1aParser::RuleLet_port_list);
@@ -35167,14 +32656,6 @@
     parserListener->exitLet_port_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Let_port_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLet_port_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Let_port_itemContext* SV3_1aParser::let_port_item() {
   Let_port_itemContext *_localctx = _tracker.createInstance<Let_port_itemContext>(_ctx, getState());
   enterRule(_localctx, 522, SV3_1aParser::RuleLet_port_item);
@@ -35261,14 +32742,6 @@
     parserListener->exitLet_formal_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Let_formal_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLet_formal_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Let_formal_typeContext* SV3_1aParser::let_formal_type() {
   Let_formal_typeContext *_localctx = _tracker.createInstance<Let_formal_typeContext>(_ctx, getState());
   enterRule(_localctx, 524, SV3_1aParser::RuleLet_formal_type);
@@ -35371,14 +32844,6 @@
     parserListener->exitEndgroup(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndgroupContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndgroup(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndgroupContext* SV3_1aParser::endgroup() {
   EndgroupContext *_localctx = _tracker.createInstance<EndgroupContext>(_ctx, getState());
   enterRule(_localctx, 526, SV3_1aParser::RuleEndgroup);
@@ -35472,14 +32937,6 @@
     parserListener->exitCovergroup_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Covergroup_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCovergroup_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Covergroup_declarationContext* SV3_1aParser::covergroup_declaration() {
   Covergroup_declarationContext *_localctx = _tracker.createInstance<Covergroup_declarationContext>(_ctx, getState());
   enterRule(_localctx, 528, SV3_1aParser::RuleCovergroup_declaration);
@@ -35665,14 +33122,6 @@
     parserListener->exitCoverage_spec_or_option(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Coverage_spec_or_optionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCoverage_spec_or_option(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Coverage_spec_or_optionContext* SV3_1aParser::coverage_spec_or_option() {
   Coverage_spec_or_optionContext *_localctx = _tracker.createInstance<Coverage_spec_or_optionContext>(_ctx, getState());
   enterRule(_localctx, 530, SV3_1aParser::RuleCoverage_spec_or_option);
@@ -35787,14 +33236,6 @@
     parserListener->exitCoverage_option(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Coverage_optionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCoverage_option(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Coverage_optionContext* SV3_1aParser::coverage_option() {
   Coverage_optionContext *_localctx = _tracker.createInstance<Coverage_optionContext>(_ctx, getState());
   enterRule(_localctx, 532, SV3_1aParser::RuleCoverage_option);
@@ -35877,14 +33318,6 @@
     parserListener->exitCoverage_spec(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Coverage_specContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCoverage_spec(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Coverage_specContext* SV3_1aParser::coverage_spec() {
   Coverage_specContext *_localctx = _tracker.createInstance<Coverage_specContext>(_ctx, getState());
   enterRule(_localctx, 534, SV3_1aParser::RuleCoverage_spec);
@@ -35981,14 +33414,6 @@
     parserListener->exitCoverage_event(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Coverage_eventContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCoverage_event(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Coverage_eventContext* SV3_1aParser::coverage_event() {
   Coverage_eventContext *_localctx = _tracker.createInstance<Coverage_eventContext>(_ctx, getState());
   enterRule(_localctx, 536, SV3_1aParser::RuleCoverage_event);
@@ -36127,14 +33552,6 @@
     parserListener->exitEnd(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnd(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndContext* SV3_1aParser::end() {
   EndContext *_localctx = _tracker.createInstance<EndContext>(_ctx, getState());
   enterRule(_localctx, 538, SV3_1aParser::RuleEnd);
@@ -36205,14 +33622,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::Block_event_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBlock_event_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::Block_event_expressionContext* SV3_1aParser::block_event_expression() {
    return block_event_expression(0);
 }
@@ -36363,14 +33772,6 @@
     parserListener->exitHierarchical_btf_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Hierarchical_btf_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitHierarchical_btf_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Hierarchical_btf_identifierContext* SV3_1aParser::hierarchical_btf_identifier() {
   Hierarchical_btf_identifierContext *_localctx = _tracker.createInstance<Hierarchical_btf_identifierContext>(_ctx, getState());
   enterRule(_localctx, 542, SV3_1aParser::RuleHierarchical_btf_identifier);
@@ -36515,14 +33916,6 @@
     parserListener->exitCover_point(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cover_pointContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCover_point(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cover_pointContext* SV3_1aParser::cover_point() {
   Cover_pointContext *_localctx = _tracker.createInstance<Cover_pointContext>(_ctx, getState());
   enterRule(_localctx, 544, SV3_1aParser::RuleCover_point);
@@ -36647,14 +34040,6 @@
     parserListener->exitBins_or_empty(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bins_or_emptyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_or_empty(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bins_or_emptyContext* SV3_1aParser::bins_or_empty() {
   Bins_or_emptyContext *_localctx = _tracker.createInstance<Bins_or_emptyContext>(_ctx, getState());
   enterRule(_localctx, 546, SV3_1aParser::RuleBins_or_empty);
@@ -36840,14 +34225,6 @@
     parserListener->exitBins_or_options(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bins_or_optionsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_or_options(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bins_or_optionsContext* SV3_1aParser::bins_or_options() {
   Bins_or_optionsContext *_localctx = _tracker.createInstance<Bins_or_optionsContext>(_ctx, getState());
   enterRule(_localctx, 548, SV3_1aParser::RuleBins_or_options);
@@ -37500,13 +34877,6 @@
   if (parserListener != nullptr)
     parserListener->exitBins_Ignore(this);
 }
-
-antlrcpp::Any SV3_1aParser::Bins_IgnoreContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_Ignore(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Bins_BinsContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Bins_BinsContext::BINS() {
@@ -37525,13 +34895,6 @@
   if (parserListener != nullptr)
     parserListener->exitBins_Bins(this);
 }
-
-antlrcpp::Any SV3_1aParser::Bins_BinsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_Bins(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Bins_IllegalContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Bins_IllegalContext::ILLEGAL_BINS() {
@@ -37550,13 +34913,6 @@
   if (parserListener != nullptr)
     parserListener->exitBins_Illegal(this);
 }
-
-antlrcpp::Any SV3_1aParser::Bins_IllegalContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_Illegal(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Bins_keywordContext* SV3_1aParser::bins_keyword() {
   Bins_keywordContext *_localctx = _tracker.createInstance<Bins_keywordContext>(_ctx, getState());
   enterRule(_localctx, 550, SV3_1aParser::RuleBins_keyword);
@@ -37645,14 +35001,6 @@
     parserListener->exitRange_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Range_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRange_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Range_listContext* SV3_1aParser::range_list() {
   Range_listContext *_localctx = _tracker.createInstance<Range_listContext>(_ctx, getState());
   enterRule(_localctx, 552, SV3_1aParser::RuleRange_list);
@@ -37743,14 +35091,6 @@
     parserListener->exitTrans_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Trans_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTrans_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Trans_listContext* SV3_1aParser::trans_list() {
   Trans_listContext *_localctx = _tracker.createInstance<Trans_listContext>(_ctx, getState());
   enterRule(_localctx, 554, SV3_1aParser::RuleTrans_list);
@@ -37833,14 +35173,6 @@
     parserListener->exitTrans_set(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Trans_setContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTrans_set(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Trans_setContext* SV3_1aParser::trans_set() {
   Trans_setContext *_localctx = _tracker.createInstance<Trans_setContext>(_ctx, getState());
   enterRule(_localctx, 556, SV3_1aParser::RuleTrans_set);
@@ -37923,14 +35255,6 @@
     parserListener->exitTrans_range_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Trans_range_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTrans_range_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Trans_range_listContext* SV3_1aParser::trans_range_list() {
   Trans_range_listContext *_localctx = _tracker.createInstance<Trans_range_listContext>(_ctx, getState());
   enterRule(_localctx, 558, SV3_1aParser::RuleTrans_range_list);
@@ -38035,14 +35359,6 @@
     parserListener->exitRepeat_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Repeat_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRepeat_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Repeat_rangeContext* SV3_1aParser::repeat_range() {
   Repeat_rangeContext *_localctx = _tracker.createInstance<Repeat_rangeContext>(_ctx, getState());
   enterRule(_localctx, 560, SV3_1aParser::RuleRepeat_range);
@@ -38143,14 +35459,6 @@
     parserListener->exitCover_cross(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cover_crossContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCover_cross(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cover_crossContext* SV3_1aParser::cover_cross() {
   Cover_crossContext *_localctx = _tracker.createInstance<Cover_crossContext>(_ctx, getState());
   enterRule(_localctx, 562, SV3_1aParser::RuleCover_cross);
@@ -38259,14 +35567,6 @@
     parserListener->exitList_of_cross_items(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_cross_itemsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_cross_items(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_cross_itemsContext* SV3_1aParser::list_of_cross_items() {
   List_of_cross_itemsContext *_localctx = _tracker.createInstance<List_of_cross_itemsContext>(_ctx, getState());
   enterRule(_localctx, 564, SV3_1aParser::RuleList_of_cross_items);
@@ -38333,14 +35633,6 @@
     parserListener->exitCross_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cross_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCross_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cross_itemContext* SV3_1aParser::cross_item() {
   Cross_itemContext *_localctx = _tracker.createInstance<Cross_itemContext>(_ctx, getState());
   enterRule(_localctx, 566, SV3_1aParser::RuleCross_item);
@@ -38417,14 +35709,6 @@
     parserListener->exitCross_body(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cross_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCross_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cross_bodyContext* SV3_1aParser::cross_body() {
   Cross_bodyContext *_localctx = _tracker.createInstance<Cross_bodyContext>(_ctx, getState());
   enterRule(_localctx, 568, SV3_1aParser::RuleCross_body);
@@ -38518,14 +35802,6 @@
     parserListener->exitCross_body_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cross_body_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCross_body_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cross_body_itemContext* SV3_1aParser::cross_body_item() {
   Cross_body_itemContext *_localctx = _tracker.createInstance<Cross_body_itemContext>(_ctx, getState());
   enterRule(_localctx, 570, SV3_1aParser::RuleCross_body_item);
@@ -38611,14 +35887,6 @@
     parserListener->exitBins_selection_or_option(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bins_selection_or_optionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_selection_or_option(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bins_selection_or_optionContext* SV3_1aParser::bins_selection_or_option() {
   Bins_selection_or_optionContext *_localctx = _tracker.createInstance<Bins_selection_or_optionContext>(_ctx, getState());
   enterRule(_localctx, 572, SV3_1aParser::RuleBins_selection_or_option);
@@ -38726,14 +35994,6 @@
     parserListener->exitBins_selection(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bins_selectionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_selection(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bins_selectionContext* SV3_1aParser::bins_selection() {
   Bins_selectionContext *_localctx = _tracker.createInstance<Bins_selectionContext>(_ctx, getState());
   enterRule(_localctx, 574, SV3_1aParser::RuleBins_selection);
@@ -38853,14 +36113,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::Select_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSelect_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::Select_expressionContext* SV3_1aParser::select_expression() {
    return select_expression(0);
 }
@@ -39073,14 +36325,6 @@
     parserListener->exitSelect_condition(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Select_conditionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSelect_condition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Select_conditionContext* SV3_1aParser::select_condition() {
   Select_conditionContext *_localctx = _tracker.createInstance<Select_conditionContext>(_ctx, getState());
   enterRule(_localctx, 578, SV3_1aParser::RuleSelect_condition);
@@ -39161,14 +36405,6 @@
     parserListener->exitBins_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bins_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBins_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bins_expressionContext* SV3_1aParser::bins_expression() {
   Bins_expressionContext *_localctx = _tracker.createInstance<Bins_expressionContext>(_ctx, getState());
   enterRule(_localctx, 580, SV3_1aParser::RuleBins_expression);
@@ -39241,14 +36477,6 @@
     parserListener->exitOpen_range_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Open_range_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOpen_range_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Open_range_listContext* SV3_1aParser::open_range_list() {
   Open_range_listContext *_localctx = _tracker.createInstance<Open_range_listContext>(_ctx, getState());
   enterRule(_localctx, 582, SV3_1aParser::RuleOpen_range_list);
@@ -39439,14 +36667,6 @@
     parserListener->exitGate_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Gate_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGate_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Gate_instantiationContext* SV3_1aParser::gate_instantiation() {
   Gate_instantiationContext *_localctx = _tracker.createInstance<Gate_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 584, SV3_1aParser::RuleGate_instantiation);
@@ -39855,14 +37075,6 @@
     parserListener->exitCmos_switch_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cmos_switch_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCmos_switch_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cmos_switch_instanceContext* SV3_1aParser::cmos_switch_instance() {
   Cmos_switch_instanceContext *_localctx = _tracker.createInstance<Cmos_switch_instanceContext>(_ctx, getState());
   enterRule(_localctx, 586, SV3_1aParser::RuleCmos_switch_instance);
@@ -39983,14 +37195,6 @@
     parserListener->exitEnable_gate_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Enable_gate_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnable_gate_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Enable_gate_instanceContext* SV3_1aParser::enable_gate_instance() {
   Enable_gate_instanceContext *_localctx = _tracker.createInstance<Enable_gate_instanceContext>(_ctx, getState());
   enterRule(_localctx, 588, SV3_1aParser::RuleEnable_gate_instance);
@@ -40107,14 +37311,6 @@
     parserListener->exitMos_switch_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Mos_switch_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMos_switch_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Mos_switch_instanceContext* SV3_1aParser::mos_switch_instance() {
   Mos_switch_instanceContext *_localctx = _tracker.createInstance<Mos_switch_instanceContext>(_ctx, getState());
   enterRule(_localctx, 590, SV3_1aParser::RuleMos_switch_instance);
@@ -40231,14 +37427,6 @@
     parserListener->exitN_input_gate_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::N_input_gate_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitN_input_gate_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::N_input_gate_instanceContext* SV3_1aParser::n_input_gate_instance() {
   N_input_gate_instanceContext *_localctx = _tracker.createInstance<N_input_gate_instanceContext>(_ctx, getState());
   enterRule(_localctx, 592, SV3_1aParser::RuleN_input_gate_instance);
@@ -40363,14 +37551,6 @@
     parserListener->exitN_output_gate_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::N_output_gate_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitN_output_gate_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::N_output_gate_instanceContext* SV3_1aParser::n_output_gate_instance() {
   N_output_gate_instanceContext *_localctx = _tracker.createInstance<N_output_gate_instanceContext>(_ctx, getState());
   enterRule(_localctx, 594, SV3_1aParser::RuleN_output_gate_instance);
@@ -40490,14 +37670,6 @@
     parserListener->exitPass_switch_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pass_switch_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPass_switch_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pass_switch_instanceContext* SV3_1aParser::pass_switch_instance() {
   Pass_switch_instanceContext *_localctx = _tracker.createInstance<Pass_switch_instanceContext>(_ctx, getState());
   enterRule(_localctx, 596, SV3_1aParser::RulePass_switch_instance);
@@ -40610,14 +37782,6 @@
     parserListener->exitPass_enable_switch_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pass_enable_switch_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPass_enable_switch_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pass_enable_switch_instanceContext* SV3_1aParser::pass_enable_switch_instance() {
   Pass_enable_switch_instanceContext *_localctx = _tracker.createInstance<Pass_enable_switch_instanceContext>(_ctx, getState());
   enterRule(_localctx, 598, SV3_1aParser::RulePass_enable_switch_instance);
@@ -40718,14 +37882,6 @@
     parserListener->exitPull_gate_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pull_gate_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPull_gate_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pull_gate_instanceContext* SV3_1aParser::pull_gate_instance() {
   Pull_gate_instanceContext *_localctx = _tracker.createInstance<Pull_gate_instanceContext>(_ctx, getState());
   enterRule(_localctx, 600, SV3_1aParser::RulePull_gate_instance);
@@ -40828,13 +37984,6 @@
   if (parserListener != nullptr)
     parserListener->exitPulldownStrength_01(this);
 }
-
-antlrcpp::Any SV3_1aParser::PulldownStrength_01Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPulldownStrength_01(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PulldownStrength_10Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PulldownStrength_10Context::OPEN_PARENS() {
@@ -40869,13 +38018,6 @@
   if (parserListener != nullptr)
     parserListener->exitPulldownStrength_10(this);
 }
-
-antlrcpp::Any SV3_1aParser::PulldownStrength_10Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPulldownStrength_10(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PulldownStrength_0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PulldownStrength_0Context::OPEN_PARENS() {
@@ -40902,13 +38044,6 @@
   if (parserListener != nullptr)
     parserListener->exitPulldownStrength_0(this);
 }
-
-antlrcpp::Any SV3_1aParser::PulldownStrength_0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPulldownStrength_0(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Pulldown_strengthContext* SV3_1aParser::pulldown_strength() {
   Pulldown_strengthContext *_localctx = _tracker.createInstance<Pulldown_strengthContext>(_ctx, getState());
   enterRule(_localctx, 602, SV3_1aParser::RulePulldown_strength);
@@ -41025,13 +38160,6 @@
   if (parserListener != nullptr)
     parserListener->exitPullupStrength_10(this);
 }
-
-antlrcpp::Any SV3_1aParser::PullupStrength_10Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPullupStrength_10(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PullupStrength_01Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PullupStrength_01Context::OPEN_PARENS() {
@@ -41066,13 +38194,6 @@
   if (parserListener != nullptr)
     parserListener->exitPullupStrength_01(this);
 }
-
-antlrcpp::Any SV3_1aParser::PullupStrength_01Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPullupStrength_01(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PullupStrength_1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PullupStrength_1Context::OPEN_PARENS() {
@@ -41099,13 +38220,6 @@
   if (parserListener != nullptr)
     parserListener->exitPullupStrength_1(this);
 }
-
-antlrcpp::Any SV3_1aParser::PullupStrength_1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPullupStrength_1(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Pullup_strengthContext* SV3_1aParser::pullup_strength() {
   Pullup_strengthContext *_localctx = _tracker.createInstance<Pullup_strengthContext>(_ctx, getState());
   enterRule(_localctx, 604, SV3_1aParser::RulePullup_strength);
@@ -41206,13 +38320,6 @@
   if (parserListener != nullptr)
     parserListener->exitCmosSwitchType_RCmos(this);
 }
-
-antlrcpp::Any SV3_1aParser::CmosSwitchType_RCmosContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCmosSwitchType_RCmos(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- CmosSwitchType_CmosContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::CmosSwitchType_CmosContext::CMOS() {
@@ -41231,13 +38338,6 @@
   if (parserListener != nullptr)
     parserListener->exitCmosSwitchType_Cmos(this);
 }
-
-antlrcpp::Any SV3_1aParser::CmosSwitchType_CmosContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCmosSwitchType_Cmos(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Cmos_switchtypeContext* SV3_1aParser::cmos_switchtype() {
   Cmos_switchtypeContext *_localctx = _tracker.createInstance<Cmos_switchtypeContext>(_ctx, getState());
   enterRule(_localctx, 606, SV3_1aParser::RuleCmos_switchtype);
@@ -41312,13 +38412,6 @@
   if (parserListener != nullptr)
     parserListener->exitEnableGateType_Bufif0(this);
 }
-
-antlrcpp::Any SV3_1aParser::EnableGateType_Bufif0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnableGateType_Bufif0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- EnableGateType_Notif0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::EnableGateType_Notif0Context::NOTIF0() {
@@ -41337,13 +38430,6 @@
   if (parserListener != nullptr)
     parserListener->exitEnableGateType_Notif0(this);
 }
-
-antlrcpp::Any SV3_1aParser::EnableGateType_Notif0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnableGateType_Notif0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- EnableGateType_Notif1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::EnableGateType_Notif1Context::NOTIF1() {
@@ -41362,13 +38448,6 @@
   if (parserListener != nullptr)
     parserListener->exitEnableGateType_Notif1(this);
 }
-
-antlrcpp::Any SV3_1aParser::EnableGateType_Notif1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnableGateType_Notif1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- EnableGateType_Bufif1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::EnableGateType_Bufif1Context::BUFIF1() {
@@ -41387,13 +38466,6 @@
   if (parserListener != nullptr)
     parserListener->exitEnableGateType_Bufif1(this);
 }
-
-antlrcpp::Any SV3_1aParser::EnableGateType_Bufif1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnableGateType_Bufif1(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Enable_gatetypeContext* SV3_1aParser::enable_gatetype() {
   Enable_gatetypeContext *_localctx = _tracker.createInstance<Enable_gatetypeContext>(_ctx, getState());
   enterRule(_localctx, 608, SV3_1aParser::RuleEnable_gatetype);
@@ -41484,13 +38556,6 @@
   if (parserListener != nullptr)
     parserListener->exitMosSwitchType_PMos(this);
 }
-
-antlrcpp::Any SV3_1aParser::MosSwitchType_PMosContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMosSwitchType_PMos(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- MosSwitchType_NMosContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::MosSwitchType_NMosContext::NMOS() {
@@ -41509,13 +38574,6 @@
   if (parserListener != nullptr)
     parserListener->exitMosSwitchType_NMos(this);
 }
-
-antlrcpp::Any SV3_1aParser::MosSwitchType_NMosContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMosSwitchType_NMos(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- MosSwitchType_RPMosContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::MosSwitchType_RPMosContext::RPMOS() {
@@ -41534,13 +38592,6 @@
   if (parserListener != nullptr)
     parserListener->exitMosSwitchType_RPMos(this);
 }
-
-antlrcpp::Any SV3_1aParser::MosSwitchType_RPMosContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMosSwitchType_RPMos(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- MosSwitchType_RNMosContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::MosSwitchType_RNMosContext::RNMOS() {
@@ -41559,13 +38610,6 @@
   if (parserListener != nullptr)
     parserListener->exitMosSwitchType_RNMos(this);
 }
-
-antlrcpp::Any SV3_1aParser::MosSwitchType_RNMosContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMosSwitchType_RNMos(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Mos_switchtypeContext* SV3_1aParser::mos_switchtype() {
   Mos_switchtypeContext *_localctx = _tracker.createInstance<Mos_switchtypeContext>(_ctx, getState());
   enterRule(_localctx, 610, SV3_1aParser::RuleMos_switchtype);
@@ -41656,13 +38700,6 @@
   if (parserListener != nullptr)
     parserListener->exitNInpGate_Xor(this);
 }
-
-antlrcpp::Any SV3_1aParser::NInpGate_XorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNInpGate_Xor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NInpGate_NandContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NInpGate_NandContext::NAND() {
@@ -41681,13 +38718,6 @@
   if (parserListener != nullptr)
     parserListener->exitNInpGate_Nand(this);
 }
-
-antlrcpp::Any SV3_1aParser::NInpGate_NandContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNInpGate_Nand(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NInpGate_AndContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NInpGate_AndContext::AND() {
@@ -41706,13 +38736,6 @@
   if (parserListener != nullptr)
     parserListener->exitNInpGate_And(this);
 }
-
-antlrcpp::Any SV3_1aParser::NInpGate_AndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNInpGate_And(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NInpGate_OrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NInpGate_OrContext::OR() {
@@ -41731,13 +38754,6 @@
   if (parserListener != nullptr)
     parserListener->exitNInpGate_Or(this);
 }
-
-antlrcpp::Any SV3_1aParser::NInpGate_OrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNInpGate_Or(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NInpGate_XnorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NInpGate_XnorContext::XNOR() {
@@ -41756,13 +38772,6 @@
   if (parserListener != nullptr)
     parserListener->exitNInpGate_Xnor(this);
 }
-
-antlrcpp::Any SV3_1aParser::NInpGate_XnorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNInpGate_Xnor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NInpGate_NorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NInpGate_NorContext::NOR() {
@@ -41781,13 +38790,6 @@
   if (parserListener != nullptr)
     parserListener->exitNInpGate_Nor(this);
 }
-
-antlrcpp::Any SV3_1aParser::NInpGate_NorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNInpGate_Nor(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::N_input_gatetypeContext* SV3_1aParser::n_input_gatetype() {
   N_input_gatetypeContext *_localctx = _tracker.createInstance<N_input_gatetypeContext>(_ctx, getState());
   enterRule(_localctx, 612, SV3_1aParser::RuleN_input_gatetype);
@@ -41894,13 +38896,6 @@
   if (parserListener != nullptr)
     parserListener->exitNOutGate_Buf(this);
 }
-
-antlrcpp::Any SV3_1aParser::NOutGate_BufContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNOutGate_Buf(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- NOutGate_NotContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::NOutGate_NotContext::NOT() {
@@ -41919,13 +38914,6 @@
   if (parserListener != nullptr)
     parserListener->exitNOutGate_Not(this);
 }
-
-antlrcpp::Any SV3_1aParser::NOutGate_NotContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNOutGate_Not(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::N_output_gatetypeContext* SV3_1aParser::n_output_gatetype() {
   N_output_gatetypeContext *_localctx = _tracker.createInstance<N_output_gatetypeContext>(_ctx, getState());
   enterRule(_localctx, 614, SV3_1aParser::RuleN_output_gatetype);
@@ -42000,13 +38988,6 @@
   if (parserListener != nullptr)
     parserListener->exitPassEnSwitch_RTranif1(this);
 }
-
-antlrcpp::Any SV3_1aParser::PassEnSwitch_RTranif1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPassEnSwitch_RTranif1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PassEnSwitch_Tranif0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PassEnSwitch_Tranif0Context::TRANIF0() {
@@ -42025,13 +39006,6 @@
   if (parserListener != nullptr)
     parserListener->exitPassEnSwitch_Tranif0(this);
 }
-
-antlrcpp::Any SV3_1aParser::PassEnSwitch_Tranif0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPassEnSwitch_Tranif0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PassEnSwitch_Tranif1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PassEnSwitch_Tranif1Context::TRANIF1() {
@@ -42050,13 +39024,6 @@
   if (parserListener != nullptr)
     parserListener->exitPassEnSwitch_Tranif1(this);
 }
-
-antlrcpp::Any SV3_1aParser::PassEnSwitch_Tranif1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPassEnSwitch_Tranif1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PassEnSwitch_RTranif0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PassEnSwitch_RTranif0Context::RTRANIF0() {
@@ -42075,13 +39042,6 @@
   if (parserListener != nullptr)
     parserListener->exitPassEnSwitch_RTranif0(this);
 }
-
-antlrcpp::Any SV3_1aParser::PassEnSwitch_RTranif0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPassEnSwitch_RTranif0(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Pass_en_switchtypeContext* SV3_1aParser::pass_en_switchtype() {
   Pass_en_switchtypeContext *_localctx = _tracker.createInstance<Pass_en_switchtypeContext>(_ctx, getState());
   enterRule(_localctx, 616, SV3_1aParser::RulePass_en_switchtype);
@@ -42172,13 +39132,6 @@
   if (parserListener != nullptr)
     parserListener->exitPassSwitch_RTran(this);
 }
-
-antlrcpp::Any SV3_1aParser::PassSwitch_RTranContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPassSwitch_RTran(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- PassSwitch_TranContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::PassSwitch_TranContext::TRAN() {
@@ -42197,13 +39150,6 @@
   if (parserListener != nullptr)
     parserListener->exitPassSwitch_Tran(this);
 }
-
-antlrcpp::Any SV3_1aParser::PassSwitch_TranContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPassSwitch_Tran(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Pass_switchtypeContext* SV3_1aParser::pass_switchtype() {
   Pass_switchtypeContext *_localctx = _tracker.createInstance<Pass_switchtypeContext>(_ctx, getState());
   enterRule(_localctx, 618, SV3_1aParser::RulePass_switchtype);
@@ -42296,14 +39242,6 @@
     parserListener->exitModule_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_instantiationContext* SV3_1aParser::module_instantiation() {
   Module_instantiationContext *_localctx = _tracker.createInstance<Module_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 620, SV3_1aParser::RuleModule_instantiation);
@@ -42398,14 +39336,6 @@
     parserListener->exitParameter_value_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Parameter_value_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParameter_value_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Parameter_value_assignmentContext* SV3_1aParser::parameter_value_assignment() {
   Parameter_value_assignmentContext *_localctx = _tracker.createInstance<Parameter_value_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 622, SV3_1aParser::RuleParameter_value_assignment);
@@ -42590,14 +39520,6 @@
     parserListener->exitList_of_parameter_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_parameter_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_parameter_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_parameter_assignmentsContext* SV3_1aParser::list_of_parameter_assignments() {
   List_of_parameter_assignmentsContext *_localctx = _tracker.createInstance<List_of_parameter_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 624, SV3_1aParser::RuleList_of_parameter_assignments);
@@ -42764,14 +39686,6 @@
     parserListener->exitOrdered_parameter_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ordered_parameter_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOrdered_parameter_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ordered_parameter_assignmentContext* SV3_1aParser::ordered_parameter_assignment() {
   Ordered_parameter_assignmentContext *_localctx = _tracker.createInstance<Ordered_parameter_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 626, SV3_1aParser::RuleOrdered_parameter_assignment);
@@ -42837,14 +39751,6 @@
     parserListener->exitNamed_parameter_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Named_parameter_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNamed_parameter_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Named_parameter_assignmentContext* SV3_1aParser::named_parameter_assignment() {
   Named_parameter_assignmentContext *_localctx = _tracker.createInstance<Named_parameter_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 628, SV3_1aParser::RuleNamed_parameter_assignment);
@@ -42997,14 +39903,6 @@
     parserListener->exitHierarchical_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Hierarchical_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitHierarchical_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Hierarchical_instanceContext* SV3_1aParser::hierarchical_instance() {
   Hierarchical_instanceContext *_localctx = _tracker.createInstance<Hierarchical_instanceContext>(_ctx, getState());
   enterRule(_localctx, 630, SV3_1aParser::RuleHierarchical_instance);
@@ -43068,14 +39966,6 @@
     parserListener->exitName_of_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Name_of_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitName_of_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Name_of_instanceContext* SV3_1aParser::name_of_instance() {
   Name_of_instanceContext *_localctx = _tracker.createInstance<Name_of_instanceContext>(_ctx, getState());
   enterRule(_localctx, 632, SV3_1aParser::RuleName_of_instance);
@@ -43156,14 +40046,6 @@
     parserListener->exitList_of_port_connections(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_port_connectionsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_port_connections(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_port_connectionsContext* SV3_1aParser::list_of_port_connections() {
   List_of_port_connectionsContext *_localctx = _tracker.createInstance<List_of_port_connectionsContext>(_ctx, getState());
   enterRule(_localctx, 634, SV3_1aParser::RuleList_of_port_connections);
@@ -43261,14 +40143,6 @@
     parserListener->exitOrdered_port_connection(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ordered_port_connectionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOrdered_port_connection(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ordered_port_connectionContext* SV3_1aParser::ordered_port_connection() {
   Ordered_port_connectionContext *_localctx = _tracker.createInstance<Ordered_port_connectionContext>(_ctx, getState());
   enterRule(_localctx, 636, SV3_1aParser::RuleOrdered_port_connection);
@@ -43433,14 +40307,6 @@
     parserListener->exitNamed_port_connection(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Named_port_connectionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNamed_port_connection(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Named_port_connectionContext* SV3_1aParser::named_port_connection() {
   Named_port_connectionContext *_localctx = _tracker.createInstance<Named_port_connectionContext>(_ctx, getState());
   enterRule(_localctx, 638, SV3_1aParser::RuleNamed_port_connection);
@@ -43631,14 +40497,6 @@
     parserListener->exitInterface_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_instantiationContext* SV3_1aParser::interface_instantiation() {
   Interface_instantiationContext *_localctx = _tracker.createInstance<Interface_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 640, SV3_1aParser::RuleInterface_instantiation);
@@ -43737,14 +40595,6 @@
     parserListener->exitProgram_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Program_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProgram_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Program_instantiationContext* SV3_1aParser::program_instantiation() {
   Program_instantiationContext *_localctx = _tracker.createInstance<Program_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 642, SV3_1aParser::RuleProgram_instantiation);
@@ -43835,14 +40685,6 @@
     parserListener->exitChecker_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Checker_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitChecker_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Checker_instantiationContext* SV3_1aParser::checker_instantiation() {
   Checker_instantiationContext *_localctx = _tracker.createInstance<Checker_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 644, SV3_1aParser::RuleChecker_instantiation);
@@ -43916,14 +40758,6 @@
     parserListener->exitList_of_checker_port_connections(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_checker_port_connectionsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_checker_port_connections(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_checker_port_connectionsContext* SV3_1aParser::list_of_checker_port_connections() {
   List_of_checker_port_connectionsContext *_localctx = _tracker.createInstance<List_of_checker_port_connectionsContext>(_ctx, getState());
   enterRule(_localctx, 646, SV3_1aParser::RuleList_of_checker_port_connections);
@@ -44017,14 +40851,6 @@
     parserListener->exitOrdered_checker_port_connection(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ordered_checker_port_connectionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOrdered_checker_port_connection(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ordered_checker_port_connectionContext* SV3_1aParser::ordered_checker_port_connection() {
   Ordered_checker_port_connectionContext *_localctx = _tracker.createInstance<Ordered_checker_port_connectionContext>(_ctx, getState());
   enterRule(_localctx, 648, SV3_1aParser::RuleOrdered_checker_port_connection);
@@ -44210,14 +41036,6 @@
     parserListener->exitNamed_checker_port_connection(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Named_checker_port_connectionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNamed_checker_port_connection(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Named_checker_port_connectionContext* SV3_1aParser::named_checker_port_connection() {
   Named_checker_port_connectionContext *_localctx = _tracker.createInstance<Named_checker_port_connectionContext>(_ctx, getState());
   enterRule(_localctx, 650, SV3_1aParser::RuleNamed_checker_port_connection);
@@ -44405,14 +41223,6 @@
     parserListener->exitEndgenerate(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndgenerateContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndgenerate(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndgenerateContext* SV3_1aParser::endgenerate() {
   EndgenerateContext *_localctx = _tracker.createInstance<EndgenerateContext>(_ctx, getState());
   enterRule(_localctx, 652, SV3_1aParser::RuleEndgenerate);
@@ -44474,14 +41284,6 @@
     parserListener->exitGenerated_module_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generated_module_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerated_module_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generated_module_instantiationContext* SV3_1aParser::generated_module_instantiation() {
   Generated_module_instantiationContext *_localctx = _tracker.createInstance<Generated_module_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 654, SV3_1aParser::RuleGenerated_module_instantiation);
@@ -44688,14 +41490,6 @@
     parserListener->exitGenerate_module_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_module_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_module_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_module_itemContext* SV3_1aParser::generate_module_item() {
   Generate_module_itemContext *_localctx = _tracker.createInstance<Generate_module_itemContext>(_ctx, getState());
   enterRule(_localctx, 656, SV3_1aParser::RuleGenerate_module_item);
@@ -44834,14 +41628,6 @@
     parserListener->exitGenerate_module_conditional_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_module_conditional_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_module_conditional_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_module_conditional_statementContext* SV3_1aParser::generate_module_conditional_statement() {
   Generate_module_conditional_statementContext *_localctx = _tracker.createInstance<Generate_module_conditional_statementContext>(_ctx, getState());
   enterRule(_localctx, 658, SV3_1aParser::RuleGenerate_module_conditional_statement);
@@ -44936,14 +41722,6 @@
     parserListener->exitGenerate_module_case_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_module_case_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_module_case_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_module_case_statementContext* SV3_1aParser::generate_module_case_statement() {
   Generate_module_case_statementContext *_localctx = _tracker.createInstance<Generate_module_case_statementContext>(_ctx, getState());
   enterRule(_localctx, 660, SV3_1aParser::RuleGenerate_module_case_statement);
@@ -45105,14 +41883,6 @@
     parserListener->exitGenvar_module_case_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Genvar_module_case_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenvar_module_case_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Genvar_module_case_itemContext* SV3_1aParser::genvar_module_case_item() {
   Genvar_module_case_itemContext *_localctx = _tracker.createInstance<Genvar_module_case_itemContext>(_ctx, getState());
   enterRule(_localctx, 662, SV3_1aParser::RuleGenvar_module_case_item);
@@ -45303,14 +42073,6 @@
     parserListener->exitGenerate_module_loop_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_module_loop_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_module_loop_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_module_loop_statementContext* SV3_1aParser::generate_module_loop_statement() {
   Generate_module_loop_statementContext *_localctx = _tracker.createInstance<Generate_module_loop_statementContext>(_ctx, getState());
   enterRule(_localctx, 664, SV3_1aParser::RuleGenerate_module_loop_statement);
@@ -45388,14 +42150,6 @@
     parserListener->exitGenvar_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Genvar_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenvar_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Genvar_assignmentContext* SV3_1aParser::genvar_assignment() {
   Genvar_assignmentContext *_localctx = _tracker.createInstance<Genvar_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 666, SV3_1aParser::RuleGenvar_assignment);
@@ -45487,14 +42241,6 @@
     parserListener->exitGenvar_decl_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Genvar_decl_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenvar_decl_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Genvar_decl_assignmentContext* SV3_1aParser::genvar_decl_assignment() {
   Genvar_decl_assignmentContext *_localctx = _tracker.createInstance<Genvar_decl_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 668, SV3_1aParser::RuleGenvar_decl_assignment);
@@ -45589,14 +42335,6 @@
     parserListener->exitGenerate_module_named_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_module_named_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_module_named_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_module_named_blockContext* SV3_1aParser::generate_module_named_block() {
   Generate_module_named_blockContext *_localctx = _tracker.createInstance<Generate_module_named_blockContext>(_ctx, getState());
   enterRule(_localctx, 670, SV3_1aParser::RuleGenerate_module_named_block);
@@ -45859,14 +42597,6 @@
     parserListener->exitGenerate_module_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_module_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_module_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_module_blockContext* SV3_1aParser::generate_module_block() {
   Generate_module_blockContext *_localctx = _tracker.createInstance<Generate_module_blockContext>(_ctx, getState());
   enterRule(_localctx, 672, SV3_1aParser::RuleGenerate_module_block);
@@ -46081,14 +42811,6 @@
     parserListener->exitGenerated_interface_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generated_interface_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerated_interface_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generated_interface_instantiationContext* SV3_1aParser::generated_interface_instantiation() {
   Generated_interface_instantiationContext *_localctx = _tracker.createInstance<Generated_interface_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 674, SV3_1aParser::RuleGenerated_interface_instantiation);
@@ -46269,14 +42991,6 @@
     parserListener->exitGenerate_interface_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_interface_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_interface_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_interface_itemContext* SV3_1aParser::generate_interface_item() {
   Generate_interface_itemContext *_localctx = _tracker.createInstance<Generate_interface_itemContext>(_ctx, getState());
   enterRule(_localctx, 676, SV3_1aParser::RuleGenerate_interface_item);
@@ -46390,14 +43104,6 @@
     parserListener->exitGenerate_interface_conditional_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_interface_conditional_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_interface_conditional_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_interface_conditional_statementContext* SV3_1aParser::generate_interface_conditional_statement() {
   Generate_interface_conditional_statementContext *_localctx = _tracker.createInstance<Generate_interface_conditional_statementContext>(_ctx, getState());
   enterRule(_localctx, 678, SV3_1aParser::RuleGenerate_interface_conditional_statement);
@@ -46492,14 +43198,6 @@
     parserListener->exitGenerate_interface_case_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_interface_case_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_interface_case_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_interface_case_statementContext* SV3_1aParser::generate_interface_case_statement() {
   Generate_interface_case_statementContext *_localctx = _tracker.createInstance<Generate_interface_case_statementContext>(_ctx, getState());
   enterRule(_localctx, 680, SV3_1aParser::RuleGenerate_interface_case_statement);
@@ -46661,14 +43359,6 @@
     parserListener->exitGenvar_interface_case_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Genvar_interface_case_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenvar_interface_case_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Genvar_interface_case_itemContext* SV3_1aParser::genvar_interface_case_item() {
   Genvar_interface_case_itemContext *_localctx = _tracker.createInstance<Genvar_interface_case_itemContext>(_ctx, getState());
   enterRule(_localctx, 682, SV3_1aParser::RuleGenvar_interface_case_item);
@@ -46859,14 +43549,6 @@
     parserListener->exitGenerate_interface_loop_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_interface_loop_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_interface_loop_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_interface_loop_statementContext* SV3_1aParser::generate_interface_loop_statement() {
   Generate_interface_loop_statementContext *_localctx = _tracker.createInstance<Generate_interface_loop_statementContext>(_ctx, getState());
   enterRule(_localctx, 684, SV3_1aParser::RuleGenerate_interface_loop_statement);
@@ -46964,14 +43646,6 @@
     parserListener->exitGenerate_interface_named_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_interface_named_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_interface_named_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_interface_named_blockContext* SV3_1aParser::generate_interface_named_block() {
   Generate_interface_named_blockContext *_localctx = _tracker.createInstance<Generate_interface_named_blockContext>(_ctx, getState());
   enterRule(_localctx, 686, SV3_1aParser::RuleGenerate_interface_named_block);
@@ -47208,14 +43882,6 @@
     parserListener->exitGenerate_interface_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_interface_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_interface_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_interface_blockContext* SV3_1aParser::generate_interface_block() {
   Generate_interface_blockContext *_localctx = _tracker.createInstance<Generate_interface_blockContext>(_ctx, getState());
   enterRule(_localctx, 688, SV3_1aParser::RuleGenerate_interface_block);
@@ -47404,14 +44070,6 @@
     parserListener->exitGenerate_region(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_regionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_region(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_regionContext* SV3_1aParser::generate_region() {
   Generate_regionContext *_localctx = _tracker.createInstance<Generate_regionContext>(_ctx, getState());
   enterRule(_localctx, 690, SV3_1aParser::RuleGenerate_region);
@@ -47629,14 +44287,6 @@
     parserListener->exitLoop_generate_construct(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Loop_generate_constructContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLoop_generate_construct(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Loop_generate_constructContext* SV3_1aParser::loop_generate_construct() {
   Loop_generate_constructContext *_localctx = _tracker.createInstance<Loop_generate_constructContext>(_ctx, getState());
   enterRule(_localctx, 692, SV3_1aParser::RuleLoop_generate_construct);
@@ -47714,14 +44364,6 @@
     parserListener->exitGenvar_initialization(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Genvar_initializationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenvar_initialization(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Genvar_initializationContext* SV3_1aParser::genvar_initialization() {
   Genvar_initializationContext *_localctx = _tracker.createInstance<Genvar_initializationContext>(_ctx, getState());
   enterRule(_localctx, 694, SV3_1aParser::RuleGenvar_initialization);
@@ -47796,14 +44438,6 @@
     parserListener->exitGenvar_iteration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Genvar_iterationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenvar_iteration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Genvar_iterationContext* SV3_1aParser::genvar_iteration() {
   Genvar_iterationContext *_localctx = _tracker.createInstance<Genvar_iterationContext>(_ctx, getState());
   enterRule(_localctx, 696, SV3_1aParser::RuleGenvar_iteration);
@@ -47887,14 +44521,6 @@
     parserListener->exitConditional_generate_construct(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Conditional_generate_constructContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConditional_generate_construct(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Conditional_generate_constructContext* SV3_1aParser::conditional_generate_construct() {
   Conditional_generate_constructContext *_localctx = _tracker.createInstance<Conditional_generate_constructContext>(_ctx, getState());
   enterRule(_localctx, 698, SV3_1aParser::RuleConditional_generate_construct);
@@ -47985,14 +44611,6 @@
     parserListener->exitIf_generate_construct(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::If_generate_constructContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIf_generate_construct(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::If_generate_constructContext* SV3_1aParser::if_generate_construct() {
   If_generate_constructContext *_localctx = _tracker.createInstance<If_generate_constructContext>(_ctx, getState());
   enterRule(_localctx, 700, SV3_1aParser::RuleIf_generate_construct);
@@ -48087,14 +44705,6 @@
     parserListener->exitCase_generate_construct(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Case_generate_constructContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCase_generate_construct(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Case_generate_constructContext* SV3_1aParser::case_generate_construct() {
   Case_generate_constructContext *_localctx = _tracker.createInstance<Case_generate_constructContext>(_ctx, getState());
   enterRule(_localctx, 702, SV3_1aParser::RuleCase_generate_construct);
@@ -48256,14 +44866,6 @@
     parserListener->exitCase_generate_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Case_generate_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCase_generate_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Case_generate_itemContext* SV3_1aParser::case_generate_item() {
   Case_generate_itemContext *_localctx = _tracker.createInstance<Case_generate_itemContext>(_ctx, getState());
   enterRule(_localctx, 704, SV3_1aParser::RuleCase_generate_item);
@@ -48450,14 +45052,6 @@
     parserListener->exitGenerate_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_blockContext* SV3_1aParser::generate_block() {
   Generate_blockContext *_localctx = _tracker.createInstance<Generate_blockContext>(_ctx, getState());
   enterRule(_localctx, 706, SV3_1aParser::RuleGenerate_block);
@@ -48714,14 +45308,6 @@
     parserListener->exitGenerate_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Generate_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitGenerate_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Generate_itemContext* SV3_1aParser::generate_item() {
   Generate_itemContext *_localctx = _tracker.createInstance<Generate_itemContext>(_ctx, getState());
   enterRule(_localctx, 708, SV3_1aParser::RuleGenerate_item);
@@ -48821,14 +45407,6 @@
     parserListener->exitUdp_nonansi_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_nonansi_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_nonansi_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_nonansi_declarationContext* SV3_1aParser::udp_nonansi_declaration() {
   Udp_nonansi_declarationContext *_localctx = _tracker.createInstance<Udp_nonansi_declarationContext>(_ctx, getState());
   enterRule(_localctx, 710, SV3_1aParser::RuleUdp_nonansi_declaration);
@@ -48927,14 +45505,6 @@
     parserListener->exitUdp_ansi_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_ansi_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_ansi_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_ansi_declarationContext* SV3_1aParser::udp_ansi_declaration() {
   Udp_ansi_declarationContext *_localctx = _tracker.createInstance<Udp_ansi_declarationContext>(_ctx, getState());
   enterRule(_localctx, 712, SV3_1aParser::RuleUdp_ansi_declaration);
@@ -49005,14 +45575,6 @@
     parserListener->exitEndprimitive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndprimitiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndprimitive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndprimitiveContext* SV3_1aParser::endprimitive() {
   EndprimitiveContext *_localctx = _tracker.createInstance<EndprimitiveContext>(_ctx, getState());
   enterRule(_localctx, 714, SV3_1aParser::RuleEndprimitive);
@@ -49126,14 +45688,6 @@
     parserListener->exitUdp_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_declarationContext* SV3_1aParser::udp_declaration() {
   Udp_declarationContext *_localctx = _tracker.createInstance<Udp_declarationContext>(_ctx, getState());
   enterRule(_localctx, 716, SV3_1aParser::RuleUdp_declaration);
@@ -49326,14 +45880,6 @@
     parserListener->exitUdp_port_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_port_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_port_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_port_listContext* SV3_1aParser::udp_port_list() {
   Udp_port_listContext *_localctx = _tracker.createInstance<Udp_port_listContext>(_ctx, getState());
   enterRule(_localctx, 718, SV3_1aParser::RuleUdp_port_list);
@@ -49416,14 +45962,6 @@
     parserListener->exitUdp_declaration_port_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_declaration_port_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_declaration_port_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_declaration_port_listContext* SV3_1aParser::udp_declaration_port_list() {
   Udp_declaration_port_listContext *_localctx = _tracker.createInstance<Udp_declaration_port_listContext>(_ctx, getState());
   enterRule(_localctx, 720, SV3_1aParser::RuleUdp_declaration_port_list);
@@ -49502,14 +46040,6 @@
     parserListener->exitUdp_port_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_port_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_port_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_port_declarationContext* SV3_1aParser::udp_port_declaration() {
   Udp_port_declarationContext *_localctx = _tracker.createInstance<Udp_port_declarationContext>(_ctx, getState());
   enterRule(_localctx, 722, SV3_1aParser::RuleUdp_port_declaration);
@@ -49611,14 +46141,6 @@
     parserListener->exitUdp_output_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_output_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_output_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_output_declarationContext* SV3_1aParser::udp_output_declaration() {
   Udp_output_declarationContext *_localctx = _tracker.createInstance<Udp_output_declarationContext>(_ctx, getState());
   enterRule(_localctx, 724, SV3_1aParser::RuleUdp_output_declaration);
@@ -49721,14 +46243,6 @@
     parserListener->exitUdp_input_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_input_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_input_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_input_declarationContext* SV3_1aParser::udp_input_declaration() {
   Udp_input_declarationContext *_localctx = _tracker.createInstance<Udp_input_declarationContext>(_ctx, getState());
   enterRule(_localctx, 726, SV3_1aParser::RuleUdp_input_declaration);
@@ -49803,14 +46317,6 @@
     parserListener->exitUdp_reg_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_reg_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_reg_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_reg_declarationContext* SV3_1aParser::udp_reg_declaration() {
   Udp_reg_declarationContext *_localctx = _tracker.createInstance<Udp_reg_declarationContext>(_ctx, getState());
   enterRule(_localctx, 728, SV3_1aParser::RuleUdp_reg_declaration);
@@ -49877,14 +46383,6 @@
     parserListener->exitUdp_body(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_bodyContext* SV3_1aParser::udp_body() {
   Udp_bodyContext *_localctx = _tracker.createInstance<Udp_bodyContext>(_ctx, getState());
   enterRule(_localctx, 730, SV3_1aParser::RuleUdp_body);
@@ -49949,14 +46447,6 @@
     parserListener->exitEndtable(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndtableContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndtable(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndtableContext* SV3_1aParser::endtable() {
   EndtableContext *_localctx = _tracker.createInstance<EndtableContext>(_ctx, getState());
   enterRule(_localctx, 732, SV3_1aParser::RuleEndtable);
@@ -50018,14 +46508,6 @@
     parserListener->exitCombinational_body(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Combinational_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCombinational_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Combinational_bodyContext* SV3_1aParser::combinational_body() {
   Combinational_bodyContext *_localctx = _tracker.createInstance<Combinational_bodyContext>(_ctx, getState());
   enterRule(_localctx, 734, SV3_1aParser::RuleCombinational_body);
@@ -50104,14 +46586,6 @@
     parserListener->exitCombinational_entry(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Combinational_entryContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCombinational_entry(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Combinational_entryContext* SV3_1aParser::combinational_entry() {
   Combinational_entryContext *_localctx = _tracker.createInstance<Combinational_entryContext>(_ctx, getState());
   enterRule(_localctx, 736, SV3_1aParser::RuleCombinational_entry);
@@ -50183,14 +46657,6 @@
     parserListener->exitSequential_body(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequential_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequential_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequential_bodyContext* SV3_1aParser::sequential_body() {
   Sequential_bodyContext *_localctx = _tracker.createInstance<Sequential_bodyContext>(_ctx, getState());
   enterRule(_localctx, 738, SV3_1aParser::RuleSequential_body);
@@ -50283,14 +46749,6 @@
     parserListener->exitUdp_initial_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_initial_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_initial_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_initial_statementContext* SV3_1aParser::udp_initial_statement() {
   Udp_initial_statementContext *_localctx = _tracker.createInstance<Udp_initial_statementContext>(_ctx, getState());
   enterRule(_localctx, 740, SV3_1aParser::RuleUdp_initial_statement);
@@ -50354,13 +46812,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1Tickb1(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1Tickb1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1Tickb1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_1TickB1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_1TickB1Context::ONE_TICK_B1() {
@@ -50379,13 +46830,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1TickB1(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1TickB1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1TickB1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_1Tickb0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_1Tickb0Context::ONE_TICK_b0() {
@@ -50404,13 +46848,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1Tickb0(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1Tickb0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1Tickb0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_1TickB0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_1TickB0Context::ONE_TICK_B0() {
@@ -50429,13 +46866,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1TickB0(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1TickB0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1TickB0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_1TickbxContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_1TickbxContext::ONE_TICK_bx() {
@@ -50454,13 +46884,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1Tickbx(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1TickbxContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1Tickbx(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_1TickbXContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_1TickbXContext::ONE_TICK_bX() {
@@ -50479,13 +46902,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1TickbX(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1TickbXContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1TickbX(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_1TickBxContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_1TickBxContext::ONE_TICK_Bx() {
@@ -50504,13 +46920,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1TickBx(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1TickBxContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1TickBx(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_1TickBXContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_1TickBXContext::ONE_TICK_BX() {
@@ -50529,13 +46938,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_1TickBX(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_1TickBXContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_1TickBX(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- InitVal_IntegralContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::InitVal_IntegralContext::Integral_number() {
@@ -50554,13 +46956,6 @@
   if (parserListener != nullptr)
     parserListener->exitInitVal_Integral(this);
 }
-
-antlrcpp::Any SV3_1aParser::InitVal_IntegralContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitVal_Integral(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Init_valContext* SV3_1aParser::init_val() {
   Init_valContext *_localctx = _tracker.createInstance<Init_valContext>(_ctx, getState());
   enterRule(_localctx, 742, SV3_1aParser::RuleInit_val);
@@ -50705,14 +47100,6 @@
     parserListener->exitSequential_entry(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Sequential_entryContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSequential_entry(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Sequential_entryContext* SV3_1aParser::sequential_entry() {
   Sequential_entryContext *_localctx = _tracker.createInstance<Sequential_entryContext>(_ctx, getState());
   enterRule(_localctx, 744, SV3_1aParser::RuleSequential_entry);
@@ -50776,14 +47163,6 @@
     parserListener->exitSeq_input_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Seq_input_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSeq_input_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Seq_input_listContext* SV3_1aParser::seq_input_list() {
   Seq_input_listContext *_localctx = _tracker.createInstance<Seq_input_listContext>(_ctx, getState());
   enterRule(_localctx, 746, SV3_1aParser::RuleSeq_input_list);
@@ -50852,14 +47231,6 @@
     parserListener->exitLevel_input_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Level_input_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLevel_input_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Level_input_listContext* SV3_1aParser::level_input_list() {
   Level_input_listContext *_localctx = _tracker.createInstance<Level_input_listContext>(_ctx, getState());
   enterRule(_localctx, 748, SV3_1aParser::RuleLevel_input_list);
@@ -50930,14 +47301,6 @@
     parserListener->exitEdge_input_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Edge_input_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_input_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Edge_input_listContext* SV3_1aParser::edge_input_list() {
   Edge_input_listContext *_localctx = _tracker.createInstance<Edge_input_listContext>(_ctx, getState());
   enterRule(_localctx, 750, SV3_1aParser::RuleEdge_input_list);
@@ -51029,14 +47392,6 @@
     parserListener->exitEdge_indicator(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Edge_indicatorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_indicator(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Edge_indicatorContext* SV3_1aParser::edge_indicator() {
   Edge_indicatorContext *_localctx = _tracker.createInstance<Edge_indicatorContext>(_ctx, getState());
   enterRule(_localctx, 752, SV3_1aParser::RuleEdge_indicator);
@@ -51123,14 +47478,6 @@
     parserListener->exitNext_state(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Next_stateContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNext_state(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Next_stateContext* SV3_1aParser::next_state() {
   Next_stateContext *_localctx = _tracker.createInstance<Next_stateContext>(_ctx, getState());
   enterRule(_localctx, 754, SV3_1aParser::RuleNext_state);
@@ -51202,14 +47549,6 @@
     parserListener->exitOutput_symbol(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Output_symbolContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOutput_symbol(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Output_symbolContext* SV3_1aParser::output_symbol() {
   Output_symbolContext *_localctx = _tracker.createInstance<Output_symbolContext>(_ctx, getState());
   enterRule(_localctx, 756, SV3_1aParser::RuleOutput_symbol);
@@ -51275,14 +47614,6 @@
     parserListener->exitLevel_symbol(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Level_symbolContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLevel_symbol(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Level_symbolContext* SV3_1aParser::level_symbol() {
   Level_symbolContext *_localctx = _tracker.createInstance<Level_symbolContext>(_ctx, getState());
   enterRule(_localctx, 758, SV3_1aParser::RuleLevel_symbol);
@@ -51346,14 +47677,6 @@
     parserListener->exitEdge_symbol(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Edge_symbolContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_symbol(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Edge_symbolContext* SV3_1aParser::edge_symbol() {
   Edge_symbolContext *_localctx = _tracker.createInstance<Edge_symbolContext>(_ctx, getState());
   enterRule(_localctx, 760, SV3_1aParser::RuleEdge_symbol);
@@ -51439,14 +47762,6 @@
     parserListener->exitUdp_instantiation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_instantiationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_instantiation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_instantiationContext* SV3_1aParser::udp_instantiation() {
   Udp_instantiationContext *_localctx = _tracker.createInstance<Udp_instantiationContext>(_ctx, getState());
   enterRule(_localctx, 762, SV3_1aParser::RuleUdp_instantiation);
@@ -51560,14 +47875,6 @@
     parserListener->exitUdp_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Udp_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUdp_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Udp_instanceContext* SV3_1aParser::udp_instance() {
   Udp_instanceContext *_localctx = _tracker.createInstance<Udp_instanceContext>(_ctx, getState());
   enterRule(_localctx, 764, SV3_1aParser::RuleUdp_instance);
@@ -51692,14 +47999,6 @@
     parserListener->exitContinuous_assign(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Continuous_assignContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitContinuous_assign(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Continuous_assignContext* SV3_1aParser::continuous_assign() {
   Continuous_assignContext *_localctx = _tracker.createInstance<Continuous_assignContext>(_ctx, getState());
   enterRule(_localctx, 766, SV3_1aParser::RuleContinuous_assign);
@@ -51811,14 +48110,6 @@
     parserListener->exitList_of_net_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_net_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_net_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_net_assignmentsContext* SV3_1aParser::list_of_net_assignments() {
   List_of_net_assignmentsContext *_localctx = _tracker.createInstance<List_of_net_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 768, SV3_1aParser::RuleList_of_net_assignments);
@@ -51893,14 +48184,6 @@
     parserListener->exitList_of_variable_assignments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_variable_assignmentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_variable_assignments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_variable_assignmentsContext* SV3_1aParser::list_of_variable_assignments() {
   List_of_variable_assignmentsContext *_localctx = _tracker.createInstance<List_of_variable_assignmentsContext>(_ctx, getState());
   enterRule(_localctx, 770, SV3_1aParser::RuleList_of_variable_assignments);
@@ -51983,14 +48266,6 @@
     parserListener->exitNet_alias(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_aliasContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_alias(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_aliasContext* SV3_1aParser::net_alias() {
   Net_aliasContext *_localctx = _tracker.createInstance<Net_aliasContext>(_ctx, getState());
   enterRule(_localctx, 772, SV3_1aParser::RuleNet_alias);
@@ -52065,14 +48340,6 @@
     parserListener->exitNet_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_assignmentContext* SV3_1aParser::net_assignment() {
   Net_assignmentContext *_localctx = _tracker.createInstance<Net_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 774, SV3_1aParser::RuleNet_assignment);
@@ -52130,14 +48397,6 @@
     parserListener->exitInitial_construct(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Initial_constructContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInitial_construct(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Initial_constructContext* SV3_1aParser::initial_construct() {
   Initial_constructContext *_localctx = _tracker.createInstance<Initial_constructContext>(_ctx, getState());
   enterRule(_localctx, 776, SV3_1aParser::RuleInitial_construct);
@@ -52193,14 +48452,6 @@
     parserListener->exitAlways_construct(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Always_constructContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAlways_construct(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Always_constructContext* SV3_1aParser::always_construct() {
   Always_constructContext *_localctx = _tracker.createInstance<Always_constructContext>(_ctx, getState());
   enterRule(_localctx, 778, SV3_1aParser::RuleAlways_construct);
@@ -52258,13 +48509,6 @@
   if (parserListener != nullptr)
     parserListener->exitAlwaysKeywd_Comb(this);
 }
-
-antlrcpp::Any SV3_1aParser::AlwaysKeywd_CombContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAlwaysKeywd_Comb(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AlwaysKeywd_LatchContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AlwaysKeywd_LatchContext::ALWAYS_LATCH() {
@@ -52283,13 +48527,6 @@
   if (parserListener != nullptr)
     parserListener->exitAlwaysKeywd_Latch(this);
 }
-
-antlrcpp::Any SV3_1aParser::AlwaysKeywd_LatchContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAlwaysKeywd_Latch(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AlwaysKeywd_FFContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AlwaysKeywd_FFContext::ALWAYS_FF() {
@@ -52308,13 +48545,6 @@
   if (parserListener != nullptr)
     parserListener->exitAlwaysKeywd_FF(this);
 }
-
-antlrcpp::Any SV3_1aParser::AlwaysKeywd_FFContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAlwaysKeywd_FF(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AlwaysKeywd_AlwaysContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AlwaysKeywd_AlwaysContext::ALWAYS() {
@@ -52333,13 +48563,6 @@
   if (parserListener != nullptr)
     parserListener->exitAlwaysKeywd_Always(this);
 }
-
-antlrcpp::Any SV3_1aParser::AlwaysKeywd_AlwaysContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAlwaysKeywd_Always(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Always_keywordContext* SV3_1aParser::always_keyword() {
   Always_keywordContext *_localctx = _tracker.createInstance<Always_keywordContext>(_ctx, getState());
   enterRule(_localctx, 780, SV3_1aParser::RuleAlways_keyword);
@@ -52476,14 +48699,6 @@
     parserListener->exitBlocking_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Blocking_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBlocking_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Blocking_assignmentContext* SV3_1aParser::blocking_assignment() {
   Blocking_assignmentContext *_localctx = _tracker.createInstance<Blocking_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 782, SV3_1aParser::RuleBlocking_assignment);
@@ -52611,14 +48826,6 @@
     parserListener->exitOperator_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Operator_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOperator_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Operator_assignmentContext* SV3_1aParser::operator_assignment() {
   Operator_assignmentContext *_localctx = _tracker.createInstance<Operator_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 784, SV3_1aParser::RuleOperator_assignment);
@@ -52678,13 +48885,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_Add(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_AddContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_Add(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_ModuloContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_ModuloContext::MODULO_ASSIGN() {
@@ -52703,13 +48903,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_Modulo(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_ModuloContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_Modulo(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_BitwXorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_BitwXorContext::BITW_XOR_ASSIGN() {
@@ -52728,13 +48921,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_BitwXor(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_BitwXorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_BitwXor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_BitwLeftShiftContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_BitwLeftShiftContext::BITW_LEFT_SHIFT_ASSIGN() {
@@ -52753,13 +48939,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_BitwLeftShift(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_BitwLeftShiftContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_BitwLeftShift(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_SubContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_SubContext::SUB_ASSIGN() {
@@ -52778,13 +48957,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_Sub(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_SubContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_Sub(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_BitwOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_BitwOrContext::BITW_OR_ASSIGN() {
@@ -52803,13 +48975,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_BitwOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_BitwOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_BitwOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_DivContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_DivContext::DIV_ASSIGN() {
@@ -52828,13 +48993,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_Div(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_DivContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_Div(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_BitwRightShiftContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_BitwRightShiftContext::BITW_RIGHT_SHIFT_ASSIGN() {
@@ -52853,13 +49011,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_BitwRightShift(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_BitwRightShiftContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_BitwRightShift(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_AssignContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_AssignContext::ASSIGN_OP() {
@@ -52878,13 +49029,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_Assign(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_AssignContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_Assign(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_ArithShiftRightContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_ArithShiftRightContext::ARITH_SHIFT_RIGHT_ASSIGN() {
@@ -52903,13 +49047,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_ArithShiftRight(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_ArithShiftRightContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_ArithShiftRight(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_MultContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_MultContext::MULT_ASSIGN() {
@@ -52928,13 +49065,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_Mult(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_MultContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_Mult(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_BitwAndContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_BitwAndContext::BITW_AND_ASSIGN() {
@@ -52953,13 +49083,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_BitwAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_BitwAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_BitwAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- AssignOp_ArithShiftLeftContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::AssignOp_ArithShiftLeftContext::ARITH_SHIFT_LEFT_ASSIGN() {
@@ -52978,13 +49101,6 @@
   if (parserListener != nullptr)
     parserListener->exitAssignOp_ArithShiftLeft(this);
 }
-
-antlrcpp::Any SV3_1aParser::AssignOp_ArithShiftLeftContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignOp_ArithShiftLeft(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Assignment_operatorContext* SV3_1aParser::assignment_operator() {
   Assignment_operatorContext *_localctx = _tracker.createInstance<Assignment_operatorContext>(_ctx, getState());
   enterRule(_localctx, 786, SV3_1aParser::RuleAssignment_operator);
@@ -53153,14 +49269,6 @@
     parserListener->exitNonblocking_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Nonblocking_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNonblocking_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Nonblocking_assignmentContext* SV3_1aParser::nonblocking_assignment() {
   Nonblocking_assignmentContext *_localctx = _tracker.createInstance<Nonblocking_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 788, SV3_1aParser::RuleNonblocking_assignment);
@@ -53256,14 +49364,6 @@
     parserListener->exitProcedural_continuous_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Procedural_continuous_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProcedural_continuous_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Procedural_continuous_assignmentContext* SV3_1aParser::procedural_continuous_assignment() {
   Procedural_continuous_assignmentContext *_localctx = _tracker.createInstance<Procedural_continuous_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 790, SV3_1aParser::RuleProcedural_continuous_assignment);
@@ -53376,14 +49476,6 @@
     parserListener->exitVariable_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Variable_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVariable_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Variable_assignmentContext* SV3_1aParser::variable_assignment() {
   Variable_assignmentContext *_localctx = _tracker.createInstance<Variable_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 792, SV3_1aParser::RuleVariable_assignment);
@@ -53445,14 +49537,6 @@
     parserListener->exitAction_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Action_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAction_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Action_blockContext* SV3_1aParser::action_block() {
   Action_blockContext *_localctx = _tracker.createInstance<Action_blockContext>(_ctx, getState());
   enterRule(_localctx, 794, SV3_1aParser::RuleAction_block);
@@ -53638,14 +49722,6 @@
     parserListener->exitSeq_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Seq_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSeq_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Seq_blockContext* SV3_1aParser::seq_block() {
   Seq_blockContext *_localctx = _tracker.createInstance<Seq_blockContext>(_ctx, getState());
   enterRule(_localctx, 796, SV3_1aParser::RuleSeq_block);
@@ -53860,14 +49936,6 @@
     parserListener->exitPar_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Par_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPar_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Par_blockContext* SV3_1aParser::par_block() {
   Par_blockContext *_localctx = _tracker.createInstance<Par_blockContext>(_ctx, getState());
   enterRule(_localctx, 798, SV3_1aParser::RulePar_block);
@@ -54060,14 +50128,6 @@
     parserListener->exitJoin_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Join_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitJoin_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Join_keywordContext* SV3_1aParser::join_keyword() {
   Join_keywordContext *_localctx = _tracker.createInstance<Join_keywordContext>(_ctx, getState());
   enterRule(_localctx, 800, SV3_1aParser::RuleJoin_keyword);
@@ -54117,14 +50177,6 @@
     parserListener->exitJoin_any_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Join_any_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitJoin_any_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Join_any_keywordContext* SV3_1aParser::join_any_keyword() {
   Join_any_keywordContext *_localctx = _tracker.createInstance<Join_any_keywordContext>(_ctx, getState());
   enterRule(_localctx, 802, SV3_1aParser::RuleJoin_any_keyword);
@@ -54174,14 +50226,6 @@
     parserListener->exitJoin_none_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Join_none_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitJoin_none_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Join_none_keywordContext* SV3_1aParser::join_none_keyword() {
   Join_none_keywordContext *_localctx = _tracker.createInstance<Join_none_keywordContext>(_ctx, getState());
   enterRule(_localctx, 804, SV3_1aParser::RuleJoin_none_keyword);
@@ -54243,14 +50287,6 @@
     parserListener->exitStatement_or_null(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Statement_or_nullContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStatement_or_null(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Statement_or_nullContext* SV3_1aParser::statement_or_null() {
   Statement_or_nullContext *_localctx = _tracker.createInstance<Statement_or_nullContext>(_ctx, getState());
   enterRule(_localctx, 806, SV3_1aParser::RuleStatement_or_null);
@@ -54342,14 +50378,6 @@
     parserListener->exitStatement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::StatementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStatement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::StatementContext* SV3_1aParser::statement() {
   StatementContext *_localctx = _tracker.createInstance<StatementContext>(_ctx, getState());
   enterRule(_localctx, 808, SV3_1aParser::RuleStatement);
@@ -54511,14 +50539,6 @@
     parserListener->exitStatement_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Statement_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStatement_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Statement_itemContext* SV3_1aParser::statement_item() {
   Statement_itemContext *_localctx = _tracker.createInstance<Statement_itemContext>(_ctx, getState());
   enterRule(_localctx, 810, SV3_1aParser::RuleStatement_item);
@@ -54745,14 +50765,6 @@
     parserListener->exitFunction_statement_or_null(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Function_statement_or_nullContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFunction_statement_or_null(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Function_statement_or_nullContext* SV3_1aParser::function_statement_or_null() {
   Function_statement_or_nullContext *_localctx = _tracker.createInstance<Function_statement_or_nullContext>(_ctx, getState());
   enterRule(_localctx, 812, SV3_1aParser::RuleFunction_statement_or_null);
@@ -54832,14 +50844,6 @@
     parserListener->exitProcedural_timing_control_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Procedural_timing_control_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProcedural_timing_control_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Procedural_timing_control_statementContext* SV3_1aParser::procedural_timing_control_statement() {
   Procedural_timing_control_statementContext *_localctx = _tracker.createInstance<Procedural_timing_control_statementContext>(_ctx, getState());
   enterRule(_localctx, 814, SV3_1aParser::RuleProcedural_timing_control_statement);
@@ -54911,14 +50915,6 @@
     parserListener->exitDelay_or_event_control(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay_or_event_controlContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_or_event_control(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay_or_event_controlContext* SV3_1aParser::delay_or_event_control() {
   Delay_or_event_controlContext *_localctx = _tracker.createInstance<Delay_or_event_controlContext>(_ctx, getState());
   enterRule(_localctx, 816, SV3_1aParser::RuleDelay_or_event_control);
@@ -55019,14 +51015,6 @@
     parserListener->exitDelay_control(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay_controlContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_control(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay_controlContext* SV3_1aParser::delay_control() {
   Delay_controlContext *_localctx = _tracker.createInstance<Delay_controlContext>(_ctx, getState());
   enterRule(_localctx, 818, SV3_1aParser::RuleDelay_control);
@@ -55125,14 +51113,6 @@
     parserListener->exitEvent_control(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Event_controlContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEvent_control(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Event_controlContext* SV3_1aParser::event_control() {
   Event_controlContext *_localctx = _tracker.createInstance<Event_controlContext>(_ctx, getState());
   enterRule(_localctx, 820, SV3_1aParser::RuleEvent_control);
@@ -55269,14 +51249,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::Event_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEvent_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::Event_expressionContext* SV3_1aParser::event_expression() {
    return event_expression(0);
 }
@@ -55449,14 +51421,6 @@
     parserListener->exitProcedural_timing_control(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Procedural_timing_controlContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProcedural_timing_control(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Procedural_timing_controlContext* SV3_1aParser::procedural_timing_control() {
   Procedural_timing_controlContext *_localctx = _tracker.createInstance<Procedural_timing_controlContext>(_ctx, getState());
   enterRule(_localctx, 824, SV3_1aParser::RuleProcedural_timing_control);
@@ -55549,14 +51513,6 @@
     parserListener->exitJump_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Jump_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitJump_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Jump_statementContext* SV3_1aParser::jump_statement() {
   Jump_statementContext *_localctx = _tracker.createInstance<Jump_statementContext>(_ctx, getState());
   enterRule(_localctx, 826, SV3_1aParser::RuleJump_statement);
@@ -55719,14 +51675,6 @@
     parserListener->exitFinal_construct(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Final_constructContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFinal_construct(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Final_constructContext* SV3_1aParser::final_construct() {
   Final_constructContext *_localctx = _tracker.createInstance<Final_constructContext>(_ctx, getState());
   enterRule(_localctx, 828, SV3_1aParser::RuleFinal_construct);
@@ -55862,14 +51810,6 @@
     parserListener->exitWait_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Wait_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitWait_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Wait_statementContext* SV3_1aParser::wait_statement() {
   Wait_statementContext *_localctx = _tracker.createInstance<Wait_statementContext>(_ctx, getState());
   enterRule(_localctx, 830, SV3_1aParser::RuleWait_statement);
@@ -56056,14 +51996,6 @@
     parserListener->exitEvent_trigger(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Event_triggerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEvent_trigger(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Event_triggerContext* SV3_1aParser::event_trigger() {
   Event_triggerContext *_localctx = _tracker.createInstance<Event_triggerContext>(_ctx, getState());
   enterRule(_localctx, 832, SV3_1aParser::RuleEvent_trigger);
@@ -56164,14 +52096,6 @@
     parserListener->exitDisable_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Disable_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDisable_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Disable_statementContext* SV3_1aParser::disable_statement() {
   Disable_statementContext *_localctx = _tracker.createInstance<Disable_statementContext>(_ctx, getState());
   enterRule(_localctx, 834, SV3_1aParser::RuleDisable_statement);
@@ -56292,14 +52216,6 @@
     parserListener->exitConditional_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Conditional_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConditional_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Conditional_statementContext* SV3_1aParser::conditional_statement() {
   Conditional_statementContext *_localctx = _tracker.createInstance<Conditional_statementContext>(_ctx, getState());
   enterRule(_localctx, 836, SV3_1aParser::RuleConditional_statement);
@@ -56414,14 +52330,6 @@
     parserListener->exitUnique_priority(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Unique_priorityContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnique_priority(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Unique_priorityContext* SV3_1aParser::unique_priority() {
   Unique_priorityContext *_localctx = _tracker.createInstance<Unique_priorityContext>(_ctx, getState());
   enterRule(_localctx, 838, SV3_1aParser::RuleUnique_priority);
@@ -56494,14 +52402,6 @@
     parserListener->exitCond_predicate(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cond_predicateContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCond_predicate(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cond_predicateContext* SV3_1aParser::cond_predicate() {
   Cond_predicateContext *_localctx = _tracker.createInstance<Cond_predicateContext>(_ctx, getState());
   enterRule(_localctx, 840, SV3_1aParser::RuleCond_predicate);
@@ -56572,14 +52472,6 @@
     parserListener->exitExpression_or_cond_pattern(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Expression_or_cond_patternContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExpression_or_cond_pattern(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Expression_or_cond_patternContext* SV3_1aParser::expression_or_cond_pattern() {
   Expression_or_cond_patternContext *_localctx = _tracker.createInstance<Expression_or_cond_patternContext>(_ctx, getState());
   enterRule(_localctx, 842, SV3_1aParser::RuleExpression_or_cond_pattern);
@@ -56700,14 +52592,6 @@
     parserListener->exitCase_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Case_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCase_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Case_statementContext* SV3_1aParser::case_statement() {
   Case_statementContext *_localctx = _tracker.createInstance<Case_statementContext>(_ctx, getState());
   enterRule(_localctx, 844, SV3_1aParser::RuleCase_statement);
@@ -57096,13 +52980,6 @@
   if (parserListener != nullptr)
     parserListener->exitCaseKeyword_Case(this);
 }
-
-antlrcpp::Any SV3_1aParser::CaseKeyword_CaseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCaseKeyword_Case(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- CaseKeyword_CaseZContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::CaseKeyword_CaseZContext::CASEZ() {
@@ -57121,13 +52998,6 @@
   if (parserListener != nullptr)
     parserListener->exitCaseKeyword_CaseZ(this);
 }
-
-antlrcpp::Any SV3_1aParser::CaseKeyword_CaseZContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCaseKeyword_CaseZ(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- CaseKeyword_CaseXContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::CaseKeyword_CaseXContext::CASEX() {
@@ -57146,13 +53016,6 @@
   if (parserListener != nullptr)
     parserListener->exitCaseKeyword_CaseX(this);
 }
-
-antlrcpp::Any SV3_1aParser::CaseKeyword_CaseXContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCaseKeyword_CaseX(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Case_keywordContext* SV3_1aParser::case_keyword() {
   Case_keywordContext *_localctx = _tracker.createInstance<Case_keywordContext>(_ctx, getState());
   enterRule(_localctx, 846, SV3_1aParser::RuleCase_keyword);
@@ -57253,14 +53116,6 @@
     parserListener->exitCase_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Case_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCase_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Case_itemContext* SV3_1aParser::case_item() {
   Case_itemContext *_localctx = _tracker.createInstance<Case_itemContext>(_ctx, getState());
   enterRule(_localctx, 848, SV3_1aParser::RuleCase_item);
@@ -57443,14 +53298,6 @@
     parserListener->exitCase_pattern_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Case_pattern_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCase_pattern_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Case_pattern_itemContext* SV3_1aParser::case_pattern_item() {
   Case_pattern_itemContext *_localctx = _tracker.createInstance<Case_pattern_itemContext>(_ctx, getState());
   enterRule(_localctx, 850, SV3_1aParser::RuleCase_pattern_item);
@@ -57622,14 +53469,6 @@
     parserListener->exitCase_inside_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Case_inside_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCase_inside_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Case_inside_itemContext* SV3_1aParser::case_inside_item() {
   Case_inside_itemContext *_localctx = _tracker.createInstance<Case_inside_itemContext>(_ctx, getState());
   enterRule(_localctx, 852, SV3_1aParser::RuleCase_inside_item);
@@ -57793,14 +53632,6 @@
     parserListener->exitRandcase_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Randcase_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRandcase_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Randcase_statementContext* SV3_1aParser::randcase_statement() {
   Randcase_statementContext *_localctx = _tracker.createInstance<Randcase_statementContext>(_ctx, getState());
   enterRule(_localctx, 854, SV3_1aParser::RuleRandcase_statement);
@@ -57943,14 +53774,6 @@
     parserListener->exitRandcase_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Randcase_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRandcase_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Randcase_itemContext* SV3_1aParser::randcase_item() {
   Randcase_itemContext *_localctx = _tracker.createInstance<Randcase_itemContext>(_ctx, getState());
   enterRule(_localctx, 856, SV3_1aParser::RuleRandcase_item);
@@ -58060,14 +53883,6 @@
     parserListener->exitPattern(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::PatternContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPattern(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::PatternContext* SV3_1aParser::pattern() {
   PatternContext *_localctx = _tracker.createInstance<PatternContext>(_ctx, getState());
   enterRule(_localctx, 858, SV3_1aParser::RulePattern);
@@ -58346,14 +54161,6 @@
     parserListener->exitAssignment_pattern(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assignment_patternContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignment_pattern(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assignment_patternContext* SV3_1aParser::assignment_pattern() {
   Assignment_patternContext *_localctx = _tracker.createInstance<Assignment_patternContext>(_ctx, getState());
   enterRule(_localctx, 860, SV3_1aParser::RuleAssignment_pattern);
@@ -58568,14 +54375,6 @@
     parserListener->exitStructure_pattern_key(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Structure_pattern_keyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStructure_pattern_key(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Structure_pattern_keyContext* SV3_1aParser::structure_pattern_key() {
   Structure_pattern_keyContext *_localctx = _tracker.createInstance<Structure_pattern_keyContext>(_ctx, getState());
   enterRule(_localctx, 862, SV3_1aParser::RuleStructure_pattern_key);
@@ -58644,14 +54443,6 @@
     parserListener->exitArray_pattern_key(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Array_pattern_keyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitArray_pattern_key(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Array_pattern_keyContext* SV3_1aParser::array_pattern_key() {
   Array_pattern_keyContext *_localctx = _tracker.createInstance<Array_pattern_keyContext>(_ctx, getState());
   enterRule(_localctx, 864, SV3_1aParser::RuleArray_pattern_key);
@@ -58720,14 +54511,6 @@
     parserListener->exitAssignment_pattern_key(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assignment_pattern_keyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignment_pattern_key(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assignment_pattern_keyContext* SV3_1aParser::assignment_pattern_key() {
   Assignment_pattern_keyContext *_localctx = _tracker.createInstance<Assignment_pattern_keyContext>(_ctx, getState());
   enterRule(_localctx, 866, SV3_1aParser::RuleAssignment_pattern_key);
@@ -58826,14 +54609,6 @@
     parserListener->exitAssignment_pattern_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assignment_pattern_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignment_pattern_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assignment_pattern_expressionContext* SV3_1aParser::assignment_pattern_expression() {
   Assignment_pattern_expressionContext *_localctx = _tracker.createInstance<Assignment_pattern_expressionContext>(_ctx, getState());
   enterRule(_localctx, 868, SV3_1aParser::RuleAssignment_pattern_expression);
@@ -58930,14 +54705,6 @@
     parserListener->exitAssignment_pattern_expression_type(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assignment_pattern_expression_typeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignment_pattern_expression_type(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assignment_pattern_expression_typeContext* SV3_1aParser::assignment_pattern_expression_type() {
   Assignment_pattern_expression_typeContext *_localctx = _tracker.createInstance<Assignment_pattern_expression_typeContext>(_ctx, getState());
   enterRule(_localctx, 870, SV3_1aParser::RuleAssignment_pattern_expression_type);
@@ -59016,14 +54783,6 @@
     parserListener->exitConstant_assignment_pattern_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_assignment_pattern_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_assignment_pattern_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_assignment_pattern_expressionContext* SV3_1aParser::constant_assignment_pattern_expression() {
   Constant_assignment_pattern_expressionContext *_localctx = _tracker.createInstance<Constant_assignment_pattern_expressionContext>(_ctx, getState());
   enterRule(_localctx, 872, SV3_1aParser::RuleConstant_assignment_pattern_expression);
@@ -59097,14 +54856,6 @@
     parserListener->exitAssignment_pattern_net_lvalue(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assignment_pattern_net_lvalueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignment_pattern_net_lvalue(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assignment_pattern_net_lvalueContext* SV3_1aParser::assignment_pattern_net_lvalue() {
   Assignment_pattern_net_lvalueContext *_localctx = _tracker.createInstance<Assignment_pattern_net_lvalueContext>(_ctx, getState());
   enterRule(_localctx, 874, SV3_1aParser::RuleAssignment_pattern_net_lvalue);
@@ -59197,14 +54948,6 @@
     parserListener->exitAssignment_pattern_variable_lvalue(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assignment_pattern_variable_lvalueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssignment_pattern_variable_lvalue(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assignment_pattern_variable_lvalueContext* SV3_1aParser::assignment_pattern_variable_lvalue() {
   Assignment_pattern_variable_lvalueContext *_localctx = _tracker.createInstance<Assignment_pattern_variable_lvalueContext>(_ctx, getState());
   enterRule(_localctx, 876, SV3_1aParser::RuleAssignment_pattern_variable_lvalue);
@@ -59273,14 +55016,6 @@
     parserListener->exitForever_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Forever_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitForever_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Forever_keywordContext* SV3_1aParser::forever_keyword() {
   Forever_keywordContext *_localctx = _tracker.createInstance<Forever_keywordContext>(_ctx, getState());
   enterRule(_localctx, 878, SV3_1aParser::RuleForever_keyword);
@@ -59330,14 +55065,6 @@
     parserListener->exitRepeat_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Repeat_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRepeat_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Repeat_keywordContext* SV3_1aParser::repeat_keyword() {
   Repeat_keywordContext *_localctx = _tracker.createInstance<Repeat_keywordContext>(_ctx, getState());
   enterRule(_localctx, 880, SV3_1aParser::RuleRepeat_keyword);
@@ -59387,14 +55114,6 @@
     parserListener->exitWhile_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::While_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitWhile_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::While_keywordContext* SV3_1aParser::while_keyword() {
   While_keywordContext *_localctx = _tracker.createInstance<While_keywordContext>(_ctx, getState());
   enterRule(_localctx, 882, SV3_1aParser::RuleWhile_keyword);
@@ -59520,14 +55239,6 @@
     parserListener->exitLoop_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Loop_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLoop_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Loop_statementContext* SV3_1aParser::loop_statement() {
   Loop_statementContext *_localctx = _tracker.createInstance<Loop_statementContext>(_ctx, getState());
   enterRule(_localctx, 884, SV3_1aParser::RuleLoop_statement);
@@ -59862,14 +55573,6 @@
     parserListener->exitFor_initialization(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::For_initializationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFor_initialization(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::For_initializationContext* SV3_1aParser::for_initialization() {
   For_initializationContext *_localctx = _tracker.createInstance<For_initializationContext>(_ctx, getState());
   enterRule(_localctx, 886, SV3_1aParser::RuleFor_initialization);
@@ -59983,14 +55686,6 @@
     parserListener->exitFor_variable_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::For_variable_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFor_variable_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::For_variable_declarationContext* SV3_1aParser::for_variable_declaration() {
   For_variable_declarationContext *_localctx = _tracker.createInstance<For_variable_declarationContext>(_ctx, getState());
   enterRule(_localctx, 888, SV3_1aParser::RuleFor_variable_declaration);
@@ -60088,14 +55783,6 @@
     parserListener->exitFor_step(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::For_stepContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFor_step(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::For_stepContext* SV3_1aParser::for_step() {
   For_stepContext *_localctx = _tracker.createInstance<For_stepContext>(_ctx, getState());
   enterRule(_localctx, 890, SV3_1aParser::RuleFor_step);
@@ -60166,14 +55853,6 @@
     parserListener->exitFor_step_assignment(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::For_step_assignmentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFor_step_assignment(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::For_step_assignmentContext* SV3_1aParser::for_step_assignment() {
   For_step_assignmentContext *_localctx = _tracker.createInstance<For_step_assignmentContext>(_ctx, getState());
   enterRule(_localctx, 892, SV3_1aParser::RuleFor_step_assignment);
@@ -60257,14 +55936,6 @@
     parserListener->exitLoop_variables(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Loop_variablesContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLoop_variables(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Loop_variablesContext* SV3_1aParser::loop_variables() {
   Loop_variablesContext *_localctx = _tracker.createInstance<Loop_variablesContext>(_ctx, getState());
   enterRule(_localctx, 894, SV3_1aParser::RuleLoop_variables);
@@ -60395,14 +56066,6 @@
     parserListener->exitSubroutine_call_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Subroutine_call_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSubroutine_call_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Subroutine_call_statementContext* SV3_1aParser::subroutine_call_statement() {
   Subroutine_call_statementContext *_localctx = _tracker.createInstance<Subroutine_call_statementContext>(_ctx, getState());
   enterRule(_localctx, 896, SV3_1aParser::RuleSubroutine_call_statement);
@@ -60506,14 +56169,6 @@
     parserListener->exitAssertion_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Assertion_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAssertion_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Assertion_itemContext* SV3_1aParser::assertion_item() {
   Assertion_itemContext *_localctx = _tracker.createInstance<Assertion_itemContext>(_ctx, getState());
   enterRule(_localctx, 898, SV3_1aParser::RuleAssertion_item);
@@ -60586,14 +56241,6 @@
     parserListener->exitDeferred_immediate_assertion_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Deferred_immediate_assertion_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDeferred_immediate_assertion_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Deferred_immediate_assertion_itemContext* SV3_1aParser::deferred_immediate_assertion_item() {
   Deferred_immediate_assertion_itemContext *_localctx = _tracker.createInstance<Deferred_immediate_assertion_itemContext>(_ctx, getState());
   enterRule(_localctx, 900, SV3_1aParser::RuleDeferred_immediate_assertion_item);
@@ -60680,14 +56327,6 @@
     parserListener->exitProcedural_assertion_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Procedural_assertion_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProcedural_assertion_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Procedural_assertion_statementContext* SV3_1aParser::procedural_assertion_statement() {
   Procedural_assertion_statementContext *_localctx = _tracker.createInstance<Procedural_assertion_statementContext>(_ctx, getState());
   enterRule(_localctx, 902, SV3_1aParser::RuleProcedural_assertion_statement);
@@ -60763,14 +56402,6 @@
     parserListener->exitImmediate_assertion_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Immediate_assertion_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitImmediate_assertion_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Immediate_assertion_statementContext* SV3_1aParser::immediate_assertion_statement() {
   Immediate_assertion_statementContext *_localctx = _tracker.createInstance<Immediate_assertion_statementContext>(_ctx, getState());
   enterRule(_localctx, 904, SV3_1aParser::RuleImmediate_assertion_statement);
@@ -60843,14 +56474,6 @@
     parserListener->exitSimple_immediate_assertion_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Simple_immediate_assertion_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_immediate_assertion_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Simple_immediate_assertion_statementContext* SV3_1aParser::simple_immediate_assertion_statement() {
   Simple_immediate_assertion_statementContext *_localctx = _tracker.createInstance<Simple_immediate_assertion_statementContext>(_ctx, getState());
   enterRule(_localctx, 906, SV3_1aParser::RuleSimple_immediate_assertion_statement);
@@ -60940,14 +56563,6 @@
     parserListener->exitSimple_immediate_assert_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Simple_immediate_assert_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_immediate_assert_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Simple_immediate_assert_statementContext* SV3_1aParser::simple_immediate_assert_statement() {
   Simple_immediate_assert_statementContext *_localctx = _tracker.createInstance<Simple_immediate_assert_statementContext>(_ctx, getState());
   enterRule(_localctx, 908, SV3_1aParser::RuleSimple_immediate_assert_statement);
@@ -61021,14 +56636,6 @@
     parserListener->exitSimple_immediate_assume_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Simple_immediate_assume_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_immediate_assume_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Simple_immediate_assume_statementContext* SV3_1aParser::simple_immediate_assume_statement() {
   Simple_immediate_assume_statementContext *_localctx = _tracker.createInstance<Simple_immediate_assume_statementContext>(_ctx, getState());
   enterRule(_localctx, 910, SV3_1aParser::RuleSimple_immediate_assume_statement);
@@ -61102,14 +56709,6 @@
     parserListener->exitSimple_immediate_cover_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Simple_immediate_cover_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_immediate_cover_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Simple_immediate_cover_statementContext* SV3_1aParser::simple_immediate_cover_statement() {
   Simple_immediate_cover_statementContext *_localctx = _tracker.createInstance<Simple_immediate_cover_statementContext>(_ctx, getState());
   enterRule(_localctx, 912, SV3_1aParser::RuleSimple_immediate_cover_statement);
@@ -61175,14 +56774,6 @@
     parserListener->exitDeferred_immediate_assertion_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Deferred_immediate_assertion_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDeferred_immediate_assertion_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Deferred_immediate_assertion_statementContext* SV3_1aParser::deferred_immediate_assertion_statement() {
   Deferred_immediate_assertion_statementContext *_localctx = _tracker.createInstance<Deferred_immediate_assertion_statementContext>(_ctx, getState());
   enterRule(_localctx, 914, SV3_1aParser::RuleDeferred_immediate_assertion_statement);
@@ -61280,14 +56871,6 @@
     parserListener->exitDeferred_immediate_assert_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Deferred_immediate_assert_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDeferred_immediate_assert_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Deferred_immediate_assert_statementContext* SV3_1aParser::deferred_immediate_assert_statement() {
   Deferred_immediate_assert_statementContext *_localctx = _tracker.createInstance<Deferred_immediate_assert_statementContext>(_ctx, getState());
   enterRule(_localctx, 916, SV3_1aParser::RuleDeferred_immediate_assert_statement);
@@ -61393,14 +56976,6 @@
     parserListener->exitDeferred_immediate_assume_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Deferred_immediate_assume_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDeferred_immediate_assume_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Deferred_immediate_assume_statementContext* SV3_1aParser::deferred_immediate_assume_statement() {
   Deferred_immediate_assume_statementContext *_localctx = _tracker.createInstance<Deferred_immediate_assume_statementContext>(_ctx, getState());
   enterRule(_localctx, 918, SV3_1aParser::RuleDeferred_immediate_assume_statement);
@@ -61509,14 +57084,6 @@
     parserListener->exitDeferred_immediate_cover_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Deferred_immediate_cover_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDeferred_immediate_cover_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Deferred_immediate_cover_statementContext* SV3_1aParser::deferred_immediate_cover_statement() {
   Deferred_immediate_cover_statementContext *_localctx = _tracker.createInstance<Deferred_immediate_cover_statementContext>(_ctx, getState());
   enterRule(_localctx, 920, SV3_1aParser::RuleDeferred_immediate_cover_statement);
@@ -61601,14 +57168,6 @@
     parserListener->exitEndclocking(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndclockingContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndclocking(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndclockingContext* SV3_1aParser::endclocking() {
   EndclockingContext *_localctx = _tracker.createInstance<EndclockingContext>(_ctx, getState());
   enterRule(_localctx, 922, SV3_1aParser::RuleEndclocking);
@@ -61698,14 +57257,6 @@
     parserListener->exitClocking_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Clocking_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClocking_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Clocking_declarationContext* SV3_1aParser::clocking_declaration() {
   Clocking_declarationContext *_localctx = _tracker.createInstance<Clocking_declarationContext>(_ctx, getState());
   enterRule(_localctx, 924, SV3_1aParser::RuleClocking_declaration);
@@ -61901,14 +57452,6 @@
     parserListener->exitClocking_event(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Clocking_eventContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClocking_event(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Clocking_eventContext* SV3_1aParser::clocking_event() {
   Clocking_eventContext *_localctx = _tracker.createInstance<Clocking_eventContext>(_ctx, getState());
   enterRule(_localctx, 926, SV3_1aParser::RuleClocking_event);
@@ -62009,14 +57552,6 @@
     parserListener->exitClocking_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Clocking_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClocking_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Clocking_itemContext* SV3_1aParser::clocking_item() {
   Clocking_itemContext *_localctx = _tracker.createInstance<Clocking_itemContext>(_ctx, getState());
   enterRule(_localctx, 928, SV3_1aParser::RuleClocking_item);
@@ -62131,13 +57666,6 @@
   if (parserListener != nullptr)
     parserListener->exitDefaultSkew_IntputOutput(this);
 }
-
-antlrcpp::Any SV3_1aParser::DefaultSkew_IntputOutputContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefaultSkew_IntputOutput(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- DefaultSkew_OutputContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::DefaultSkew_OutputContext::OUTPUT() {
@@ -62160,13 +57688,6 @@
   if (parserListener != nullptr)
     parserListener->exitDefaultSkew_Output(this);
 }
-
-antlrcpp::Any SV3_1aParser::DefaultSkew_OutputContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefaultSkew_Output(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- DefaultSkew_IntputContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::DefaultSkew_IntputContext::INPUT() {
@@ -62189,13 +57710,6 @@
   if (parserListener != nullptr)
     parserListener->exitDefaultSkew_Intput(this);
 }
-
-antlrcpp::Any SV3_1aParser::DefaultSkew_IntputContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefaultSkew_Intput(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Default_skewContext* SV3_1aParser::default_skew() {
   Default_skewContext *_localctx = _tracker.createInstance<Default_skewContext>(_ctx, getState());
   enterRule(_localctx, 930, SV3_1aParser::RuleDefault_skew);
@@ -62298,13 +57812,6 @@
   if (parserListener != nullptr)
     parserListener->exitClockingDir_InputOutput(this);
 }
-
-antlrcpp::Any SV3_1aParser::ClockingDir_InputOutputContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClockingDir_InputOutput(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- ClockingDir_InputContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::ClockingDir_InputContext::INPUT() {
@@ -62327,13 +57834,6 @@
   if (parserListener != nullptr)
     parserListener->exitClockingDir_Input(this);
 }
-
-antlrcpp::Any SV3_1aParser::ClockingDir_InputContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClockingDir_Input(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- ClockingDir_OutputContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::ClockingDir_OutputContext::OUTPUT() {
@@ -62356,13 +57856,6 @@
   if (parserListener != nullptr)
     parserListener->exitClockingDir_Output(this);
 }
-
-antlrcpp::Any SV3_1aParser::ClockingDir_OutputContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClockingDir_Output(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- ClockingDir_InoutContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::ClockingDir_InoutContext::INOUT() {
@@ -62381,13 +57874,6 @@
   if (parserListener != nullptr)
     parserListener->exitClockingDir_Inout(this);
 }
-
-antlrcpp::Any SV3_1aParser::ClockingDir_InoutContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClockingDir_Inout(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Clocking_directionContext* SV3_1aParser::clocking_direction() {
   Clocking_directionContext *_localctx = _tracker.createInstance<Clocking_directionContext>(_ctx, getState());
   enterRule(_localctx, 932, SV3_1aParser::RuleClocking_direction);
@@ -62529,14 +58015,6 @@
     parserListener->exitList_of_clocking_decl_assign(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_clocking_decl_assignContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_clocking_decl_assign(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_clocking_decl_assignContext* SV3_1aParser::list_of_clocking_decl_assign() {
   List_of_clocking_decl_assignContext *_localctx = _tracker.createInstance<List_of_clocking_decl_assignContext>(_ctx, getState());
   enterRule(_localctx, 934, SV3_1aParser::RuleList_of_clocking_decl_assign);
@@ -62643,14 +58121,6 @@
     parserListener->exitClocking_decl_assign(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Clocking_decl_assignContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClocking_decl_assign(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Clocking_decl_assignContext* SV3_1aParser::clocking_decl_assign() {
   Clocking_decl_assignContext *_localctx = _tracker.createInstance<Clocking_decl_assignContext>(_ctx, getState());
   enterRule(_localctx, 936, SV3_1aParser::RuleClocking_decl_assign);
@@ -62749,14 +58219,6 @@
     parserListener->exitClocking_skew(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Clocking_skewContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClocking_skew(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Clocking_skewContext* SV3_1aParser::clocking_skew() {
   Clocking_skewContext *_localctx = _tracker.createInstance<Clocking_skewContext>(_ctx, getState());
   enterRule(_localctx, 938, SV3_1aParser::RuleClocking_skew);
@@ -62841,13 +58303,6 @@
   if (parserListener != nullptr)
     parserListener->exitEdge_Edge(this);
 }
-
-antlrcpp::Any SV3_1aParser::Edge_EdgeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_Edge(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Edge_NegedgeContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Edge_NegedgeContext::NEGEDGE() {
@@ -62866,13 +58321,6 @@
   if (parserListener != nullptr)
     parserListener->exitEdge_Negedge(this);
 }
-
-antlrcpp::Any SV3_1aParser::Edge_NegedgeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_Negedge(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Edge_PosedgeContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Edge_PosedgeContext::POSEDGE() {
@@ -62891,13 +58339,6 @@
   if (parserListener != nullptr)
     parserListener->exitEdge_Posedge(this);
 }
-
-antlrcpp::Any SV3_1aParser::Edge_PosedgeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_Posedge(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Edge_identifierContext* SV3_1aParser::edge_identifier() {
   Edge_identifierContext *_localctx = _tracker.createInstance<Edge_identifierContext>(_ctx, getState());
   enterRule(_localctx, 940, SV3_1aParser::RuleEdge_identifier);
@@ -62986,14 +58427,6 @@
     parserListener->exitClocking_drive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Clocking_driveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClocking_drive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Clocking_driveContext* SV3_1aParser::clocking_drive() {
   Clocking_driveContext *_localctx = _tracker.createInstance<Clocking_driveContext>(_ctx, getState());
   enterRule(_localctx, 942, SV3_1aParser::RuleClocking_drive);
@@ -63117,14 +58550,6 @@
     parserListener->exitCycle_delay(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cycle_delayContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCycle_delay(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cycle_delayContext* SV3_1aParser::cycle_delay() {
   Cycle_delayContext *_localctx = _tracker.createInstance<Cycle_delayContext>(_ctx, getState());
   enterRule(_localctx, 944, SV3_1aParser::RuleCycle_delay);
@@ -63246,14 +58671,6 @@
     parserListener->exitClockvar(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::ClockvarContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClockvar(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::ClockvarContext* SV3_1aParser::clockvar() {
   ClockvarContext *_localctx = _tracker.createInstance<ClockvarContext>(_ctx, getState());
   enterRule(_localctx, 946, SV3_1aParser::RuleClockvar);
@@ -63345,14 +58762,6 @@
     parserListener->exitClockvar_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Clockvar_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitClockvar_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Clockvar_expressionContext* SV3_1aParser::clockvar_expression() {
   Clockvar_expressionContext *_localctx = _tracker.createInstance<Clockvar_expressionContext>(_ctx, getState());
   enterRule(_localctx, 948, SV3_1aParser::RuleClockvar_expression);
@@ -63428,14 +58837,6 @@
     parserListener->exitRandsequence_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Randsequence_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRandsequence_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Randsequence_statementContext* SV3_1aParser::randsequence_statement() {
   Randsequence_statementContext *_localctx = _tracker.createInstance<Randsequence_statementContext>(_ctx, getState());
   enterRule(_localctx, 950, SV3_1aParser::RuleRandsequence_statement);
@@ -63606,14 +59007,6 @@
     parserListener->exitProduction(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::ProductionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProduction(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::ProductionContext* SV3_1aParser::production() {
   ProductionContext *_localctx = _tracker.createInstance<ProductionContext>(_ctx, getState());
   enterRule(_localctx, 952, SV3_1aParser::RuleProduction);
@@ -63717,14 +59110,6 @@
     parserListener->exitRs_rule(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_ruleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_rule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_ruleContext* SV3_1aParser::rs_rule() {
   Rs_ruleContext *_localctx = _tracker.createInstance<Rs_ruleContext>(_ctx, getState());
   enterRule(_localctx, 954, SV3_1aParser::RuleRs_rule);
@@ -63825,14 +59210,6 @@
     parserListener->exitRs_production_list(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_production_listContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_production_list(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_production_listContext* SV3_1aParser::rs_production_list() {
   Rs_production_listContext *_localctx = _tracker.createInstance<Rs_production_listContext>(_ctx, getState());
   enterRule(_localctx, 956, SV3_1aParser::RuleRs_production_list);
@@ -64019,14 +59396,6 @@
     parserListener->exitRs_code_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_code_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_code_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_code_blockContext* SV3_1aParser::rs_code_block() {
   Rs_code_blockContext *_localctx = _tracker.createInstance<Rs_code_blockContext>(_ctx, getState());
   enterRule(_localctx, 958, SV3_1aParser::RuleRs_code_block);
@@ -64193,14 +59562,6 @@
     parserListener->exitRs_prod(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_prodContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_prod(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_prodContext* SV3_1aParser::rs_prod() {
   Rs_prodContext *_localctx = _tracker.createInstance<Rs_prodContext>(_ctx, getState());
   enterRule(_localctx, 960, SV3_1aParser::RuleRs_prod);
@@ -64317,14 +59678,6 @@
     parserListener->exitProduction_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Production_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProduction_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Production_itemContext* SV3_1aParser::production_item() {
   Production_itemContext *_localctx = _tracker.createInstance<Production_itemContext>(_ctx, getState());
   enterRule(_localctx, 962, SV3_1aParser::RuleProduction_item);
@@ -64413,14 +59766,6 @@
     parserListener->exitRs_if_else(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_if_elseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_if_else(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_if_elseContext* SV3_1aParser::rs_if_else() {
   Rs_if_elseContext *_localctx = _tracker.createInstance<Rs_if_elseContext>(_ctx, getState());
   enterRule(_localctx, 964, SV3_1aParser::RuleRs_if_else);
@@ -64505,14 +59850,6 @@
     parserListener->exitRs_repeat(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_repeatContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_repeat(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_repeatContext* SV3_1aParser::rs_repeat() {
   Rs_repeatContext *_localctx = _tracker.createInstance<Rs_repeatContext>(_ctx, getState());
   enterRule(_localctx, 966, SV3_1aParser::RuleRs_repeat);
@@ -64594,14 +59931,6 @@
     parserListener->exitRs_case(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_caseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_case(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_caseContext* SV3_1aParser::rs_case() {
   Rs_caseContext *_localctx = _tracker.createInstance<Rs_caseContext>(_ctx, getState());
   enterRule(_localctx, 968, SV3_1aParser::RuleRs_case);
@@ -64767,14 +60096,6 @@
     parserListener->exitRs_case_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Rs_case_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRs_case_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Rs_case_itemContext* SV3_1aParser::rs_case_item() {
   Rs_case_itemContext *_localctx = _tracker.createInstance<Rs_case_itemContext>(_ctx, getState());
   enterRule(_localctx, 970, SV3_1aParser::RuleRs_case_item);
@@ -64937,14 +60258,6 @@
     parserListener->exitEndspecify(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndspecifyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndspecify(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndspecifyContext* SV3_1aParser::endspecify() {
   EndspecifyContext *_localctx = _tracker.createInstance<EndspecifyContext>(_ctx, getState());
   enterRule(_localctx, 972, SV3_1aParser::RuleEndspecify);
@@ -65006,14 +60319,6 @@
     parserListener->exitSpecify_block(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Specify_blockContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSpecify_block(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Specify_blockContext* SV3_1aParser::specify_block() {
   Specify_blockContext *_localctx = _tracker.createInstance<Specify_blockContext>(_ctx, getState());
   enterRule(_localctx, 974, SV3_1aParser::RuleSpecify_block);
@@ -65100,14 +60405,6 @@
     parserListener->exitSpecify_item(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Specify_itemContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSpecify_item(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Specify_itemContext* SV3_1aParser::specify_item() {
   Specify_itemContext *_localctx = _tracker.createInstance<Specify_itemContext>(_ctx, getState());
   enterRule(_localctx, 976, SV3_1aParser::RuleSpecify_item);
@@ -65211,14 +60508,6 @@
     parserListener->exitPulsestyle_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pulsestyle_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPulsestyle_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pulsestyle_declarationContext* SV3_1aParser::pulsestyle_declaration() {
   Pulsestyle_declarationContext *_localctx = _tracker.createInstance<Pulsestyle_declarationContext>(_ctx, getState());
   enterRule(_localctx, 978, SV3_1aParser::RulePulsestyle_declaration);
@@ -65305,14 +60594,6 @@
     parserListener->exitShowcancelled_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Showcancelled_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitShowcancelled_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Showcancelled_declarationContext* SV3_1aParser::showcancelled_declaration() {
   Showcancelled_declarationContext *_localctx = _tracker.createInstance<Showcancelled_declarationContext>(_ctx, getState());
   enterRule(_localctx, 980, SV3_1aParser::RuleShowcancelled_declaration);
@@ -65399,14 +60680,6 @@
     parserListener->exitPath_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Path_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPath_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Path_declarationContext* SV3_1aParser::path_declaration() {
   Path_declarationContext *_localctx = _tracker.createInstance<Path_declarationContext>(_ctx, getState());
   enterRule(_localctx, 982, SV3_1aParser::RulePath_declaration);
@@ -65496,14 +60769,6 @@
     parserListener->exitSimple_path_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Simple_path_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_path_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Simple_path_declarationContext* SV3_1aParser::simple_path_declaration() {
   Simple_path_declarationContext *_localctx = _tracker.createInstance<Simple_path_declarationContext>(_ctx, getState());
   enterRule(_localctx, 984, SV3_1aParser::RuleSimple_path_declaration);
@@ -65600,14 +60865,6 @@
     parserListener->exitParallel_path_description(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Parallel_path_descriptionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParallel_path_description(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Parallel_path_descriptionContext* SV3_1aParser::parallel_path_description() {
   Parallel_path_descriptionContext *_localctx = _tracker.createInstance<Parallel_path_descriptionContext>(_ctx, getState());
   enterRule(_localctx, 986, SV3_1aParser::RuleParallel_path_description);
@@ -65709,14 +60966,6 @@
     parserListener->exitFull_path_description(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Full_path_descriptionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFull_path_description(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Full_path_descriptionContext* SV3_1aParser::full_path_description() {
   Full_path_descriptionContext *_localctx = _tracker.createInstance<Full_path_descriptionContext>(_ctx, getState());
   enterRule(_localctx, 988, SV3_1aParser::RuleFull_path_description);
@@ -65806,14 +61055,6 @@
     parserListener->exitList_of_path_inputs(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_path_inputsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_path_inputs(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_path_inputsContext* SV3_1aParser::list_of_path_inputs() {
   List_of_path_inputsContext *_localctx = _tracker.createInstance<List_of_path_inputsContext>(_ctx, getState());
   enterRule(_localctx, 990, SV3_1aParser::RuleList_of_path_inputs);
@@ -65888,14 +61129,6 @@
     parserListener->exitList_of_path_outputs(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_path_outputsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_path_outputs(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_path_outputsContext* SV3_1aParser::list_of_path_outputs() {
   List_of_path_outputsContext *_localctx = _tracker.createInstance<List_of_path_outputsContext>(_ctx, getState());
   enterRule(_localctx, 992, SV3_1aParser::RuleList_of_path_outputs);
@@ -65978,14 +61211,6 @@
     parserListener->exitSpecify_input_terminal_descriptor(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Specify_input_terminal_descriptorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSpecify_input_terminal_descriptor(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Specify_input_terminal_descriptorContext* SV3_1aParser::specify_input_terminal_descriptor() {
   Specify_input_terminal_descriptorContext *_localctx = _tracker.createInstance<Specify_input_terminal_descriptorContext>(_ctx, getState());
   enterRule(_localctx, 994, SV3_1aParser::RuleSpecify_input_terminal_descriptor);
@@ -66086,14 +61311,6 @@
     parserListener->exitSpecify_output_terminal_descriptor(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Specify_output_terminal_descriptorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSpecify_output_terminal_descriptor(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Specify_output_terminal_descriptorContext* SV3_1aParser::specify_output_terminal_descriptor() {
   Specify_output_terminal_descriptorContext *_localctx = _tracker.createInstance<Specify_output_terminal_descriptorContext>(_ctx, getState());
   enterRule(_localctx, 996, SV3_1aParser::RuleSpecify_output_terminal_descriptor);
@@ -66182,14 +61399,6 @@
     parserListener->exitPath_delay_value(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Path_delay_valueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPath_delay_value(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Path_delay_valueContext* SV3_1aParser::path_delay_value() {
   Path_delay_valueContext *_localctx = _tracker.createInstance<Path_delay_valueContext>(_ctx, getState());
   enterRule(_localctx, 998, SV3_1aParser::RulePath_delay_value);
@@ -66326,14 +61535,6 @@
     parserListener->exitList_of_path_delay_expressions(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_path_delay_expressionsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_path_delay_expressions(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_path_delay_expressionsContext* SV3_1aParser::list_of_path_delay_expressions() {
   List_of_path_delay_expressionsContext *_localctx = _tracker.createInstance<List_of_path_delay_expressionsContext>(_ctx, getState());
   enterRule(_localctx, 1000, SV3_1aParser::RuleList_of_path_delay_expressions);
@@ -66495,14 +61696,6 @@
     parserListener->exitT_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::T_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitT_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::T_path_delay_expressionContext* SV3_1aParser::t_path_delay_expression() {
   T_path_delay_expressionContext *_localctx = _tracker.createInstance<T_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1002, SV3_1aParser::RuleT_path_delay_expression);
@@ -66552,14 +61745,6 @@
     parserListener->exitTrise_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Trise_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTrise_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Trise_path_delay_expressionContext* SV3_1aParser::trise_path_delay_expression() {
   Trise_path_delay_expressionContext *_localctx = _tracker.createInstance<Trise_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1004, SV3_1aParser::RuleTrise_path_delay_expression);
@@ -66609,14 +61794,6 @@
     parserListener->exitTfall_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tfall_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTfall_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tfall_path_delay_expressionContext* SV3_1aParser::tfall_path_delay_expression() {
   Tfall_path_delay_expressionContext *_localctx = _tracker.createInstance<Tfall_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1006, SV3_1aParser::RuleTfall_path_delay_expression);
@@ -66666,14 +61843,6 @@
     parserListener->exitTz_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tz_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTz_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tz_path_delay_expressionContext* SV3_1aParser::tz_path_delay_expression() {
   Tz_path_delay_expressionContext *_localctx = _tracker.createInstance<Tz_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1008, SV3_1aParser::RuleTz_path_delay_expression);
@@ -66723,14 +61892,6 @@
     parserListener->exitT01_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::T01_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitT01_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::T01_path_delay_expressionContext* SV3_1aParser::t01_path_delay_expression() {
   T01_path_delay_expressionContext *_localctx = _tracker.createInstance<T01_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1010, SV3_1aParser::RuleT01_path_delay_expression);
@@ -66780,14 +61941,6 @@
     parserListener->exitT10_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::T10_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitT10_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::T10_path_delay_expressionContext* SV3_1aParser::t10_path_delay_expression() {
   T10_path_delay_expressionContext *_localctx = _tracker.createInstance<T10_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1012, SV3_1aParser::RuleT10_path_delay_expression);
@@ -66837,14 +61990,6 @@
     parserListener->exitT0z_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::T0z_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitT0z_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::T0z_path_delay_expressionContext* SV3_1aParser::t0z_path_delay_expression() {
   T0z_path_delay_expressionContext *_localctx = _tracker.createInstance<T0z_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1014, SV3_1aParser::RuleT0z_path_delay_expression);
@@ -66894,14 +62039,6 @@
     parserListener->exitTz1_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tz1_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTz1_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tz1_path_delay_expressionContext* SV3_1aParser::tz1_path_delay_expression() {
   Tz1_path_delay_expressionContext *_localctx = _tracker.createInstance<Tz1_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1016, SV3_1aParser::RuleTz1_path_delay_expression);
@@ -66951,14 +62088,6 @@
     parserListener->exitT1z_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::T1z_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitT1z_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::T1z_path_delay_expressionContext* SV3_1aParser::t1z_path_delay_expression() {
   T1z_path_delay_expressionContext *_localctx = _tracker.createInstance<T1z_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1018, SV3_1aParser::RuleT1z_path_delay_expression);
@@ -67008,14 +62137,6 @@
     parserListener->exitTz0_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tz0_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTz0_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tz0_path_delay_expressionContext* SV3_1aParser::tz0_path_delay_expression() {
   Tz0_path_delay_expressionContext *_localctx = _tracker.createInstance<Tz0_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1020, SV3_1aParser::RuleTz0_path_delay_expression);
@@ -67065,14 +62186,6 @@
     parserListener->exitT0x_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::T0x_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitT0x_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::T0x_path_delay_expressionContext* SV3_1aParser::t0x_path_delay_expression() {
   T0x_path_delay_expressionContext *_localctx = _tracker.createInstance<T0x_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1022, SV3_1aParser::RuleT0x_path_delay_expression);
@@ -67122,14 +62235,6 @@
     parserListener->exitTx1_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tx1_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTx1_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tx1_path_delay_expressionContext* SV3_1aParser::tx1_path_delay_expression() {
   Tx1_path_delay_expressionContext *_localctx = _tracker.createInstance<Tx1_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1024, SV3_1aParser::RuleTx1_path_delay_expression);
@@ -67179,14 +62284,6 @@
     parserListener->exitT1x_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::T1x_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitT1x_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::T1x_path_delay_expressionContext* SV3_1aParser::t1x_path_delay_expression() {
   T1x_path_delay_expressionContext *_localctx = _tracker.createInstance<T1x_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1026, SV3_1aParser::RuleT1x_path_delay_expression);
@@ -67236,14 +62333,6 @@
     parserListener->exitTx0_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tx0_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTx0_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tx0_path_delay_expressionContext* SV3_1aParser::tx0_path_delay_expression() {
   Tx0_path_delay_expressionContext *_localctx = _tracker.createInstance<Tx0_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1028, SV3_1aParser::RuleTx0_path_delay_expression);
@@ -67293,14 +62382,6 @@
     parserListener->exitTxz_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Txz_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTxz_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Txz_path_delay_expressionContext* SV3_1aParser::txz_path_delay_expression() {
   Txz_path_delay_expressionContext *_localctx = _tracker.createInstance<Txz_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1030, SV3_1aParser::RuleTxz_path_delay_expression);
@@ -67350,14 +62431,6 @@
     parserListener->exitTzx_path_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tzx_path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTzx_path_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tzx_path_delay_expressionContext* SV3_1aParser::tzx_path_delay_expression() {
   Tzx_path_delay_expressionContext *_localctx = _tracker.createInstance<Tzx_path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1032, SV3_1aParser::RuleTzx_path_delay_expression);
@@ -67407,14 +62480,6 @@
     parserListener->exitPath_delay_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Path_delay_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPath_delay_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Path_delay_expressionContext* SV3_1aParser::path_delay_expression() {
   Path_delay_expressionContext *_localctx = _tracker.createInstance<Path_delay_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1034, SV3_1aParser::RulePath_delay_expression);
@@ -67476,14 +62541,6 @@
     parserListener->exitEdge_sensitive_path_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Edge_sensitive_path_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_sensitive_path_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Edge_sensitive_path_declarationContext* SV3_1aParser::edge_sensitive_path_declaration() {
   Edge_sensitive_path_declarationContext *_localctx = _tracker.createInstance<Edge_sensitive_path_declarationContext>(_ctx, getState());
   enterRule(_localctx, 1036, SV3_1aParser::RuleEdge_sensitive_path_declaration);
@@ -67600,14 +62657,6 @@
     parserListener->exitParallel_edge_sensitive_path_description(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Parallel_edge_sensitive_path_descriptionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParallel_edge_sensitive_path_description(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Parallel_edge_sensitive_path_descriptionContext* SV3_1aParser::parallel_edge_sensitive_path_description() {
   Parallel_edge_sensitive_path_descriptionContext *_localctx = _tracker.createInstance<Parallel_edge_sensitive_path_descriptionContext>(_ctx, getState());
   enterRule(_localctx, 1038, SV3_1aParser::RuleParallel_edge_sensitive_path_description);
@@ -67738,14 +62787,6 @@
     parserListener->exitFull_edge_sensitive_path_description(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Full_edge_sensitive_path_descriptionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitFull_edge_sensitive_path_description(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Full_edge_sensitive_path_descriptionContext* SV3_1aParser::full_edge_sensitive_path_description() {
   Full_edge_sensitive_path_descriptionContext *_localctx = _tracker.createInstance<Full_edge_sensitive_path_descriptionContext>(_ctx, getState());
   enterRule(_localctx, 1040, SV3_1aParser::RuleFull_edge_sensitive_path_description);
@@ -67856,14 +62897,6 @@
     parserListener->exitState_dependent_path_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::State_dependent_path_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitState_dependent_path_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::State_dependent_path_declarationContext* SV3_1aParser::state_dependent_path_declaration() {
   State_dependent_path_declarationContext *_localctx = _tracker.createInstance<State_dependent_path_declarationContext>(_ctx, getState());
   enterRule(_localctx, 1042, SV3_1aParser::RuleState_dependent_path_declaration);
@@ -67997,14 +63030,6 @@
     parserListener->exitSystem_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::System_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSystem_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::System_timing_checkContext* SV3_1aParser::system_timing_check() {
   System_timing_checkContext *_localctx = _tracker.createInstance<System_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1044, SV3_1aParser::RuleSystem_timing_check);
@@ -68179,14 +63204,6 @@
     parserListener->exitDollar_setup_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_setup_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_setup_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_setup_timing_checkContext* SV3_1aParser::dollar_setup_timing_check() {
   Dollar_setup_timing_checkContext *_localctx = _tracker.createInstance<Dollar_setup_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1046, SV3_1aParser::RuleDollar_setup_timing_check);
@@ -68329,14 +63346,6 @@
     parserListener->exitDollar_hold_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_hold_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_hold_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_hold_timing_checkContext* SV3_1aParser::dollar_hold_timing_check() {
   Dollar_hold_timing_checkContext *_localctx = _tracker.createInstance<Dollar_hold_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1048, SV3_1aParser::RuleDollar_hold_timing_check);
@@ -68499,14 +63508,6 @@
     parserListener->exitDollar_setuphold_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_setuphold_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_setuphold_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_setuphold_timing_checkContext* SV3_1aParser::dollar_setuphold_timing_check() {
   Dollar_setuphold_timing_checkContext *_localctx = _tracker.createInstance<Dollar_setuphold_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1050, SV3_1aParser::RuleDollar_setuphold_timing_check);
@@ -68893,14 +63894,6 @@
     parserListener->exitDollar_recovery_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_recovery_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_recovery_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_recovery_timing_checkContext* SV3_1aParser::dollar_recovery_timing_check() {
   Dollar_recovery_timing_checkContext *_localctx = _tracker.createInstance<Dollar_recovery_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1052, SV3_1aParser::RuleDollar_recovery_timing_check);
@@ -69043,14 +64036,6 @@
     parserListener->exitDollar_removal_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_removal_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_removal_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_removal_timing_checkContext* SV3_1aParser::dollar_removal_timing_check() {
   Dollar_removal_timing_checkContext *_localctx = _tracker.createInstance<Dollar_removal_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1054, SV3_1aParser::RuleDollar_removal_timing_check);
@@ -69213,14 +64198,6 @@
     parserListener->exitDollar_recrem_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_recrem_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_recrem_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_recrem_timing_checkContext* SV3_1aParser::dollar_recrem_timing_check() {
   Dollar_recrem_timing_checkContext *_localctx = _tracker.createInstance<Dollar_recrem_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1056, SV3_1aParser::RuleDollar_recrem_timing_check);
@@ -69607,14 +64584,6 @@
     parserListener->exitDollar_skew_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_skew_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_skew_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_skew_timing_checkContext* SV3_1aParser::dollar_skew_timing_check() {
   Dollar_skew_timing_checkContext *_localctx = _tracker.createInstance<Dollar_skew_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1058, SV3_1aParser::RuleDollar_skew_timing_check);
@@ -69765,14 +64734,6 @@
     parserListener->exitDollar_timeskew_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_timeskew_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_timeskew_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_timeskew_timing_checkContext* SV3_1aParser::dollar_timeskew_timing_check() {
   Dollar_timeskew_timing_checkContext *_localctx = _tracker.createInstance<Dollar_timeskew_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1060, SV3_1aParser::RuleDollar_timeskew_timing_check);
@@ -70091,14 +65052,6 @@
     parserListener->exitDollar_fullskew_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_fullskew_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_fullskew_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_fullskew_timing_checkContext* SV3_1aParser::dollar_fullskew_timing_check() {
   Dollar_fullskew_timing_checkContext *_localctx = _tracker.createInstance<Dollar_fullskew_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1062, SV3_1aParser::RuleDollar_fullskew_timing_check);
@@ -70405,14 +65358,6 @@
     parserListener->exitDollar_period_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_period_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_period_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_period_timing_checkContext* SV3_1aParser::dollar_period_timing_check() {
   Dollar_period_timing_checkContext *_localctx = _tracker.createInstance<Dollar_period_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1064, SV3_1aParser::RuleDollar_period_timing_check);
@@ -70551,14 +65496,6 @@
     parserListener->exitDollar_width_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_width_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_width_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_width_timing_checkContext* SV3_1aParser::dollar_width_timing_check() {
   Dollar_width_timing_checkContext *_localctx = _tracker.createInstance<Dollar_width_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1066, SV3_1aParser::RuleDollar_width_timing_check);
@@ -70705,14 +65642,6 @@
     parserListener->exitDollar_nochange_timing_check(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_nochange_timing_checkContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_nochange_timing_check(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_nochange_timing_checkContext* SV3_1aParser::dollar_nochange_timing_check() {
   Dollar_nochange_timing_checkContext *_localctx = _tracker.createInstance<Dollar_nochange_timing_checkContext>(_ctx, getState());
   enterRule(_localctx, 1068, SV3_1aParser::RuleDollar_nochange_timing_check);
@@ -70831,14 +65760,6 @@
     parserListener->exitDelayed_data(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delayed_dataContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelayed_data(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delayed_dataContext* SV3_1aParser::delayed_data() {
   Delayed_dataContext *_localctx = _tracker.createInstance<Delayed_dataContext>(_ctx, getState());
   enterRule(_localctx, 1070, SV3_1aParser::RuleDelayed_data);
@@ -70921,14 +65842,6 @@
     parserListener->exitDelayed_reference(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delayed_referenceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelayed_reference(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delayed_referenceContext* SV3_1aParser::delayed_reference() {
   Delayed_referenceContext *_localctx = _tracker.createInstance<Delayed_referenceContext>(_ctx, getState());
   enterRule(_localctx, 1072, SV3_1aParser::RuleDelayed_reference);
@@ -70999,14 +65912,6 @@
     parserListener->exitEnd_edge_offset(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::End_edge_offsetContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnd_edge_offset(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::End_edge_offsetContext* SV3_1aParser::end_edge_offset() {
   End_edge_offsetContext *_localctx = _tracker.createInstance<End_edge_offsetContext>(_ctx, getState());
   enterRule(_localctx, 1074, SV3_1aParser::RuleEnd_edge_offset);
@@ -71056,14 +65961,6 @@
     parserListener->exitEvent_based_flag(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Event_based_flagContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEvent_based_flag(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Event_based_flagContext* SV3_1aParser::event_based_flag() {
   Event_based_flagContext *_localctx = _tracker.createInstance<Event_based_flagContext>(_ctx, getState());
   enterRule(_localctx, 1076, SV3_1aParser::RuleEvent_based_flag);
@@ -71113,14 +66010,6 @@
     parserListener->exitNotifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::NotifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNotifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::NotifierContext* SV3_1aParser::notifier() {
   NotifierContext *_localctx = _tracker.createInstance<NotifierContext>(_ctx, getState());
   enterRule(_localctx, 1078, SV3_1aParser::RuleNotifier);
@@ -71170,14 +66059,6 @@
     parserListener->exitReference_event(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Reference_eventContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitReference_event(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Reference_eventContext* SV3_1aParser::reference_event() {
   Reference_eventContext *_localctx = _tracker.createInstance<Reference_eventContext>(_ctx, getState());
   enterRule(_localctx, 1080, SV3_1aParser::RuleReference_event);
@@ -71227,14 +66108,6 @@
     parserListener->exitRemain_active_flag(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Remain_active_flagContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRemain_active_flag(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Remain_active_flagContext* SV3_1aParser::remain_active_flag() {
   Remain_active_flagContext *_localctx = _tracker.createInstance<Remain_active_flagContext>(_ctx, getState());
   enterRule(_localctx, 1082, SV3_1aParser::RuleRemain_active_flag);
@@ -71284,14 +66157,6 @@
     parserListener->exitStamptime_condition(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Stamptime_conditionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStamptime_condition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Stamptime_conditionContext* SV3_1aParser::stamptime_condition() {
   Stamptime_conditionContext *_localctx = _tracker.createInstance<Stamptime_conditionContext>(_ctx, getState());
   enterRule(_localctx, 1084, SV3_1aParser::RuleStamptime_condition);
@@ -71341,14 +66206,6 @@
     parserListener->exitStart_edge_offset(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Start_edge_offsetContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStart_edge_offset(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Start_edge_offsetContext* SV3_1aParser::start_edge_offset() {
   Start_edge_offsetContext *_localctx = _tracker.createInstance<Start_edge_offsetContext>(_ctx, getState());
   enterRule(_localctx, 1086, SV3_1aParser::RuleStart_edge_offset);
@@ -71398,14 +66255,6 @@
     parserListener->exitThreshold(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::ThresholdContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitThreshold(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::ThresholdContext* SV3_1aParser::threshold() {
   ThresholdContext *_localctx = _tracker.createInstance<ThresholdContext>(_ctx, getState());
   enterRule(_localctx, 1088, SV3_1aParser::RuleThreshold);
@@ -71455,14 +66304,6 @@
     parserListener->exitTiming_check_limit(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Timing_check_limitContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTiming_check_limit(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Timing_check_limitContext* SV3_1aParser::timing_check_limit() {
   Timing_check_limitContext *_localctx = _tracker.createInstance<Timing_check_limitContext>(_ctx, getState());
   enterRule(_localctx, 1090, SV3_1aParser::RuleTiming_check_limit);
@@ -71524,14 +66365,6 @@
     parserListener->exitTiming_check_event(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Timing_check_eventContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTiming_check_event(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Timing_check_eventContext* SV3_1aParser::timing_check_event() {
   Timing_check_eventContext *_localctx = _tracker.createInstance<Timing_check_eventContext>(_ctx, getState());
   enterRule(_localctx, 1092, SV3_1aParser::RuleTiming_check_event);
@@ -71615,14 +66448,6 @@
     parserListener->exitControlled_timing_check_event(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Controlled_timing_check_eventContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitControlled_timing_check_event(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Controlled_timing_check_eventContext* SV3_1aParser::controlled_timing_check_event() {
   Controlled_timing_check_eventContext *_localctx = _tracker.createInstance<Controlled_timing_check_eventContext>(_ctx, getState());
   enterRule(_localctx, 1094, SV3_1aParser::RuleControlled_timing_check_event);
@@ -71691,13 +66516,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimingCheckEventControl_Negedge(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimingCheckEventControl_NegedgeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimingCheckEventControl_Negedge(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TimingCheckEventControl_PosedgeContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::TimingCheckEventControl_PosedgeContext::POSEDGE() {
@@ -71716,13 +66534,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimingCheckEventControl_Posedge(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimingCheckEventControl_PosedgeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimingCheckEventControl_Posedge(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- TimingCheckEventControl_EdgeContext ------------------------------------------------------------------
 
 SV3_1aParser::Edge_control_specifierContext* SV3_1aParser::TimingCheckEventControl_EdgeContext::edge_control_specifier() {
@@ -71741,13 +66552,6 @@
   if (parserListener != nullptr)
     parserListener->exitTimingCheckEventControl_Edge(this);
 }
-
-antlrcpp::Any SV3_1aParser::TimingCheckEventControl_EdgeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimingCheckEventControl_Edge(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Timing_check_event_controlContext* SV3_1aParser::timing_check_event_control() {
   Timing_check_event_controlContext *_localctx = _tracker.createInstance<Timing_check_event_controlContext>(_ctx, getState());
   enterRule(_localctx, 1096, SV3_1aParser::RuleTiming_check_event_control);
@@ -71828,14 +66632,6 @@
     parserListener->exitSpecify_terminal_descriptor(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Specify_terminal_descriptorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSpecify_terminal_descriptor(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Specify_terminal_descriptorContext* SV3_1aParser::specify_terminal_descriptor() {
   Specify_terminal_descriptorContext *_localctx = _tracker.createInstance<Specify_terminal_descriptorContext>(_ctx, getState());
   enterRule(_localctx, 1098, SV3_1aParser::RuleSpecify_terminal_descriptor);
@@ -71924,14 +66720,6 @@
     parserListener->exitEdge_control_specifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Edge_control_specifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_control_specifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Edge_control_specifierContext* SV3_1aParser::edge_control_specifier() {
   Edge_control_specifierContext *_localctx = _tracker.createInstance<Edge_control_specifierContext>(_ctx, getState());
   enterRule(_localctx, 1100, SV3_1aParser::RuleEdge_control_specifier);
@@ -72004,14 +66792,6 @@
     parserListener->exitEdge_descriptor(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Edge_descriptorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEdge_descriptor(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Edge_descriptorContext* SV3_1aParser::edge_descriptor() {
   Edge_descriptorContext *_localctx = _tracker.createInstance<Edge_descriptorContext>(_ctx, getState());
   enterRule(_localctx, 1102, SV3_1aParser::RuleEdge_descriptor);
@@ -72095,14 +66875,6 @@
     parserListener->exitTiming_check_condition(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Timing_check_conditionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTiming_check_condition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Timing_check_conditionContext* SV3_1aParser::timing_check_condition() {
   Timing_check_conditionContext *_localctx = _tracker.createInstance<Timing_check_conditionContext>(_ctx, getState());
   enterRule(_localctx, 1104, SV3_1aParser::RuleTiming_check_condition);
@@ -72195,14 +66967,6 @@
     parserListener->exitScalar_timing_check_condition(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Scalar_timing_check_conditionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_timing_check_condition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Scalar_timing_check_conditionContext* SV3_1aParser::scalar_timing_check_condition() {
   Scalar_timing_check_conditionContext *_localctx = _tracker.createInstance<Scalar_timing_check_conditionContext>(_ctx, getState());
   enterRule(_localctx, 1106, SV3_1aParser::RuleScalar_timing_check_condition);
@@ -72319,13 +67083,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_1Tickb1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_1Tickb1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_1Tickb1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_1TickB1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_1TickB1Context::ONE_TICK_B1() {
@@ -72344,13 +67101,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_1TickB1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_1TickB1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_1TickB1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_1Tickb0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_1Tickb0Context::ONE_TICK_b0() {
@@ -72369,13 +67119,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_1Tickb0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_1Tickb0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_1Tickb0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_1TickB0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_1TickB0Context::ONE_TICK_B0() {
@@ -72394,13 +67137,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_1TickB0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_1TickB0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_1TickB0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_IntegralContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_IntegralContext::Integral_number() {
@@ -72419,13 +67155,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_Integral(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_IntegralContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_Integral(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_Tickb0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_Tickb0Context::TICK_b0() {
@@ -72444,13 +67173,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_Tickb0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_Tickb0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_Tickb0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_TickB0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_TickB0Context::TICK_B0() {
@@ -72469,13 +67191,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_TickB0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_TickB0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_TickB0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_Tickb1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_Tickb1Context::TICK_b1() {
@@ -72494,13 +67209,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_Tickb1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_Tickb1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_Tickb1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Scalar_TickB1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Scalar_TickB1Context::TICK_B1() {
@@ -72519,13 +67227,6 @@
   if (parserListener != nullptr)
     parserListener->exitScalar_TickB1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Scalar_TickB1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitScalar_TickB1(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Scalar_constantContext* SV3_1aParser::scalar_constant() {
   Scalar_constantContext *_localctx = _tracker.createInstance<Scalar_constantContext>(_ctx, getState());
   enterRule(_localctx, 1108, SV3_1aParser::RuleScalar_constant);
@@ -72686,14 +67387,6 @@
     parserListener->exitConcatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::ConcatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConcatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::ConcatenationContext* SV3_1aParser::concatenation() {
   ConcatenationContext *_localctx = _tracker.createInstance<ConcatenationContext>(_ctx, getState());
   enterRule(_localctx, 1110, SV3_1aParser::RuleConcatenation);
@@ -72835,14 +67528,6 @@
     parserListener->exitConstant_concatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_concatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_concatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_concatenationContext* SV3_1aParser::constant_concatenation() {
   Constant_concatenationContext *_localctx = _tracker.createInstance<Constant_concatenationContext>(_ctx, getState());
   enterRule(_localctx, 1112, SV3_1aParser::RuleConstant_concatenation);
@@ -72956,14 +67641,6 @@
     parserListener->exitArray_member_label(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Array_member_labelContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitArray_member_label(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Array_member_labelContext* SV3_1aParser::array_member_label() {
   Array_member_labelContext *_localctx = _tracker.createInstance<Array_member_labelContext>(_ctx, getState());
   enterRule(_localctx, 1114, SV3_1aParser::RuleArray_member_label);
@@ -73047,14 +67724,6 @@
     parserListener->exitConstant_multiple_concatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_multiple_concatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_multiple_concatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_multiple_concatenationContext* SV3_1aParser::constant_multiple_concatenation() {
   Constant_multiple_concatenationContext *_localctx = _tracker.createInstance<Constant_multiple_concatenationContext>(_ctx, getState());
   enterRule(_localctx, 1116, SV3_1aParser::RuleConstant_multiple_concatenation);
@@ -73130,14 +67799,6 @@
     parserListener->exitModule_path_concatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_path_concatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_path_concatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_path_concatenationContext* SV3_1aParser::module_path_concatenation() {
   Module_path_concatenationContext *_localctx = _tracker.createInstance<Module_path_concatenationContext>(_ctx, getState());
   enterRule(_localctx, 1118, SV3_1aParser::RuleModule_path_concatenation);
@@ -73216,14 +67877,6 @@
     parserListener->exitModule_path_multiple_concatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_path_multiple_concatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_path_multiple_concatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_path_multiple_concatenationContext* SV3_1aParser::module_path_multiple_concatenation() {
   Module_path_multiple_concatenationContext *_localctx = _tracker.createInstance<Module_path_multiple_concatenationContext>(_ctx, getState());
   enterRule(_localctx, 1120, SV3_1aParser::RuleModule_path_multiple_concatenation);
@@ -73291,14 +67944,6 @@
     parserListener->exitMultiple_concatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Multiple_concatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMultiple_concatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Multiple_concatenationContext* SV3_1aParser::multiple_concatenation() {
   Multiple_concatenationContext *_localctx = _tracker.createInstance<Multiple_concatenationContext>(_ctx, getState());
   enterRule(_localctx, 1122, SV3_1aParser::RuleMultiple_concatenation);
@@ -73370,14 +68015,6 @@
     parserListener->exitStreaming_concatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Streaming_concatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStreaming_concatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Streaming_concatenationContext* SV3_1aParser::streaming_concatenation() {
   Streaming_concatenationContext *_localctx = _tracker.createInstance<Streaming_concatenationContext>(_ctx, getState());
   enterRule(_localctx, 1124, SV3_1aParser::RuleStreaming_concatenation);
@@ -73448,14 +68085,6 @@
     parserListener->exitStream_operator(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Stream_operatorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStream_operator(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Stream_operatorContext* SV3_1aParser::stream_operator() {
   Stream_operatorContext *_localctx = _tracker.createInstance<Stream_operatorContext>(_ctx, getState());
   enterRule(_localctx, 1126, SV3_1aParser::RuleStream_operator);
@@ -73519,14 +68148,6 @@
     parserListener->exitSlice_size(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Slice_sizeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSlice_size(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Slice_sizeContext* SV3_1aParser::slice_size() {
   Slice_sizeContext *_localctx = _tracker.createInstance<Slice_sizeContext>(_ctx, getState());
   enterRule(_localctx, 1128, SV3_1aParser::RuleSlice_size);
@@ -73611,14 +68232,6 @@
     parserListener->exitStream_concatenation(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Stream_concatenationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStream_concatenation(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Stream_concatenationContext* SV3_1aParser::stream_concatenation() {
   Stream_concatenationContext *_localctx = _tracker.createInstance<Stream_concatenationContext>(_ctx, getState());
   enterRule(_localctx, 1130, SV3_1aParser::RuleStream_concatenation);
@@ -73701,14 +68314,6 @@
     parserListener->exitStream_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Stream_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitStream_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Stream_expressionContext* SV3_1aParser::stream_expression() {
   Stream_expressionContext *_localctx = _tracker.createInstance<Stream_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1132, SV3_1aParser::RuleStream_expression);
@@ -73789,14 +68394,6 @@
     parserListener->exitArray_range_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Array_range_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitArray_range_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Array_range_expressionContext* SV3_1aParser::array_range_expression() {
   Array_range_expressionContext *_localctx = _tracker.createInstance<Array_range_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1134, SV3_1aParser::RuleArray_range_expression);
@@ -73891,14 +68488,6 @@
     parserListener->exitEmpty_queue(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Empty_queueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEmpty_queue(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Empty_queueContext* SV3_1aParser::empty_queue() {
   Empty_queueContext *_localctx = _tracker.createInstance<Empty_queueContext>(_ctx, getState());
   enterRule(_localctx, 1136, SV3_1aParser::RuleEmpty_queue);
@@ -74022,14 +68611,6 @@
     parserListener->exitSubroutine_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Subroutine_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSubroutine_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Subroutine_callContext* SV3_1aParser::subroutine_call() {
   Subroutine_callContext *_localctx = _tracker.createInstance<Subroutine_callContext>(_ctx, getState());
   enterRule(_localctx, 1138, SV3_1aParser::RuleSubroutine_call);
@@ -74246,14 +68827,6 @@
     parserListener->exitList_of_arguments(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::List_of_argumentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitList_of_arguments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::List_of_argumentsContext* SV3_1aParser::list_of_arguments() {
   List_of_argumentsContext *_localctx = _tracker.createInstance<List_of_argumentsContext>(_ctx, getState());
   enterRule(_localctx, 1140, SV3_1aParser::RuleList_of_arguments);
@@ -74851,14 +69424,6 @@
     parserListener->exitMethod_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Method_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMethod_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Method_callContext* SV3_1aParser::method_call() {
   Method_callContext *_localctx = _tracker.createInstance<Method_callContext>(_ctx, getState());
   enterRule(_localctx, 1142, SV3_1aParser::RuleMethod_call);
@@ -74955,14 +69520,6 @@
     parserListener->exitMethod_call_body(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Method_call_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMethod_call_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Method_call_bodyContext* SV3_1aParser::method_call_body() {
   Method_call_bodyContext *_localctx = _tracker.createInstance<Method_call_bodyContext>(_ctx, getState());
   enterRule(_localctx, 1144, SV3_1aParser::RuleMethod_call_body);
@@ -75059,14 +69616,6 @@
     parserListener->exitBuilt_in_method_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Built_in_method_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBuilt_in_method_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Built_in_method_callContext* SV3_1aParser::built_in_method_call() {
   Built_in_method_callContext *_localctx = _tracker.createInstance<Built_in_method_callContext>(_ctx, getState());
   enterRule(_localctx, 1146, SV3_1aParser::RuleBuilt_in_method_call);
@@ -75167,14 +69716,6 @@
     parserListener->exitArray_manipulation_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Array_manipulation_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitArray_manipulation_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Array_manipulation_callContext* SV3_1aParser::array_manipulation_call() {
   Array_manipulation_callContext *_localctx = _tracker.createInstance<Array_manipulation_callContext>(_ctx, getState());
   enterRule(_localctx, 1148, SV3_1aParser::RuleArray_manipulation_call);
@@ -75313,14 +69854,6 @@
     parserListener->exitRandomize_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Randomize_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRandomize_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Randomize_callContext* SV3_1aParser::randomize_call() {
   Randomize_callContext *_localctx = _tracker.createInstance<Randomize_callContext>(_ctx, getState());
   enterRule(_localctx, 1150, SV3_1aParser::RuleRandomize_call);
@@ -75541,14 +70074,6 @@
     parserListener->exitMethod_call_root(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Method_call_rootContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMethod_call_root(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Method_call_rootContext* SV3_1aParser::method_call_root() {
   Method_call_rootContext *_localctx = _tracker.createInstance<Method_call_rootContext>(_ctx, getState());
   enterRule(_localctx, 1152, SV3_1aParser::RuleMethod_call_root);
@@ -75686,14 +70211,6 @@
     parserListener->exitArray_method_name(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Array_method_nameContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitArray_method_name(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Array_method_nameContext* SV3_1aParser::array_method_name() {
   Array_method_nameContext *_localctx = _tracker.createInstance<Array_method_nameContext>(_ctx, getState());
   enterRule(_localctx, 1154, SV3_1aParser::RuleArray_method_name);
@@ -75798,14 +70315,6 @@
     parserListener->exitUnique_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Unique_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnique_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Unique_callContext* SV3_1aParser::unique_call() {
   Unique_callContext *_localctx = _tracker.createInstance<Unique_callContext>(_ctx, getState());
   enterRule(_localctx, 1156, SV3_1aParser::RuleUnique_call);
@@ -75855,14 +70364,6 @@
     parserListener->exitAnd_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::And_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAnd_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::And_callContext* SV3_1aParser::and_call() {
   And_callContext *_localctx = _tracker.createInstance<And_callContext>(_ctx, getState());
   enterRule(_localctx, 1158, SV3_1aParser::RuleAnd_call);
@@ -75912,14 +70413,6 @@
     parserListener->exitOr_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Or_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitOr_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Or_callContext* SV3_1aParser::or_call() {
   Or_callContext *_localctx = _tracker.createInstance<Or_callContext>(_ctx, getState());
   enterRule(_localctx, 1160, SV3_1aParser::RuleOr_call);
@@ -75969,14 +70462,6 @@
     parserListener->exitXor_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Xor_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitXor_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Xor_callContext* SV3_1aParser::xor_call() {
   Xor_callContext *_localctx = _tracker.createInstance<Xor_callContext>(_ctx, getState());
   enterRule(_localctx, 1162, SV3_1aParser::RuleXor_call);
@@ -76038,14 +70523,6 @@
     parserListener->exitInc_or_dec_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Inc_or_dec_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInc_or_dec_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Inc_or_dec_expressionContext* SV3_1aParser::inc_or_dec_expression() {
   Inc_or_dec_expressionContext *_localctx = _tracker.createInstance<Inc_or_dec_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1164, SV3_1aParser::RuleInc_or_dec_expression);
@@ -76204,14 +70681,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::Constant_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::Constant_expressionContext* SV3_1aParser::constant_expression() {
    return constant_expression(0);
 }
@@ -76383,14 +70852,6 @@
     parserListener->exitConstant_mintypmax_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_mintypmax_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_mintypmax_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_mintypmax_expressionContext* SV3_1aParser::constant_mintypmax_expression() {
   Constant_mintypmax_expressionContext *_localctx = _tracker.createInstance<Constant_mintypmax_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1168, SV3_1aParser::RuleConstant_mintypmax_expression);
@@ -76471,14 +70932,6 @@
     parserListener->exitConstant_param_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_param_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_param_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_param_expressionContext* SV3_1aParser::constant_param_expression() {
   Constant_param_expressionContext *_localctx = _tracker.createInstance<Constant_param_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1170, SV3_1aParser::RuleConstant_param_expression);
@@ -76558,14 +71011,6 @@
     parserListener->exitParam_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Param_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitParam_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Param_expressionContext* SV3_1aParser::param_expression() {
   Param_expressionContext *_localctx = _tracker.createInstance<Param_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1172, SV3_1aParser::RuleParam_expression);
@@ -76641,14 +71086,6 @@
     parserListener->exitConstant_range_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_range_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_range_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_range_expressionContext* SV3_1aParser::constant_range_expression() {
   Constant_range_expressionContext *_localctx = _tracker.createInstance<Constant_range_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1174, SV3_1aParser::RuleConstant_range_expression);
@@ -76717,14 +71154,6 @@
     parserListener->exitConstant_part_select_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_part_select_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_part_select_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_part_select_rangeContext* SV3_1aParser::constant_part_select_range() {
   Constant_part_select_rangeContext *_localctx = _tracker.createInstance<Constant_part_select_rangeContext>(_ctx, getState());
   enterRule(_localctx, 1176, SV3_1aParser::RuleConstant_part_select_range);
@@ -76797,14 +71226,6 @@
     parserListener->exitConstant_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_rangeContext* SV3_1aParser::constant_range() {
   Constant_rangeContext *_localctx = _tracker.createInstance<Constant_rangeContext>(_ctx, getState());
   enterRule(_localctx, 1178, SV3_1aParser::RuleConstant_range);
@@ -76870,14 +71291,6 @@
     parserListener->exitConstant_indexed_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_indexed_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_indexed_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_indexed_rangeContext* SV3_1aParser::constant_indexed_range() {
   Constant_indexed_rangeContext *_localctx = _tracker.createInstance<Constant_indexed_rangeContext>(_ctx, getState());
   enterRule(_localctx, 1180, SV3_1aParser::RuleConstant_indexed_range);
@@ -77035,14 +71448,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::ExpressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExpression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::ExpressionContext* SV3_1aParser::expression() {
    return expression(0);
 }
@@ -77342,14 +71747,6 @@
     parserListener->exitTagged_union_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Tagged_union_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTagged_union_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Tagged_union_expressionContext* SV3_1aParser::tagged_union_expression() {
   Tagged_union_expressionContext *_localctx = _tracker.createInstance<Tagged_union_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1184, SV3_1aParser::RuleTagged_union_expression);
@@ -77428,14 +71825,6 @@
     parserListener->exitValue_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Value_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitValue_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Value_rangeContext* SV3_1aParser::value_range() {
   Value_rangeContext *_localctx = _tracker.createInstance<Value_rangeContext>(_ctx, getState());
   enterRule(_localctx, 1186, SV3_1aParser::RuleValue_range);
@@ -77591,14 +71980,6 @@
     parserListener->exitMintypmax_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Mintypmax_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitMintypmax_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Mintypmax_expressionContext* SV3_1aParser::mintypmax_expression() {
   Mintypmax_expressionContext *_localctx = _tracker.createInstance<Mintypmax_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1188, SV3_1aParser::RuleMintypmax_expression);
@@ -77704,14 +72085,6 @@
 }
 
 
-antlrcpp::Any SV3_1aParser::Module_path_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_path_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
-
 SV3_1aParser::Module_path_expressionContext* SV3_1aParser::module_path_expression() {
    return module_path_expression(0);
 }
@@ -77926,14 +72299,6 @@
     parserListener->exitModule_path_mintypmax_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_path_mintypmax_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_path_mintypmax_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_path_mintypmax_expressionContext* SV3_1aParser::module_path_mintypmax_expression() {
   Module_path_mintypmax_expressionContext *_localctx = _tracker.createInstance<Module_path_mintypmax_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1192, SV3_1aParser::RuleModule_path_mintypmax_expression);
@@ -78010,14 +72375,6 @@
     parserListener->exitRange_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Range_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRange_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Range_expressionContext* SV3_1aParser::range_expression() {
   Range_expressionContext *_localctx = _tracker.createInstance<Range_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1194, SV3_1aParser::RuleRange_expression);
@@ -78086,14 +72443,6 @@
     parserListener->exitPart_select_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Part_select_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPart_select_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Part_select_rangeContext* SV3_1aParser::part_select_range() {
   Part_select_rangeContext *_localctx = _tracker.createInstance<Part_select_rangeContext>(_ctx, getState());
   enterRule(_localctx, 1196, SV3_1aParser::RulePart_select_range);
@@ -78170,14 +72519,6 @@
     parserListener->exitIndexed_range(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Indexed_rangeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIndexed_range(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Indexed_rangeContext* SV3_1aParser::indexed_range() {
   Indexed_rangeContext *_localctx = _tracker.createInstance<Indexed_rangeContext>(_ctx, getState());
   enterRule(_localctx, 1198, SV3_1aParser::RuleIndexed_range);
@@ -78318,14 +72659,6 @@
     parserListener->exitConstant_primary(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_primaryContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_primary(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_primaryContext* SV3_1aParser::constant_primary() {
   Constant_primaryContext *_localctx = _tracker.createInstance<Constant_primaryContext>(_ctx, getState());
   enterRule(_localctx, 1200, SV3_1aParser::RuleConstant_primary);
@@ -78542,14 +72875,6 @@
     parserListener->exitModule_path_primary(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Module_path_primaryContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitModule_path_primary(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Module_path_primaryContext* SV3_1aParser::module_path_primary() {
   Module_path_primaryContext *_localctx = _tracker.createInstance<Module_path_primaryContext>(_ctx, getState());
   enterRule(_localctx, 1202, SV3_1aParser::RuleModule_path_primary);
@@ -78730,14 +73055,6 @@
     parserListener->exitComplex_func_call(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Complex_func_callContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitComplex_func_call(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Complex_func_callContext* SV3_1aParser::complex_func_call() {
   Complex_func_callContext *_localctx = _tracker.createInstance<Complex_func_callContext>(_ctx, getState());
   enterRule(_localctx, 1204, SV3_1aParser::RuleComplex_func_call);
@@ -78992,14 +73309,6 @@
     parserListener->exitPrimary(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::PrimaryContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPrimary(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::PrimaryContext* SV3_1aParser::primary() {
   PrimaryContext *_localctx = _tracker.createInstance<PrimaryContext>(_ctx, getState());
   enterRule(_localctx, 1206, SV3_1aParser::RulePrimary);
@@ -79185,14 +73494,6 @@
     parserListener->exitThis_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::This_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitThis_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::This_keywordContext* SV3_1aParser::this_keyword() {
   This_keywordContext *_localctx = _tracker.createInstance<This_keywordContext>(_ctx, getState());
   enterRule(_localctx, 1208, SV3_1aParser::RuleThis_keyword);
@@ -79242,14 +73543,6 @@
     parserListener->exitSuper_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Super_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSuper_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Super_keywordContext* SV3_1aParser::super_keyword() {
   Super_keywordContext *_localctx = _tracker.createInstance<Super_keywordContext>(_ctx, getState());
   enterRule(_localctx, 1210, SV3_1aParser::RuleSuper_keyword);
@@ -79299,14 +73592,6 @@
     parserListener->exitDollar_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_keywordContext* SV3_1aParser::dollar_keyword() {
   Dollar_keywordContext *_localctx = _tracker.createInstance<Dollar_keywordContext>(_ctx, getState());
   enterRule(_localctx, 1212, SV3_1aParser::RuleDollar_keyword);
@@ -79360,14 +73645,6 @@
     parserListener->exitDollar_root_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Dollar_root_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDollar_root_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Dollar_root_keywordContext* SV3_1aParser::dollar_root_keyword() {
   Dollar_root_keywordContext *_localctx = _tracker.createInstance<Dollar_root_keywordContext>(_ctx, getState());
   enterRule(_localctx, 1214, SV3_1aParser::RuleDollar_root_keyword);
@@ -79427,14 +73704,6 @@
     parserListener->exitThis_dot_super(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::This_dot_superContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitThis_dot_super(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::This_dot_superContext* SV3_1aParser::this_dot_super() {
   This_dot_superContext *_localctx = _tracker.createInstance<This_dot_superContext>(_ctx, getState());
   enterRule(_localctx, 1216, SV3_1aParser::RuleThis_dot_super);
@@ -79488,14 +73757,6 @@
     parserListener->exitNull_keyword(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Null_keywordContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNull_keyword(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Null_keywordContext* SV3_1aParser::null_keyword() {
   Null_keywordContext *_localctx = _tracker.createInstance<Null_keywordContext>(_ctx, getState());
   enterRule(_localctx, 1218, SV3_1aParser::RuleNull_keyword);
@@ -79553,14 +73814,6 @@
     parserListener->exitTime_literal(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Time_literalContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTime_literal(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Time_literalContext* SV3_1aParser::time_literal() {
   Time_literalContext *_localctx = _tracker.createInstance<Time_literalContext>(_ctx, getState());
   enterRule(_localctx, 1220, SV3_1aParser::RuleTime_literal);
@@ -79631,14 +73884,6 @@
     parserListener->exitTime_unit(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Time_unitContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTime_unit(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Time_unitContext* SV3_1aParser::time_unit() {
   Time_unitContext *_localctx = _tracker.createInstance<Time_unitContext>(_ctx, getState());
   enterRule(_localctx, 1222, SV3_1aParser::RuleTime_unit);
@@ -79696,14 +73941,6 @@
     parserListener->exitImplicit_class_handle(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Implicit_class_handleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitImplicit_class_handle(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Implicit_class_handleContext* SV3_1aParser::implicit_class_handle() {
   Implicit_class_handleContext *_localctx = _tracker.createInstance<Implicit_class_handleContext>(_ctx, getState());
   enterRule(_localctx, 1224, SV3_1aParser::RuleImplicit_class_handle);
@@ -79795,14 +74032,6 @@
     parserListener->exitBit_select(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Bit_selectContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBit_select(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Bit_selectContext* SV3_1aParser::bit_select() {
   Bit_selectContext *_localctx = _tracker.createInstance<Bit_selectContext>(_ctx, getState());
   enterRule(_localctx, 1226, SV3_1aParser::RuleBit_select);
@@ -79899,14 +74128,6 @@
     parserListener->exitSelect(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::SelectContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSelect(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::SelectContext* SV3_1aParser::select() {
   SelectContext *_localctx = _tracker.createInstance<SelectContext>(_ctx, getState());
   enterRule(_localctx, 1228, SV3_1aParser::RuleSelect);
@@ -80021,14 +74242,6 @@
     parserListener->exitNonrange_select(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Nonrange_selectContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNonrange_select(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Nonrange_selectContext* SV3_1aParser::nonrange_select() {
   Nonrange_selectContext *_localctx = _tracker.createInstance<Nonrange_selectContext>(_ctx, getState());
   enterRule(_localctx, 1230, SV3_1aParser::RuleNonrange_select);
@@ -80126,14 +74339,6 @@
     parserListener->exitConstant_bit_select(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_bit_selectContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_bit_select(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_bit_selectContext* SV3_1aParser::constant_bit_select() {
   Constant_bit_selectContext *_localctx = _tracker.createInstance<Constant_bit_selectContext>(_ctx, getState());
   enterRule(_localctx, 1232, SV3_1aParser::RuleConstant_bit_select);
@@ -80230,14 +74435,6 @@
     parserListener->exitConstant_select(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_selectContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_select(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_selectContext* SV3_1aParser::constant_select() {
   Constant_selectContext *_localctx = _tracker.createInstance<Constant_selectContext>(_ctx, getState());
   enterRule(_localctx, 1234, SV3_1aParser::RuleConstant_select);
@@ -80348,14 +74545,6 @@
     parserListener->exitPrimary_literal(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Primary_literalContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPrimary_literal(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Primary_literalContext* SV3_1aParser::primary_literal() {
   Primary_literalContext *_localctx = _tracker.createInstance<Primary_literalContext>(_ctx, getState());
   enterRule(_localctx, 1236, SV3_1aParser::RulePrimary_literal);
@@ -80465,14 +74654,6 @@
     parserListener->exitConstant_cast(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Constant_castContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConstant_cast(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Constant_castContext* SV3_1aParser::constant_cast() {
   Constant_castContext *_localctx = _tracker.createInstance<Constant_castContext>(_ctx, getState());
   enterRule(_localctx, 1238, SV3_1aParser::RuleConstant_cast);
@@ -80574,14 +74755,6 @@
     parserListener->exitCast(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::CastContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCast(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::CastContext* SV3_1aParser::cast() {
   CastContext *_localctx = _tracker.createInstance<CastContext>(_ctx, getState());
   enterRule(_localctx, 1240, SV3_1aParser::RuleCast);
@@ -80695,14 +74868,6 @@
     parserListener->exitNet_lvalue(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Net_lvalueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNet_lvalue(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Net_lvalueContext* SV3_1aParser::net_lvalue() {
   Net_lvalueContext *_localctx = _tracker.createInstance<Net_lvalueContext>(_ctx, getState());
   enterRule(_localctx, 1242, SV3_1aParser::RuleNet_lvalue);
@@ -80879,14 +75044,6 @@
     parserListener->exitVariable_lvalue(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Variable_lvalueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitVariable_lvalue(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Variable_lvalueContext* SV3_1aParser::variable_lvalue() {
   Variable_lvalueContext *_localctx = _tracker.createInstance<Variable_lvalueContext>(_ctx, getState());
   enterRule(_localctx, 1244, SV3_1aParser::RuleVariable_lvalue);
@@ -81053,14 +75210,6 @@
     parserListener->exitNonrange_variable_lvalue(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Nonrange_variable_lvalueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNonrange_variable_lvalue(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Nonrange_variable_lvalueContext* SV3_1aParser::nonrange_variable_lvalue() {
   Nonrange_variable_lvalueContext *_localctx = _tracker.createInstance<Nonrange_variable_lvalueContext>(_ctx, getState());
   enterRule(_localctx, 1246, SV3_1aParser::RuleNonrange_variable_lvalue);
@@ -81137,13 +75286,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_BitwAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_BitwAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_BitwAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_ReductNandContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_ReductNandContext::REDUCTION_NAND() {
@@ -81162,13 +75304,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_ReductNand(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_ReductNandContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_ReductNand(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_TildaContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_TildaContext::TILDA() {
@@ -81187,13 +75322,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_Tilda(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_TildaContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_Tilda(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_PlusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_PlusContext::PLUS() {
@@ -81212,13 +75340,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_Plus(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_PlusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_Plus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_NotContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_NotContext::BANG() {
@@ -81237,13 +75358,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_Not(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_NotContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_Not(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_BitwOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_BitwOrContext::BITW_OR() {
@@ -81262,13 +75376,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_BitwOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_BitwOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_BitwOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_ReductXnor2Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_ReductXnor2Context::REDUCTION_XNOR2() {
@@ -81287,13 +75394,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_ReductXnor2(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_ReductXnor2Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_ReductXnor2(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_BitwXorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_BitwXorContext::BITW_XOR() {
@@ -81312,13 +75412,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_BitwXor(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_BitwXorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_BitwXor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_MinusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_MinusContext::MINUS() {
@@ -81337,13 +75430,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_Minus(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_MinusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_Minus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_ReductNorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_ReductNorContext::REDUCTION_NOR() {
@@ -81362,13 +75448,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_ReductNor(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_ReductNorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_ReductNor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Unary_ReductXnor1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Unary_ReductXnor1Context::REDUCTION_XNOR1() {
@@ -81387,13 +75466,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnary_ReductXnor1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Unary_ReductXnor1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnary_ReductXnor1(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Unary_operatorContext* SV3_1aParser::unary_operator() {
   Unary_operatorContext *_localctx = _tracker.createInstance<Unary_operatorContext>(_ctx, getState());
   enterRule(_localctx, 1248, SV3_1aParser::RuleUnary_operator);
@@ -81540,13 +75612,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_BitwAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_BitwAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_BitwAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_MinusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_MinusContext::MINUS() {
@@ -81565,13 +75630,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Minus(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_MinusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Minus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_DivContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_DivContext::DIV() {
@@ -81590,13 +75648,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Div(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_DivContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Div(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_WildEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_WildEqualContext::WILD_EQUAL_OP() {
@@ -81615,13 +75666,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_WildEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_WildEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_WildEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ArithShiftLeftContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ArithShiftLeftContext::ARITH_SHIFT_LEFT() {
@@ -81640,13 +75684,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ArithShiftLeft(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ArithShiftLeftContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ArithShiftLeft(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_MultContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_MultContext::STAR() {
@@ -81665,13 +75702,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Mult(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_MultContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Mult(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ReductNandContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ReductNandContext::REDUCTION_NAND() {
@@ -81690,13 +75720,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ReductNand(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ReductNandContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ReductNand(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_NotContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_NotContext::NOTEQUAL() {
@@ -81715,13 +75738,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Not(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_NotContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Not(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_BitwXorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_BitwXorContext::BITW_XOR() {
@@ -81740,13 +75756,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_BitwXor(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_BitwXorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_BitwXor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ShiftLeftContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ShiftLeftContext::SHIFT_LEFT() {
@@ -81765,13 +75774,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ShiftLeft(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ShiftLeftContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ShiftLeft(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_WildcardEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_WildcardEqualContext::BINARY_WILDCARD_EQUAL() {
@@ -81790,13 +75792,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_WildcardEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_WildcardEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_WildcardEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ShiftRightContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ShiftRightContext::SHIFT_RIGHT() {
@@ -81815,13 +75810,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ShiftRight(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ShiftRightContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ShiftRight(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ArithShiftRightContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ArithShiftRightContext::ARITH_SHIFT_RIGHT() {
@@ -81840,13 +75828,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ArithShiftRight(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ArithShiftRightContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ArithShiftRight(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_LogicOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_LogicOrContext::LOGICAL_OR() {
@@ -81865,13 +75846,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_LogicOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_LogicOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_LogicOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_PercentContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_PercentContext::PERCENT() {
@@ -81890,13 +75864,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Percent(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_PercentContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Percent(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ReductNorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ReductNorContext::REDUCTION_NOR() {
@@ -81915,13 +75882,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ReductNor(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ReductNorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ReductNor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_WildcardNotEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_WildcardNotEqualContext::BINARY_WILDCARD_NOTEQUAL() {
@@ -81940,13 +75900,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_WildcardNotEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_WildcardNotEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_WildcardNotEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_FourStateLogicEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_FourStateLogicEqualContext::FOUR_STATE_LOGIC_EQUAL() {
@@ -81965,13 +75918,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_FourStateLogicEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_FourStateLogicEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_FourStateLogicEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ImplyContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ImplyContext::IMPLY() {
@@ -81990,13 +75936,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Imply(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ImplyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Imply(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_EquivContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_EquivContext::EQUIV() {
@@ -82015,13 +75954,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Equiv(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_EquivContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Equiv(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_LessEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_LessEqualContext::LESS_EQUAL() {
@@ -82040,13 +75972,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_LessEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_LessEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_LessEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_LogicAndContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_LogicAndContext::LOGICAL_AND() {
@@ -82065,13 +75990,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_LogicAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_LogicAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_LogicAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ReductXnor2Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ReductXnor2Context::REDUCTION_XNOR2() {
@@ -82090,13 +76008,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ReductXnor2(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ReductXnor2Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ReductXnor2(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_ReductXnor1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_ReductXnor1Context::REDUCTION_XNOR1() {
@@ -82115,13 +76026,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_ReductXnor1(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_ReductXnor1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_ReductXnor1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_GreatEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_GreatEqualContext::GREATER_EQUAL() {
@@ -82140,13 +76044,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_GreatEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_GreatEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_GreatEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_FourStateLogicNotEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_FourStateLogicNotEqualContext::FOUR_STATE_LOGIC_NOTEQUAL() {
@@ -82165,13 +76062,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_FourStateLogicNotEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_FourStateLogicNotEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_FourStateLogicNotEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_MultMultContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_MultMultContext::STARSTAR() {
@@ -82190,13 +76080,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_MultMult(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_MultMultContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_MultMult(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_GreatContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_GreatContext::GREATER() {
@@ -82215,13 +76098,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Great(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_GreatContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Great(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_EquivalenceContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_EquivalenceContext::EQUIVALENCE() {
@@ -82240,13 +76116,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Equivalence(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_EquivalenceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Equivalence(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_WildNotEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_WildNotEqualContext::WILD_NOTEQUAL_OP() {
@@ -82265,13 +76134,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_WildNotEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_WildNotEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_WildNotEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_LessContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_LessContext::LESS() {
@@ -82290,13 +76152,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Less(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_LessContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Less(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_PlusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_PlusContext::PLUS() {
@@ -82315,13 +76170,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_Plus(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_PlusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_Plus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinOp_BitwOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinOp_BitwOrContext::BITW_OR() {
@@ -82340,13 +76188,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinOp_BitwOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinOp_BitwOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinOp_BitwOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Binary_operatorContext* SV3_1aParser::binary_operator() {
   Binary_operatorContext *_localctx = _tracker.createInstance<Binary_operatorContext>(_ctx, getState());
   enterRule(_localctx, 1250, SV3_1aParser::RuleBinary_operator);
@@ -82669,13 +76510,6 @@
   if (parserListener != nullptr)
     parserListener->exitIncDec_MinusMinus(this);
 }
-
-antlrcpp::Any SV3_1aParser::IncDec_MinusMinusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIncDec_MinusMinus(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- IncDec_PlusPlusContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::IncDec_PlusPlusContext::PLUSPLUS() {
@@ -82694,13 +76528,6 @@
   if (parserListener != nullptr)
     parserListener->exitIncDec_PlusPlus(this);
 }
-
-antlrcpp::Any SV3_1aParser::IncDec_PlusPlusContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIncDec_PlusPlus(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Inc_or_dec_operatorContext* SV3_1aParser::inc_or_dec_operator() {
   Inc_or_dec_operatorContext *_localctx = _tracker.createInstance<Inc_or_dec_operatorContext>(_ctx, getState());
   enterRule(_localctx, 1252, SV3_1aParser::RuleInc_or_dec_operator);
@@ -82775,13 +76602,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_ReductXnor2(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_ReductXnor2Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_ReductXnor2(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_NotContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_NotContext::BANG() {
@@ -82800,13 +76620,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_Not(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_NotContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_Not(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_ReductNandContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_ReductNandContext::REDUCTION_NAND() {
@@ -82825,13 +76638,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_ReductNand(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_ReductNandContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_ReductNand(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_ReductXNor1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_ReductXNor1Context::REDUCTION_XNOR1() {
@@ -82850,13 +76656,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_ReductXNor1(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_ReductXNor1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_ReductXNor1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_TildaContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_TildaContext::TILDA() {
@@ -82875,13 +76674,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_Tilda(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_TildaContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_Tilda(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_BitwOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_BitwOrContext::BITW_OR() {
@@ -82900,13 +76692,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_BitwOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_BitwOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_BitwOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_ReductNorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_ReductNorContext::REDUCTION_NOR() {
@@ -82925,13 +76710,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_ReductNor(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_ReductNorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_ReductNor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_BitwXorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_BitwXorContext::BITW_XOR() {
@@ -82950,13 +76728,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_BitwXor(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_BitwXorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_BitwXor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- UnaryModOp_BitwAndContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::UnaryModOp_BitwAndContext::BITW_AND() {
@@ -82975,13 +76746,6 @@
   if (parserListener != nullptr)
     parserListener->exitUnaryModOp_BitwAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::UnaryModOp_BitwAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnaryModOp_BitwAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Unary_module_path_operatorContext* SV3_1aParser::unary_module_path_operator() {
   Unary_module_path_operatorContext *_localctx = _tracker.createInstance<Unary_module_path_operatorContext>(_ctx, getState());
   enterRule(_localctx, 1254, SV3_1aParser::RuleUnary_module_path_operator);
@@ -83112,13 +76876,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_Equiv(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_EquivContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_Equiv(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_BitwXorContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_BitwXorContext::BITW_XOR() {
@@ -83137,13 +76894,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_BitwXor(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_BitwXorContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_BitwXor(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_LogicOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_LogicOrContext::LOGICAL_OR() {
@@ -83162,13 +76912,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_LogicOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_LogicOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_LogicOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_NotEqualContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_NotEqualContext::NOTEQUAL() {
@@ -83187,13 +76930,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_NotEqual(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_NotEqualContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_NotEqual(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_LogicAndContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_LogicAndContext::LOGICAL_AND() {
@@ -83212,13 +76948,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_LogicAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_LogicAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_LogicAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_BitwAndContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_BitwAndContext::BITW_AND() {
@@ -83237,13 +76966,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_BitwAnd(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_BitwAndContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_BitwAnd(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_BitwOrContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_BitwOrContext::BITW_OR() {
@@ -83262,13 +76984,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_BitwOr(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_BitwOrContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_BitwOr(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_ReductXnor1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_ReductXnor1Context::REDUCTION_XNOR1() {
@@ -83287,13 +77002,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_ReductXnor1(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_ReductXnor1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_ReductXnor1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- BinModOp_ReductXnor2Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::BinModOp_ReductXnor2Context::REDUCTION_XNOR2() {
@@ -83312,13 +77020,6 @@
   if (parserListener != nullptr)
     parserListener->exitBinModOp_ReductXnor2(this);
 }
-
-antlrcpp::Any SV3_1aParser::BinModOp_ReductXnor2Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBinModOp_ReductXnor2(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::Binary_module_path_operatorContext* SV3_1aParser::binary_module_path_operator() {
   Binary_module_path_operatorContext *_localctx = _tracker.createInstance<Binary_module_path_operatorContext>(_ctx, getState());
   enterRule(_localctx, 1256, SV3_1aParser::RuleBinary_module_path_operator);
@@ -83449,13 +77150,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_Real(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_RealContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_Real(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1Tickb0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1Tickb0Context::ONE_TICK_b0() {
@@ -83474,13 +77168,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1Tickb0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1Tickb0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1Tickb0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1TickB0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1TickB0Context::ONE_TICK_B0() {
@@ -83499,13 +77186,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1TickB0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1TickB0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1TickB0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1Tickb1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1Tickb1Context::ONE_TICK_b1() {
@@ -83524,13 +77204,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1Tickb1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1Tickb1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1Tickb1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1TickB1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1TickB1Context::ONE_TICK_B1() {
@@ -83549,13 +77222,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1TickB1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1TickB1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1TickB1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1TickbxContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1TickbxContext::ONE_TICK_bx() {
@@ -83574,13 +77240,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1Tickbx(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1TickbxContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1Tickbx(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1TickbXContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1TickbXContext::ONE_TICK_bX() {
@@ -83599,13 +77258,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1TickbX(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1TickbXContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1TickbX(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1TickBxContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1TickBxContext::ONE_TICK_Bx() {
@@ -83624,13 +77276,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1TickBx(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1TickBxContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1TickBx(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_1TickBXContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_1TickBXContext::ONE_TICK_BX() {
@@ -83649,13 +77294,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_1TickBX(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_1TickBXContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_1TickBX(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_IntegralContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_IntegralContext::Integral_number() {
@@ -83674,13 +77312,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_Integral(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_IntegralContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_Integral(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_Tick0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_Tick0Context::TICK_0() {
@@ -83699,13 +77330,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_Tick0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_Tick0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_Tick0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_Tick1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_Tick1Context::TICK_1() {
@@ -83724,13 +77348,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_Tick1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_Tick1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_Tick1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_Tickb0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_Tickb0Context::TICK_b0() {
@@ -83749,13 +77366,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_Tickb0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_Tickb0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_Tickb0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_TickB0Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_TickB0Context::TICK_B0() {
@@ -83774,13 +77384,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_TickB0(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_TickB0Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_TickB0(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_Tickb1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_Tickb1Context::TICK_b1() {
@@ -83799,13 +77402,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_Tickb1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_Tickb1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_Tickb1(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- Number_TickB1Context ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aParser::Number_TickB1Context::TICK_B1() {
@@ -83824,13 +77420,6 @@
   if (parserListener != nullptr)
     parserListener->exitNumber_TickB1(this);
 }
-
-antlrcpp::Any SV3_1aParser::Number_TickB1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNumber_TickB1(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aParser::NumberContext* SV3_1aParser::number() {
   NumberContext *_localctx = _tracker.createInstance<NumberContext>(_ctx, getState());
   enterRule(_localctx, 1258, SV3_1aParser::RuleNumber);
@@ -84023,14 +77612,6 @@
     parserListener->exitUnbased_unsized_literal(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Unbased_unsized_literalContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnbased_unsized_literal(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Unbased_unsized_literalContext* SV3_1aParser::unbased_unsized_literal() {
   Unbased_unsized_literalContext *_localctx = _tracker.createInstance<Unbased_unsized_literalContext>(_ctx, getState());
   enterRule(_localctx, 1260, SV3_1aParser::RuleUnbased_unsized_literal);
@@ -84126,14 +77707,6 @@
     parserListener->exitAttribute_instance(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Attribute_instanceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAttribute_instance(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Attribute_instanceContext* SV3_1aParser::attribute_instance() {
   Attribute_instanceContext *_localctx = _tracker.createInstance<Attribute_instanceContext>(_ctx, getState());
   enterRule(_localctx, 1262, SV3_1aParser::RuleAttribute_instance);
@@ -84208,14 +77781,6 @@
     parserListener->exitAttr_spec(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Attr_specContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAttr_spec(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Attr_specContext* SV3_1aParser::attr_spec() {
   Attr_specContext *_localctx = _tracker.createInstance<Attr_specContext>(_ctx, getState());
   enterRule(_localctx, 1264, SV3_1aParser::RuleAttr_spec);
@@ -84276,14 +77841,6 @@
     parserListener->exitAttr_name(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Attr_nameContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAttr_name(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Attr_nameContext* SV3_1aParser::attr_name() {
   Attr_nameContext *_localctx = _tracker.createInstance<Attr_nameContext>(_ctx, getState());
   enterRule(_localctx, 1266, SV3_1aParser::RuleAttr_name);
@@ -84509,14 +78066,6 @@
     parserListener->exitHierarchical_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Hierarchical_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitHierarchical_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Hierarchical_identifierContext* SV3_1aParser::hierarchical_identifier() {
   Hierarchical_identifierContext *_localctx = _tracker.createInstance<Hierarchical_identifierContext>(_ctx, getState());
   enterRule(_localctx, 1268, SV3_1aParser::RuleHierarchical_identifier);
@@ -84722,14 +78271,6 @@
     parserListener->exitIdentifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::IdentifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitIdentifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::IdentifierContext* SV3_1aParser::identifier() {
   IdentifierContext *_localctx = _tracker.createInstance<IdentifierContext>(_ctx, getState());
   enterRule(_localctx, 1270, SV3_1aParser::RuleIdentifier);
@@ -84845,14 +78386,6 @@
     parserListener->exitInterface_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Interface_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInterface_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Interface_identifierContext* SV3_1aParser::interface_identifier() {
   Interface_identifierContext *_localctx = _tracker.createInstance<Interface_identifierContext>(_ctx, getState());
   enterRule(_localctx, 1272, SV3_1aParser::RuleInterface_identifier);
@@ -84964,14 +78497,6 @@
     parserListener->exitPackage_scope(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Package_scopeContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPackage_scope(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Package_scopeContext* SV3_1aParser::package_scope() {
   Package_scopeContext *_localctx = _tracker.createInstance<Package_scopeContext>(_ctx, getState());
   enterRule(_localctx, 1274, SV3_1aParser::RulePackage_scope);
@@ -85080,14 +78605,6 @@
     parserListener->exitPs_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ps_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPs_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ps_identifierContext* SV3_1aParser::ps_identifier() {
   Ps_identifierContext *_localctx = _tracker.createInstance<Ps_identifierContext>(_ctx, getState());
   enterRule(_localctx, 1276, SV3_1aParser::RulePs_identifier);
@@ -85180,14 +78697,6 @@
     parserListener->exitPs_or_hierarchical_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ps_or_hierarchical_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPs_or_hierarchical_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ps_or_hierarchical_identifierContext* SV3_1aParser::ps_or_hierarchical_identifier() {
   Ps_or_hierarchical_identifierContext *_localctx = _tracker.createInstance<Ps_or_hierarchical_identifierContext>(_ctx, getState());
   enterRule(_localctx, 1278, SV3_1aParser::RulePs_or_hierarchical_identifier);
@@ -85315,14 +78824,6 @@
     parserListener->exitPs_or_hierarchical_array_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ps_or_hierarchical_array_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPs_or_hierarchical_array_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ps_or_hierarchical_array_identifierContext* SV3_1aParser::ps_or_hierarchical_array_identifier() {
   Ps_or_hierarchical_array_identifierContext *_localctx = _tracker.createInstance<Ps_or_hierarchical_array_identifierContext>(_ctx, getState());
   enterRule(_localctx, 1280, SV3_1aParser::RulePs_or_hierarchical_array_identifier);
@@ -85479,14 +78980,6 @@
     parserListener->exitPs_or_hierarchical_sequence_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ps_or_hierarchical_sequence_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPs_or_hierarchical_sequence_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ps_or_hierarchical_sequence_identifierContext* SV3_1aParser::ps_or_hierarchical_sequence_identifier() {
   Ps_or_hierarchical_sequence_identifierContext *_localctx = _tracker.createInstance<Ps_or_hierarchical_sequence_identifierContext>(_ctx, getState());
   enterRule(_localctx, 1282, SV3_1aParser::RulePs_or_hierarchical_sequence_identifier);
@@ -85612,14 +79105,6 @@
     parserListener->exitPs_type_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Ps_type_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPs_type_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Ps_type_identifierContext* SV3_1aParser::ps_type_identifier() {
   Ps_type_identifierContext *_localctx = _tracker.createInstance<Ps_type_identifierContext>(_ctx, getState());
   enterRule(_localctx, 1284, SV3_1aParser::RulePs_type_identifier);
@@ -85708,14 +79193,6 @@
     parserListener->exitSystem_task(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::System_taskContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSystem_task(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::System_taskContext* SV3_1aParser::system_task() {
   System_taskContext *_localctx = _tracker.createInstance<System_taskContext>(_ctx, getState());
   enterRule(_localctx, 1286, SV3_1aParser::RuleSystem_task);
@@ -85833,14 +79310,6 @@
     parserListener->exitSystem_task_names(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::System_task_namesContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSystem_task_names(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::System_task_namesContext* SV3_1aParser::system_task_names() {
   System_task_namesContext *_localctx = _tracker.createInstance<System_task_namesContext>(_ctx, getState());
   enterRule(_localctx, 1288, SV3_1aParser::RuleSystem_task_names);
@@ -86107,14 +79576,6 @@
     parserListener->exitTop_directives(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Top_directivesContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTop_directives(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Top_directivesContext* SV3_1aParser::top_directives() {
   Top_directivesContext *_localctx = _tracker.createInstance<Top_directivesContext>(_ctx, getState());
   enterRule(_localctx, 1290, SV3_1aParser::RuleTop_directives);
@@ -86464,14 +79925,6 @@
     parserListener->exitPragma_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pragma_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPragma_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pragma_directiveContext* SV3_1aParser::pragma_directive() {
   Pragma_directiveContext *_localctx = _tracker.createInstance<Pragma_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1292, SV3_1aParser::RulePragma_directive);
@@ -86563,14 +80016,6 @@
     parserListener->exitPragma_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pragma_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPragma_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pragma_expressionContext* SV3_1aParser::pragma_expression() {
   Pragma_expressionContext *_localctx = _tracker.createInstance<Pragma_expressionContext>(_ctx, getState());
   enterRule(_localctx, 1294, SV3_1aParser::RulePragma_expression);
@@ -86692,14 +80137,6 @@
     parserListener->exitPragma_value(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Pragma_valueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitPragma_value(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Pragma_valueContext* SV3_1aParser::pragma_value() {
   Pragma_valueContext *_localctx = _tracker.createInstance<Pragma_valueContext>(_ctx, getState());
   enterRule(_localctx, 1296, SV3_1aParser::RulePragma_value);
@@ -86832,14 +80269,6 @@
     parserListener->exitTimescale_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Timescale_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitTimescale_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Timescale_directiveContext* SV3_1aParser::timescale_directive() {
   Timescale_directiveContext *_localctx = _tracker.createInstance<Timescale_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1298, SV3_1aParser::RuleTimescale_directive);
@@ -86903,14 +80332,6 @@
     parserListener->exitBegin_keywords_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Begin_keywords_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitBegin_keywords_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Begin_keywords_directiveContext* SV3_1aParser::begin_keywords_directive() {
   Begin_keywords_directiveContext *_localctx = _tracker.createInstance<Begin_keywords_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1300, SV3_1aParser::RuleBegin_keywords_directive);
@@ -86962,14 +80383,6 @@
     parserListener->exitEnd_keywords_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::End_keywords_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnd_keywords_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::End_keywords_directiveContext* SV3_1aParser::end_keywords_directive() {
   End_keywords_directiveContext *_localctx = _tracker.createInstance<End_keywords_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1302, SV3_1aParser::RuleEnd_keywords_directive);
@@ -87031,14 +80444,6 @@
     parserListener->exitUnconnected_drive_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Unconnected_drive_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnconnected_drive_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Unconnected_drive_directiveContext* SV3_1aParser::unconnected_drive_directive() {
   Unconnected_drive_directiveContext *_localctx = _tracker.createInstance<Unconnected_drive_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1304, SV3_1aParser::RuleUnconnected_drive_directive);
@@ -87100,14 +80505,6 @@
     parserListener->exitNounconnected_drive_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Nounconnected_drive_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNounconnected_drive_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Nounconnected_drive_directiveContext* SV3_1aParser::nounconnected_drive_directive() {
   Nounconnected_drive_directiveContext *_localctx = _tracker.createInstance<Nounconnected_drive_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1306, SV3_1aParser::RuleNounconnected_drive_directive);
@@ -87165,14 +80562,6 @@
     parserListener->exitDefault_nettype_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Default_nettype_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_nettype_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Default_nettype_directiveContext* SV3_1aParser::default_nettype_directive() {
   Default_nettype_directiveContext *_localctx = _tracker.createInstance<Default_nettype_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1308, SV3_1aParser::RuleDefault_nettype_directive);
@@ -87251,14 +80640,6 @@
     parserListener->exitUselib_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Uselib_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUselib_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Uselib_directiveContext* SV3_1aParser::uselib_directive() {
   Uselib_directiveContext *_localctx = _tracker.createInstance<Uselib_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1310, SV3_1aParser::RuleUselib_directive);
@@ -87308,14 +80689,6 @@
     parserListener->exitCelldefine_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Celldefine_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCelldefine_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Celldefine_directiveContext* SV3_1aParser::celldefine_directive() {
   Celldefine_directiveContext *_localctx = _tracker.createInstance<Celldefine_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1312, SV3_1aParser::RuleCelldefine_directive);
@@ -87365,14 +80738,6 @@
     parserListener->exitEndcelldefine_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Endcelldefine_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndcelldefine_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Endcelldefine_directiveContext* SV3_1aParser::endcelldefine_directive() {
   Endcelldefine_directiveContext *_localctx = _tracker.createInstance<Endcelldefine_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1314, SV3_1aParser::RuleEndcelldefine_directive);
@@ -87422,14 +80787,6 @@
     parserListener->exitProtect_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Protect_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProtect_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Protect_directiveContext* SV3_1aParser::protect_directive() {
   Protect_directiveContext *_localctx = _tracker.createInstance<Protect_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1316, SV3_1aParser::RuleProtect_directive);
@@ -87479,14 +80836,6 @@
     parserListener->exitEndprotect_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Endprotect_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndprotect_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Endprotect_directiveContext* SV3_1aParser::endprotect_directive() {
   Endprotect_directiveContext *_localctx = _tracker.createInstance<Endprotect_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1318, SV3_1aParser::RuleEndprotect_directive);
@@ -87536,14 +80885,6 @@
     parserListener->exitProtected_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Protected_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitProtected_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Protected_directiveContext* SV3_1aParser::protected_directive() {
   Protected_directiveContext *_localctx = _tracker.createInstance<Protected_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1320, SV3_1aParser::RuleProtected_directive);
@@ -87593,14 +80934,6 @@
     parserListener->exitEndprotected_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Endprotected_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndprotected_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Endprotected_directiveContext* SV3_1aParser::endprotected_directive() {
   Endprotected_directiveContext *_localctx = _tracker.createInstance<Endprotected_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1322, SV3_1aParser::RuleEndprotected_directive);
@@ -87650,14 +80983,6 @@
     parserListener->exitExpand_vectornets_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Expand_vectornets_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitExpand_vectornets_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Expand_vectornets_directiveContext* SV3_1aParser::expand_vectornets_directive() {
   Expand_vectornets_directiveContext *_localctx = _tracker.createInstance<Expand_vectornets_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1324, SV3_1aParser::RuleExpand_vectornets_directive);
@@ -87707,14 +81032,6 @@
     parserListener->exitNoexpand_vectornets_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Noexpand_vectornets_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNoexpand_vectornets_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Noexpand_vectornets_directiveContext* SV3_1aParser::noexpand_vectornets_directive() {
   Noexpand_vectornets_directiveContext *_localctx = _tracker.createInstance<Noexpand_vectornets_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1326, SV3_1aParser::RuleNoexpand_vectornets_directive);
@@ -87764,14 +81081,6 @@
     parserListener->exitAutoexpand_vectornets_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Autoexpand_vectornets_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAutoexpand_vectornets_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Autoexpand_vectornets_directiveContext* SV3_1aParser::autoexpand_vectornets_directive() {
   Autoexpand_vectornets_directiveContext *_localctx = _tracker.createInstance<Autoexpand_vectornets_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1328, SV3_1aParser::RuleAutoexpand_vectornets_directive);
@@ -87821,14 +81130,6 @@
     parserListener->exitDisable_portfaults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Disable_portfaults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDisable_portfaults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Disable_portfaults_directiveContext* SV3_1aParser::disable_portfaults_directive() {
   Disable_portfaults_directiveContext *_localctx = _tracker.createInstance<Disable_portfaults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1330, SV3_1aParser::RuleDisable_portfaults_directive);
@@ -87878,14 +81179,6 @@
     parserListener->exitEnable_portfaults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Enable_portfaults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEnable_portfaults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Enable_portfaults_directiveContext* SV3_1aParser::enable_portfaults_directive() {
   Enable_portfaults_directiveContext *_localctx = _tracker.createInstance<Enable_portfaults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1332, SV3_1aParser::RuleEnable_portfaults_directive);
@@ -87935,14 +81228,6 @@
     parserListener->exitNosuppress_faults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Nosuppress_faults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNosuppress_faults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Nosuppress_faults_directiveContext* SV3_1aParser::nosuppress_faults_directive() {
   Nosuppress_faults_directiveContext *_localctx = _tracker.createInstance<Nosuppress_faults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1334, SV3_1aParser::RuleNosuppress_faults_directive);
@@ -87992,14 +81277,6 @@
     parserListener->exitSuppress_faults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Suppress_faults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSuppress_faults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Suppress_faults_directiveContext* SV3_1aParser::suppress_faults_directive() {
   Suppress_faults_directiveContext *_localctx = _tracker.createInstance<Suppress_faults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1336, SV3_1aParser::RuleSuppress_faults_directive);
@@ -88049,14 +81326,6 @@
     parserListener->exitSigned_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Signed_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSigned_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Signed_directiveContext* SV3_1aParser::signed_directive() {
   Signed_directiveContext *_localctx = _tracker.createInstance<Signed_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1338, SV3_1aParser::RuleSigned_directive);
@@ -88106,14 +81375,6 @@
     parserListener->exitUnsigned_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Unsigned_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUnsigned_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Unsigned_directiveContext* SV3_1aParser::unsigned_directive() {
   Unsigned_directiveContext *_localctx = _tracker.createInstance<Unsigned_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1340, SV3_1aParser::RuleUnsigned_directive);
@@ -88163,14 +81424,6 @@
     parserListener->exitRemove_gatename_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Remove_gatename_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRemove_gatename_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Remove_gatename_directiveContext* SV3_1aParser::remove_gatename_directive() {
   Remove_gatename_directiveContext *_localctx = _tracker.createInstance<Remove_gatename_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1342, SV3_1aParser::RuleRemove_gatename_directive);
@@ -88220,14 +81473,6 @@
     parserListener->exitNoremove_gatenames_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Noremove_gatenames_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNoremove_gatenames_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Noremove_gatenames_directiveContext* SV3_1aParser::noremove_gatenames_directive() {
   Noremove_gatenames_directiveContext *_localctx = _tracker.createInstance<Noremove_gatenames_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1344, SV3_1aParser::RuleNoremove_gatenames_directive);
@@ -88277,14 +81522,6 @@
     parserListener->exitRemove_netname_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Remove_netname_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitRemove_netname_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Remove_netname_directiveContext* SV3_1aParser::remove_netname_directive() {
   Remove_netname_directiveContext *_localctx = _tracker.createInstance<Remove_netname_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1346, SV3_1aParser::RuleRemove_netname_directive);
@@ -88334,14 +81571,6 @@
     parserListener->exitNoremove_netnames_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Noremove_netnames_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNoremove_netnames_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Noremove_netnames_directiveContext* SV3_1aParser::noremove_netnames_directive() {
   Noremove_netnames_directiveContext *_localctx = _tracker.createInstance<Noremove_netnames_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1348, SV3_1aParser::RuleNoremove_netnames_directive);
@@ -88391,14 +81620,6 @@
     parserListener->exitAccelerate_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Accelerate_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitAccelerate_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Accelerate_directiveContext* SV3_1aParser::accelerate_directive() {
   Accelerate_directiveContext *_localctx = _tracker.createInstance<Accelerate_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1350, SV3_1aParser::RuleAccelerate_directive);
@@ -88448,14 +81669,6 @@
     parserListener->exitNoaccelerate_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Noaccelerate_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitNoaccelerate_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Noaccelerate_directiveContext* SV3_1aParser::noaccelerate_directive() {
   Noaccelerate_directiveContext *_localctx = _tracker.createInstance<Noaccelerate_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1352, SV3_1aParser::RuleNoaccelerate_directive);
@@ -88509,14 +81722,6 @@
     parserListener->exitDefault_trireg_strenght_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Default_trireg_strenght_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_trireg_strenght_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Default_trireg_strenght_directiveContext* SV3_1aParser::default_trireg_strenght_directive() {
   Default_trireg_strenght_directiveContext *_localctx = _tracker.createInstance<Default_trireg_strenght_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1354, SV3_1aParser::RuleDefault_trireg_strenght_directive);
@@ -88576,14 +81781,6 @@
     parserListener->exitDefault_decay_time_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Default_decay_time_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_decay_time_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Default_decay_time_directiveContext* SV3_1aParser::default_decay_time_directive() {
   Default_decay_time_directiveContext *_localctx = _tracker.createInstance<Default_decay_time_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1356, SV3_1aParser::RuleDefault_decay_time_directive);
@@ -88666,14 +81863,6 @@
     parserListener->exitDelay_mode_distributed_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay_mode_distributed_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_distributed_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay_mode_distributed_directiveContext* SV3_1aParser::delay_mode_distributed_directive() {
   Delay_mode_distributed_directiveContext *_localctx = _tracker.createInstance<Delay_mode_distributed_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1358, SV3_1aParser::RuleDelay_mode_distributed_directive);
@@ -88723,14 +81912,6 @@
     parserListener->exitDelay_mode_path_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay_mode_path_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_path_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay_mode_path_directiveContext* SV3_1aParser::delay_mode_path_directive() {
   Delay_mode_path_directiveContext *_localctx = _tracker.createInstance<Delay_mode_path_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1360, SV3_1aParser::RuleDelay_mode_path_directive);
@@ -88780,14 +81961,6 @@
     parserListener->exitDelay_mode_unit_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay_mode_unit_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_unit_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay_mode_unit_directiveContext* SV3_1aParser::delay_mode_unit_directive() {
   Delay_mode_unit_directiveContext *_localctx = _tracker.createInstance<Delay_mode_unit_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1362, SV3_1aParser::RuleDelay_mode_unit_directive);
@@ -88837,14 +82010,6 @@
     parserListener->exitDelay_mode_zero_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Delay_mode_zero_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_zero_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Delay_mode_zero_directiveContext* SV3_1aParser::delay_mode_zero_directive() {
   Delay_mode_zero_directiveContext *_localctx = _tracker.createInstance<Delay_mode_zero_directiveContext>(_ctx, getState());
   enterRule(_localctx, 1364, SV3_1aParser::RuleDelay_mode_zero_directive);
@@ -88894,14 +82059,6 @@
     parserListener->exitSurelog_macro_not_defined(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Surelog_macro_not_definedContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSurelog_macro_not_defined(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Surelog_macro_not_definedContext* SV3_1aParser::surelog_macro_not_defined() {
   Surelog_macro_not_definedContext *_localctx = _tracker.createInstance<Surelog_macro_not_definedContext>(_ctx, getState());
   enterRule(_localctx, 1366, SV3_1aParser::RuleSurelog_macro_not_defined);
@@ -88963,14 +82120,6 @@
     parserListener->exitSlline(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::SllineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitSlline(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::SllineContext* SV3_1aParser::slline() {
   SllineContext *_localctx = _tracker.createInstance<SllineContext>(_ctx, getState());
   enterRule(_localctx, 1368, SV3_1aParser::RuleSlline);
@@ -89026,14 +82175,6 @@
     parserListener->exitEndconfig(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::EndconfigContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitEndconfig(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::EndconfigContext* SV3_1aParser::endconfig() {
   EndconfigContext *_localctx = _tracker.createInstance<EndconfigContext>(_ctx, getState());
   enterRule(_localctx, 1370, SV3_1aParser::RuleEndconfig);
@@ -89127,14 +82268,6 @@
     parserListener->exitConfig_declaration(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Config_declarationContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConfig_declaration(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Config_declarationContext* SV3_1aParser::config_declaration() {
   Config_declarationContext *_localctx = _tracker.createInstance<Config_declarationContext>(_ctx, getState());
   enterRule(_localctx, 1372, SV3_1aParser::RuleConfig_declaration);
@@ -89248,14 +82381,6 @@
     parserListener->exitDesign_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Design_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDesign_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Design_statementContext* SV3_1aParser::design_statement() {
   Design_statementContext *_localctx = _tracker.createInstance<Design_statementContext>(_ctx, getState());
   enterRule(_localctx, 1374, SV3_1aParser::RuleDesign_statement);
@@ -89373,14 +82498,6 @@
     parserListener->exitConfig_rule_statement(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Config_rule_statementContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitConfig_rule_statement(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Config_rule_statementContext* SV3_1aParser::config_rule_statement() {
   Config_rule_statementContext *_localctx = _tracker.createInstance<Config_rule_statementContext>(_ctx, getState());
   enterRule(_localctx, 1376, SV3_1aParser::RuleConfig_rule_statement);
@@ -89508,14 +82625,6 @@
     parserListener->exitDefault_clause(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Default_clauseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_clause(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Default_clauseContext* SV3_1aParser::default_clause() {
   Default_clauseContext *_localctx = _tracker.createInstance<Default_clauseContext>(_ctx, getState());
   enterRule(_localctx, 1378, SV3_1aParser::RuleDefault_clause);
@@ -89569,14 +82678,6 @@
     parserListener->exitInst_clause(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Inst_clauseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInst_clause(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Inst_clauseContext* SV3_1aParser::inst_clause() {
   Inst_clauseContext *_localctx = _tracker.createInstance<Inst_clauseContext>(_ctx, getState());
   enterRule(_localctx, 1380, SV3_1aParser::RuleInst_clause);
@@ -89640,14 +82741,6 @@
     parserListener->exitInst_name(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Inst_nameContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitInst_name(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Inst_nameContext* SV3_1aParser::inst_name() {
   Inst_nameContext *_localctx = _tracker.createInstance<Inst_nameContext>(_ctx, getState());
   enterRule(_localctx, 1382, SV3_1aParser::RuleInst_name);
@@ -89722,14 +82815,6 @@
     parserListener->exitCell_clause(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Cell_clauseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitCell_clause(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Cell_clauseContext* SV3_1aParser::cell_clause() {
   Cell_clauseContext *_localctx = _tracker.createInstance<Cell_clauseContext>(_ctx, getState());
   enterRule(_localctx, 1384, SV3_1aParser::RuleCell_clause);
@@ -89802,14 +82887,6 @@
     parserListener->exitLiblist_clause(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Liblist_clauseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitLiblist_clause(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Liblist_clauseContext* SV3_1aParser::liblist_clause() {
   Liblist_clauseContext *_localctx = _tracker.createInstance<Liblist_clauseContext>(_ctx, getState());
   enterRule(_localctx, 1386, SV3_1aParser::RuleLiblist_clause);
@@ -89924,14 +83001,6 @@
     parserListener->exitUse_clause_config(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Use_clause_configContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUse_clause_config(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Use_clause_configContext* SV3_1aParser::use_clause_config() {
   Use_clause_configContext *_localctx = _tracker.createInstance<Use_clause_configContext>(_ctx, getState());
   enterRule(_localctx, 1388, SV3_1aParser::RuleUse_clause_config);
@@ -90106,14 +83175,6 @@
     parserListener->exitUse_clause(this);
 }
 
-
-antlrcpp::Any SV3_1aParser::Use_clauseContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aParserVisitor*>(visitor))
-    return parserVisitor->visitUse_clause(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aParser::Use_clauseContext* SV3_1aParser::use_clause() {
   Use_clauseContext *_localctx = _tracker.createInstance<Use_clauseContext>(_ctx, getState());
   enterRule(_localctx, 1390, SV3_1aParser::RuleUse_clause);
diff --git a/src/parser/SV3_1aParser.h b/src/parser/SV3_1aParser.h
index 469b33e..692a631 100644
--- a/src/parser/SV3_1aParser.h
+++ b/src/parser/SV3_1aParser.h
@@ -1080,8 +1080,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1097,8 +1095,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1113,8 +1109,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1131,8 +1125,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1153,8 +1145,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1179,8 +1169,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1196,8 +1184,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1213,8 +1199,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1227,8 +1211,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1253,8 +1235,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1277,8 +1257,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1301,8 +1279,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1336,8 +1312,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1351,8 +1325,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1367,8 +1339,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1389,8 +1359,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1411,8 +1379,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1444,8 +1410,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1459,8 +1423,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1480,8 +1442,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1502,8 +1462,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1517,8 +1475,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1544,8 +1500,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1578,8 +1532,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1593,8 +1545,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1628,8 +1578,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1643,8 +1591,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1659,8 +1605,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1688,8 +1632,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1709,8 +1651,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1726,8 +1666,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1741,8 +1679,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1766,8 +1702,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1797,8 +1731,6 @@
     antlr4::tree::TerminalNode *SEMICOLUMN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TimeUnitsDecl_TimePrecisionTimeUnitContext : public Timeunits_declarationContext {
@@ -1813,8 +1745,6 @@
     antlr4::tree::TerminalNode *TIMEUNIT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TimeUnitsDecl_TimeUnitTimePrecisionContext : public Timeunits_declarationContext {
@@ -1829,8 +1759,6 @@
     antlr4::tree::TerminalNode *TIMEPRECISION();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TimeUnitsDecl_TimeUnitContext : public Timeunits_declarationContext {
@@ -1842,8 +1770,6 @@
     antlr4::tree::TerminalNode *SEMICOLUMN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TimeUnitsDecl_TimePrecisionContext : public Timeunits_declarationContext {
@@ -1855,8 +1781,6 @@
     antlr4::tree::TerminalNode *SEMICOLUMN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Timeunits_declarationContext* timeunits_declaration();
@@ -1876,8 +1800,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1896,8 +1818,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1916,8 +1836,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1938,8 +1856,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1959,8 +1875,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1978,8 +1892,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1996,8 +1908,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2012,8 +1922,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2039,8 +1947,6 @@
     antlr4::tree::TerminalNode *INPUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PortDir_OutContext : public Port_directionContext {
@@ -2050,8 +1956,6 @@
     antlr4::tree::TerminalNode *OUTPUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PortDir_RefContext : public Port_directionContext {
@@ -2061,8 +1965,6 @@
     antlr4::tree::TerminalNode *REF();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PortDir_InoutContext : public Port_directionContext {
@@ -2072,8 +1974,6 @@
     antlr4::tree::TerminalNode *INOUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Port_directionContext* port_direction();
@@ -2087,8 +1987,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2103,8 +2001,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2121,8 +2017,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2149,8 +2043,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2171,8 +2063,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2199,8 +2089,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2216,8 +2104,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2237,8 +2123,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2261,8 +2145,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2287,8 +2169,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2304,8 +2184,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2332,8 +2210,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2350,8 +2226,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2374,8 +2248,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2393,8 +2265,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2410,8 +2280,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2433,8 +2301,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2450,8 +2316,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2475,8 +2339,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2493,8 +2355,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2510,8 +2370,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2534,8 +2392,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2555,8 +2411,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2587,8 +2441,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2605,8 +2457,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2631,8 +2481,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2656,8 +2504,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2672,8 +2518,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2687,8 +2531,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2713,8 +2555,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2732,8 +2572,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2748,8 +2586,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2775,8 +2611,6 @@
     antlr4::tree::TerminalNode *STATIC();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  ClassItemQualifier_LocalContext : public Class_item_qualifierContext {
@@ -2786,8 +2620,6 @@
     antlr4::tree::TerminalNode *LOCAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  ClassItemQualifier_ProtectedContext : public Class_item_qualifierContext {
@@ -2797,8 +2629,6 @@
     antlr4::tree::TerminalNode *PROTECTED();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Class_item_qualifierContext* class_item_qualifier();
@@ -2823,8 +2653,6 @@
     Class_item_qualifierContext *class_item_qualifier();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PropQualifier_RandContext : public Property_qualifierContext {
@@ -2834,8 +2662,6 @@
     antlr4::tree::TerminalNode *RAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PropQualifier_RandcContext : public Property_qualifierContext {
@@ -2845,8 +2671,6 @@
     antlr4::tree::TerminalNode *RANDC();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Property_qualifierContext* property_qualifier();
@@ -2871,8 +2695,6 @@
     antlr4::tree::TerminalNode *VIRTUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  MethodQualifier_ClassItemContext : public Method_qualifierContext {
@@ -2882,8 +2704,6 @@
     Class_item_qualifierContext *class_item_qualifier();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Method_qualifierContext* method_qualifier();
@@ -2897,8 +2717,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2914,8 +2732,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2947,8 +2763,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2965,8 +2779,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2983,8 +2795,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3003,8 +2813,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3021,8 +2829,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3049,8 +2855,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3082,8 +2886,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3100,8 +2902,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3118,8 +2918,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3136,8 +2934,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3152,8 +2948,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3180,8 +2974,6 @@
     ExpressionContext *expression();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  DistWeight_AssignRangeContext : public Dist_weightContext {
@@ -3193,8 +2985,6 @@
     ExpressionContext *expression();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Dist_weightContext* dist_weight();
@@ -3212,8 +3002,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3231,8 +3019,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3249,8 +3035,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3268,8 +3052,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3298,8 +3080,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3317,8 +3097,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3338,8 +3116,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3356,8 +3132,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3375,8 +3149,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3393,8 +3165,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3410,8 +3180,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3429,8 +3197,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3448,8 +3214,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3466,8 +3230,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3483,8 +3245,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3504,8 +3264,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3524,8 +3282,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3544,8 +3300,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3562,8 +3316,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3582,8 +3334,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3599,8 +3349,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3631,8 +3379,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3660,8 +3406,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3675,8 +3419,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3690,8 +3432,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3705,8 +3445,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3720,8 +3458,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3736,8 +3472,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3758,8 +3492,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3785,8 +3517,6 @@
     antlr4::tree::TerminalNode *STATIC();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Lifetime_AutomaticContext : public LifetimeContext {
@@ -3796,8 +3526,6 @@
     antlr4::tree::TerminalNode *AUTOMATIC();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   LifetimeContext* lifetime();
@@ -3818,8 +3546,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3866,8 +3592,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3881,8 +3605,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3896,8 +3618,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3911,8 +3631,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3926,8 +3644,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3941,8 +3657,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3956,8 +3670,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3974,8 +3686,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3991,8 +3701,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4010,8 +3718,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4032,8 +3738,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4048,8 +3752,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4074,8 +3776,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4090,8 +3790,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4117,8 +3815,6 @@
     antlr4::tree::TerminalNode *SHORTINT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  IntegerAtomType_IntContext : public Integer_atom_typeContext {
@@ -4129,8 +3825,6 @@
     antlr4::tree::TerminalNode *INTEGER();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  IntegerAtomType_TimeContext : public Integer_atom_typeContext {
@@ -4140,8 +3834,6 @@
     antlr4::tree::TerminalNode *TIME();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  IntegerAtomType_ByteContext : public Integer_atom_typeContext {
@@ -4151,8 +3843,6 @@
     antlr4::tree::TerminalNode *BYTE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  IntegerAtomType_LongIntContext : public Integer_atom_typeContext {
@@ -4162,8 +3852,6 @@
     antlr4::tree::TerminalNode *LONGINT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Integer_atom_typeContext* integer_atom_type();
@@ -4188,8 +3876,6 @@
     antlr4::tree::TerminalNode *BIT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  IntVec_TypeRegContext : public Integer_vector_typeContext {
@@ -4199,8 +3885,6 @@
     antlr4::tree::TerminalNode *REG();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  IntVec_TypeLogicContext : public Integer_vector_typeContext {
@@ -4210,8 +3894,6 @@
     antlr4::tree::TerminalNode *LOGIC();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Integer_vector_typeContext* integer_vector_type();
@@ -4236,8 +3918,6 @@
     antlr4::tree::TerminalNode *REALTIME();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NonIntType_ShortRealContext : public Non_integer_typeContext {
@@ -4247,8 +3927,6 @@
     antlr4::tree::TerminalNode *SHORTREAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NonIntType_RealContext : public Non_integer_typeContext {
@@ -4258,8 +3936,6 @@
     antlr4::tree::TerminalNode *REAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Non_integer_typeContext* non_integer_type();
@@ -4284,8 +3960,6 @@
     antlr4::tree::TerminalNode *SUPPLY0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_WireContext : public Net_typeContext {
@@ -4295,8 +3969,6 @@
     antlr4::tree::TerminalNode *WIRE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_Supply1Context : public Net_typeContext {
@@ -4306,8 +3978,6 @@
     antlr4::tree::TerminalNode *SUPPLY1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_WandContext : public Net_typeContext {
@@ -4317,8 +3987,6 @@
     antlr4::tree::TerminalNode *WAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_Tri1Context : public Net_typeContext {
@@ -4328,8 +3996,6 @@
     antlr4::tree::TerminalNode *TRI1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_Tri0Context : public Net_typeContext {
@@ -4339,8 +4005,6 @@
     antlr4::tree::TerminalNode *TRI0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_TriOrContext : public Net_typeContext {
@@ -4350,8 +4014,6 @@
     antlr4::tree::TerminalNode *TRIOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_TriContext : public Net_typeContext {
@@ -4361,8 +4023,6 @@
     antlr4::tree::TerminalNode *TRI();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_TriRegContext : public Net_typeContext {
@@ -4372,8 +4032,6 @@
     antlr4::tree::TerminalNode *TRIREG();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_WorContext : public Net_typeContext {
@@ -4383,8 +4041,6 @@
     antlr4::tree::TerminalNode *WOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_UwireContext : public Net_typeContext {
@@ -4394,8 +4050,6 @@
     antlr4::tree::TerminalNode *UWIRE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NetType_TriAndContext : public Net_typeContext {
@@ -4405,8 +4059,6 @@
     antlr4::tree::TerminalNode *TRIAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Net_typeContext* net_type();
@@ -4423,8 +4075,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4441,8 +4091,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4458,8 +4106,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4485,8 +4131,6 @@
     antlr4::tree::TerminalNode *UNSIGNED();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Signing_SignedContext : public SigningContext {
@@ -4496,8 +4140,6 @@
     antlr4::tree::TerminalNode *SIGNED();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   SigningContext* signing();
@@ -4512,8 +4154,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4539,8 +4179,6 @@
     antlr4::tree::TerminalNode *RANDC();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  RandomQualifier_RandContext : public Random_qualifierContext {
@@ -4550,8 +4188,6 @@
     antlr4::tree::TerminalNode *RAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Random_qualifierContext* random_qualifier();
@@ -4569,8 +4205,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4585,8 +4219,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4602,8 +4234,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4617,8 +4247,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4636,8 +4264,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4657,8 +4283,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4684,8 +4308,6 @@
     antlr4::tree::TerminalNode *WEAK0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Strength0_Strong0Context : public Strength0Context {
@@ -4695,8 +4317,6 @@
     antlr4::tree::TerminalNode *STRONG0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Strength0_Pull0Context : public Strength0Context {
@@ -4706,8 +4326,6 @@
     antlr4::tree::TerminalNode *PULL0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Strength0_Supply0Context : public Strength0Context {
@@ -4717,8 +4335,6 @@
     antlr4::tree::TerminalNode *SUPPLY0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Strength0Context* strength0();
@@ -4743,8 +4359,6 @@
     antlr4::tree::TerminalNode *SUPPLY1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Strength1_Strong1Context : public Strength1Context {
@@ -4754,8 +4368,6 @@
     antlr4::tree::TerminalNode *STRONG1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Strength1_Pull1Context : public Strength1Context {
@@ -4765,8 +4377,6 @@
     antlr4::tree::TerminalNode *PULL1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Strength1_Weak1Context : public Strength1Context {
@@ -4776,8 +4386,6 @@
     antlr4::tree::TerminalNode *WEAK1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Strength1Context* strength1();
@@ -4802,8 +4410,6 @@
     antlr4::tree::TerminalNode *SMALL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  ChargeStrength_MediumContext : public Charge_strengthContext {
@@ -4813,8 +4419,6 @@
     antlr4::tree::TerminalNode *MEDIUM();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  ChargeStrength_LargeContext : public Charge_strengthContext {
@@ -4824,8 +4428,6 @@
     antlr4::tree::TerminalNode *LARGE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Charge_strengthContext* charge_strength();
@@ -4845,8 +4447,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4866,8 +4466,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4884,8 +4482,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4904,8 +4500,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4922,8 +4516,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4942,8 +4534,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4960,8 +4550,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4978,8 +4566,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -4998,8 +4584,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5016,8 +4600,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5040,8 +4622,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5062,8 +4642,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5080,8 +4658,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5100,8 +4676,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5124,8 +4698,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5144,8 +4716,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5161,8 +4731,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5180,8 +4748,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5199,8 +4765,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5217,8 +4781,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5243,8 +4805,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5269,8 +4829,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5289,8 +4847,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5310,8 +4866,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5328,8 +4882,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5346,8 +4898,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5364,8 +4914,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5382,8 +4930,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5401,8 +4947,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5417,8 +4961,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5433,8 +4975,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5451,8 +4991,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5468,8 +5006,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5483,8 +5019,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5515,8 +5049,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5535,8 +5067,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5561,8 +5091,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5576,8 +5104,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5592,8 +5118,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5608,8 +5132,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5623,8 +5145,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5640,8 +5160,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5655,8 +5173,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5686,8 +5202,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5702,8 +5216,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5720,8 +5232,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5744,8 +5254,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5771,8 +5279,6 @@
     antlr4::tree::TerminalNode *REF();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TfPortDir_ConstRefContext : public Tf_port_directionContext {
@@ -5783,8 +5289,6 @@
     antlr4::tree::TerminalNode *REF();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TfPortDir_OutContext : public Tf_port_directionContext {
@@ -5794,8 +5298,6 @@
     antlr4::tree::TerminalNode *OUTPUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TfPortDir_InpContext : public Tf_port_directionContext {
@@ -5805,8 +5307,6 @@
     antlr4::tree::TerminalNode *INPUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TfPortDir_InoutContext : public Tf_port_directionContext {
@@ -5816,8 +5316,6 @@
     antlr4::tree::TerminalNode *INOUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Tf_port_directionContext* tf_port_direction();
@@ -5836,8 +5334,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5855,8 +5351,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5876,8 +5370,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5899,8 +5391,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -5926,8 +5416,6 @@
     antlr4::tree::TerminalNode *MINUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_GreaterEqualContext : public Overload_operatorContext {
@@ -5937,8 +5425,6 @@
     antlr4::tree::TerminalNode *GREATER_EQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_LessContext : public Overload_operatorContext {
@@ -5948,8 +5434,6 @@
     antlr4::tree::TerminalNode *LESS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_PercentContext : public Overload_operatorContext {
@@ -5959,8 +5443,6 @@
     antlr4::tree::TerminalNode *PERCENT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_NotEqualContext : public Overload_operatorContext {
@@ -5970,8 +5452,6 @@
     antlr4::tree::TerminalNode *NOTEQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_MultContext : public Overload_operatorContext {
@@ -5981,8 +5461,6 @@
     antlr4::tree::TerminalNode *STAR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_EquivContext : public Overload_operatorContext {
@@ -5992,8 +5470,6 @@
     antlr4::tree::TerminalNode *EQUIV();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_EqualContext : public Overload_operatorContext {
@@ -6003,8 +5479,6 @@
     antlr4::tree::TerminalNode *ASSIGN_OP();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_LessEqualContext : public Overload_operatorContext {
@@ -6014,8 +5488,6 @@
     antlr4::tree::TerminalNode *LESS_EQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_PlusPlusContext : public Overload_operatorContext {
@@ -6025,8 +5497,6 @@
     antlr4::tree::TerminalNode *PLUSPLUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_GreaterContext : public Overload_operatorContext {
@@ -6036,8 +5506,6 @@
     antlr4::tree::TerminalNode *GREATER();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_MinusMinusContext : public Overload_operatorContext {
@@ -6047,8 +5515,6 @@
     antlr4::tree::TerminalNode *MINUSMINUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_StarStarContext : public Overload_operatorContext {
@@ -6058,8 +5524,6 @@
     antlr4::tree::TerminalNode *STARSTAR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_PlusContext : public Overload_operatorContext {
@@ -6069,8 +5533,6 @@
     antlr4::tree::TerminalNode *PLUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  OverloadOp_DivContext : public Overload_operatorContext {
@@ -6080,8 +5542,6 @@
     antlr4::tree::TerminalNode *DIV();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Overload_operatorContext* overload_operator();
@@ -6097,8 +5557,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6116,8 +5574,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6137,8 +5593,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6158,8 +5612,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6177,8 +5629,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6197,8 +5647,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6217,8 +5665,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6237,8 +5683,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6253,8 +5697,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6271,8 +5713,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6290,8 +5730,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6310,8 +5748,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6330,8 +5766,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6350,8 +5784,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6369,8 +5801,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6395,8 +5825,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6415,8 +5843,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6433,8 +5859,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6449,8 +5873,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6465,8 +5887,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6482,8 +5902,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6497,8 +5915,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6524,8 +5940,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6540,8 +5954,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6561,8 +5973,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6576,8 +5986,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6634,8 +6042,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6656,8 +6062,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6671,8 +6075,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6698,8 +6100,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6733,8 +6133,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6754,8 +6152,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6771,8 +6167,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6788,8 +6182,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6815,8 +6207,6 @@
     Data_type_or_implicitContext *data_type_or_implicit();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  SeqFormatType_UntypedContext : public Sequence_formal_typeContext {
@@ -6826,8 +6216,6 @@
     antlr4::tree::TerminalNode *UNTYPED();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  SeqFormatType_SequenceContext : public Sequence_formal_typeContext {
@@ -6837,8 +6225,6 @@
     antlr4::tree::TerminalNode *SEQUENCE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Sequence_formal_typeContext* sequence_formal_type();
@@ -6854,8 +6240,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6880,8 +6264,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6896,8 +6278,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6913,8 +6293,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6931,8 +6309,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6957,8 +6333,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6973,8 +6347,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -6990,8 +6362,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7007,8 +6377,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7024,8 +6392,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7041,8 +6407,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7057,8 +6421,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7075,8 +6437,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7094,8 +6454,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7111,8 +6469,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7133,8 +6489,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7151,8 +6505,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7173,8 +6525,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7189,8 +6539,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7204,8 +6552,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7230,8 +6576,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7249,8 +6593,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7268,8 +6610,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7284,8 +6624,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7307,8 +6645,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7322,8 +6658,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7342,8 +6676,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7369,8 +6701,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7392,8 +6722,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7414,8 +6742,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7451,8 +6777,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7478,8 +6802,6 @@
     antlr4::tree::TerminalNode *IGNORE_BINS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Bins_BinsContext : public Bins_keywordContext {
@@ -7489,8 +6811,6 @@
     antlr4::tree::TerminalNode *BINS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Bins_IllegalContext : public Bins_keywordContext {
@@ -7500,8 +6820,6 @@
     antlr4::tree::TerminalNode *ILLEGAL_BINS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Bins_keywordContext* bins_keyword();
@@ -7517,8 +6835,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7539,8 +6855,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7557,8 +6871,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7577,8 +6889,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7594,8 +6904,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7617,8 +6925,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7635,8 +6941,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7650,8 +6954,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7668,8 +6970,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7685,8 +6985,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7703,8 +7001,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7725,8 +7021,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7752,8 +7046,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7774,8 +7066,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7791,8 +7081,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7809,8 +7097,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7856,8 +7142,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7878,8 +7162,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7900,8 +7182,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7922,8 +7202,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7944,8 +7222,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7966,8 +7242,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -7986,8 +7260,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8008,8 +7280,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8026,8 +7296,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8057,8 +7325,6 @@
     antlr4::tree::TerminalNode *CLOSE_PARENS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PulldownStrength_10Context : public Pulldown_strengthContext {
@@ -8072,8 +7338,6 @@
     antlr4::tree::TerminalNode *CLOSE_PARENS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PulldownStrength_0Context : public Pulldown_strengthContext {
@@ -8085,8 +7349,6 @@
     antlr4::tree::TerminalNode *CLOSE_PARENS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Pulldown_strengthContext* pulldown_strength();
@@ -8115,8 +7377,6 @@
     antlr4::tree::TerminalNode *CLOSE_PARENS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PullupStrength_01Context : public Pullup_strengthContext {
@@ -8130,8 +7390,6 @@
     antlr4::tree::TerminalNode *CLOSE_PARENS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PullupStrength_1Context : public Pullup_strengthContext {
@@ -8143,8 +7401,6 @@
     antlr4::tree::TerminalNode *CLOSE_PARENS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Pullup_strengthContext* pullup_strength();
@@ -8169,8 +7425,6 @@
     antlr4::tree::TerminalNode *RCMOS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  CmosSwitchType_CmosContext : public Cmos_switchtypeContext {
@@ -8180,8 +7434,6 @@
     antlr4::tree::TerminalNode *CMOS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Cmos_switchtypeContext* cmos_switchtype();
@@ -8206,8 +7458,6 @@
     antlr4::tree::TerminalNode *BUFIF0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  EnableGateType_Notif0Context : public Enable_gatetypeContext {
@@ -8217,8 +7467,6 @@
     antlr4::tree::TerminalNode *NOTIF0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  EnableGateType_Notif1Context : public Enable_gatetypeContext {
@@ -8228,8 +7476,6 @@
     antlr4::tree::TerminalNode *NOTIF1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  EnableGateType_Bufif1Context : public Enable_gatetypeContext {
@@ -8239,8 +7485,6 @@
     antlr4::tree::TerminalNode *BUFIF1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Enable_gatetypeContext* enable_gatetype();
@@ -8265,8 +7509,6 @@
     antlr4::tree::TerminalNode *PMOS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  MosSwitchType_NMosContext : public Mos_switchtypeContext {
@@ -8276,8 +7518,6 @@
     antlr4::tree::TerminalNode *NMOS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  MosSwitchType_RPMosContext : public Mos_switchtypeContext {
@@ -8287,8 +7527,6 @@
     antlr4::tree::TerminalNode *RPMOS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  MosSwitchType_RNMosContext : public Mos_switchtypeContext {
@@ -8298,8 +7536,6 @@
     antlr4::tree::TerminalNode *RNMOS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Mos_switchtypeContext* mos_switchtype();
@@ -8324,8 +7560,6 @@
     antlr4::tree::TerminalNode *XOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NInpGate_NandContext : public N_input_gatetypeContext {
@@ -8335,8 +7569,6 @@
     antlr4::tree::TerminalNode *NAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NInpGate_AndContext : public N_input_gatetypeContext {
@@ -8346,8 +7578,6 @@
     antlr4::tree::TerminalNode *AND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NInpGate_OrContext : public N_input_gatetypeContext {
@@ -8357,8 +7587,6 @@
     antlr4::tree::TerminalNode *OR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NInpGate_XnorContext : public N_input_gatetypeContext {
@@ -8368,8 +7596,6 @@
     antlr4::tree::TerminalNode *XNOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NInpGate_NorContext : public N_input_gatetypeContext {
@@ -8379,8 +7605,6 @@
     antlr4::tree::TerminalNode *NOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   N_input_gatetypeContext* n_input_gatetype();
@@ -8405,8 +7629,6 @@
     antlr4::tree::TerminalNode *BUF();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  NOutGate_NotContext : public N_output_gatetypeContext {
@@ -8416,8 +7638,6 @@
     antlr4::tree::TerminalNode *NOT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   N_output_gatetypeContext* n_output_gatetype();
@@ -8442,8 +7662,6 @@
     antlr4::tree::TerminalNode *RTRANIF1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PassEnSwitch_Tranif0Context : public Pass_en_switchtypeContext {
@@ -8453,8 +7671,6 @@
     antlr4::tree::TerminalNode *TRANIF0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PassEnSwitch_Tranif1Context : public Pass_en_switchtypeContext {
@@ -8464,8 +7680,6 @@
     antlr4::tree::TerminalNode *TRANIF1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PassEnSwitch_RTranif0Context : public Pass_en_switchtypeContext {
@@ -8475,8 +7689,6 @@
     antlr4::tree::TerminalNode *RTRANIF0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Pass_en_switchtypeContext* pass_en_switchtype();
@@ -8501,8 +7713,6 @@
     antlr4::tree::TerminalNode *RTRAN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  PassSwitch_TranContext : public Pass_switchtypeContext {
@@ -8512,8 +7722,6 @@
     antlr4::tree::TerminalNode *TRAN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Pass_switchtypeContext* pass_switchtype();
@@ -8532,8 +7740,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8552,8 +7758,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8572,8 +7776,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8587,8 +7789,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8606,8 +7806,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8624,8 +7822,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8641,8 +7837,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8661,8 +7855,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8678,8 +7870,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8700,8 +7890,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8721,8 +7909,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8742,8 +7928,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8761,8 +7945,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8780,8 +7962,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8797,8 +7977,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8819,8 +7997,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8834,8 +8010,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8852,8 +8026,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8873,8 +8045,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8894,8 +8064,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8915,8 +8083,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8936,8 +8102,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8959,8 +8123,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8977,8 +8139,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -8995,8 +8155,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9018,8 +8176,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9040,8 +8196,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9058,8 +8212,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9079,8 +8231,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9100,8 +8250,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9121,8 +8269,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9142,8 +8288,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9165,8 +8309,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9188,8 +8330,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9210,8 +8350,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9228,8 +8366,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9251,8 +8387,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9269,8 +8403,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9287,8 +8419,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9303,8 +8433,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9324,8 +8452,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9345,8 +8471,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9366,8 +8490,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9388,8 +8510,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9405,8 +8525,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9427,8 +8545,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9449,8 +8565,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9464,8 +8578,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9495,8 +8607,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9513,8 +8623,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9532,8 +8640,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9550,8 +8656,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9571,8 +8675,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9589,8 +8691,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9607,8 +8707,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9623,8 +8721,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9638,8 +8734,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9656,8 +8750,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9674,8 +8766,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9693,8 +8783,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9712,8 +8800,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9739,8 +8825,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_b1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_1TickB1Context : public Init_valContext {
@@ -9750,8 +8834,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_B1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_1Tickb0Context : public Init_valContext {
@@ -9761,8 +8843,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_b0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_1TickB0Context : public Init_valContext {
@@ -9772,8 +8852,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_B0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_1TickbxContext : public Init_valContext {
@@ -9783,8 +8861,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_bx();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_1TickbXContext : public Init_valContext {
@@ -9794,8 +8870,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_bX();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_1TickBxContext : public Init_valContext {
@@ -9805,8 +8879,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_Bx();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_1TickBXContext : public Init_valContext {
@@ -9816,8 +8888,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_BX();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  InitVal_IntegralContext : public Init_valContext {
@@ -9827,8 +8897,6 @@
     antlr4::tree::TerminalNode *Integral_number();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Init_valContext* init_val();
@@ -9846,8 +8914,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9862,8 +8928,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9878,8 +8942,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9895,8 +8957,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9914,8 +8974,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9930,8 +8988,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9946,8 +9002,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9963,8 +9017,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -9979,8 +9031,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10001,8 +9051,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10023,8 +9071,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10045,8 +9091,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10063,8 +9107,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10081,8 +9123,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10101,8 +9141,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10118,8 +9156,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10134,8 +9170,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10150,8 +9184,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10177,8 +9209,6 @@
     antlr4::tree::TerminalNode *ALWAYS_COMB();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AlwaysKeywd_LatchContext : public Always_keywordContext {
@@ -10188,8 +9218,6 @@
     antlr4::tree::TerminalNode *ALWAYS_LATCH();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AlwaysKeywd_FFContext : public Always_keywordContext {
@@ -10199,8 +9227,6 @@
     antlr4::tree::TerminalNode *ALWAYS_FF();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AlwaysKeywd_AlwaysContext : public Always_keywordContext {
@@ -10210,8 +9236,6 @@
     antlr4::tree::TerminalNode *ALWAYS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Always_keywordContext* always_keyword();
@@ -10237,8 +9261,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10254,8 +9276,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10281,8 +9301,6 @@
     antlr4::tree::TerminalNode *ADD_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_ModuloContext : public Assignment_operatorContext {
@@ -10292,8 +9310,6 @@
     antlr4::tree::TerminalNode *MODULO_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_BitwXorContext : public Assignment_operatorContext {
@@ -10303,8 +9319,6 @@
     antlr4::tree::TerminalNode *BITW_XOR_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_BitwLeftShiftContext : public Assignment_operatorContext {
@@ -10314,8 +9328,6 @@
     antlr4::tree::TerminalNode *BITW_LEFT_SHIFT_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_SubContext : public Assignment_operatorContext {
@@ -10325,8 +9337,6 @@
     antlr4::tree::TerminalNode *SUB_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_BitwOrContext : public Assignment_operatorContext {
@@ -10336,8 +9346,6 @@
     antlr4::tree::TerminalNode *BITW_OR_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_DivContext : public Assignment_operatorContext {
@@ -10347,8 +9355,6 @@
     antlr4::tree::TerminalNode *DIV_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_BitwRightShiftContext : public Assignment_operatorContext {
@@ -10358,8 +9364,6 @@
     antlr4::tree::TerminalNode *BITW_RIGHT_SHIFT_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_AssignContext : public Assignment_operatorContext {
@@ -10369,8 +9373,6 @@
     antlr4::tree::TerminalNode *ASSIGN_OP();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_ArithShiftRightContext : public Assignment_operatorContext {
@@ -10380,8 +9382,6 @@
     antlr4::tree::TerminalNode *ARITH_SHIFT_RIGHT_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_MultContext : public Assignment_operatorContext {
@@ -10391,8 +9391,6 @@
     antlr4::tree::TerminalNode *MULT_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_BitwAndContext : public Assignment_operatorContext {
@@ -10402,8 +9400,6 @@
     antlr4::tree::TerminalNode *BITW_AND_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  AssignOp_ArithShiftLeftContext : public Assignment_operatorContext {
@@ -10413,8 +9409,6 @@
     antlr4::tree::TerminalNode *ARITH_SHIFT_LEFT_ASSIGN();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Assignment_operatorContext* assignment_operator();
@@ -10430,8 +9424,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10452,8 +9444,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10469,8 +9459,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10486,8 +9474,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10510,8 +9496,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10536,8 +9520,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10551,8 +9533,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10566,8 +9546,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10581,8 +9559,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10599,8 +9575,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10618,8 +9592,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10655,8 +9627,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10673,8 +9643,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10689,8 +9657,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10709,8 +9675,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10728,8 +9692,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10750,8 +9712,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10775,8 +9735,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10792,8 +9750,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10811,8 +9767,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10827,8 +9781,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10863,8 +9815,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10882,8 +9832,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10900,8 +9848,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10927,8 +9873,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10944,8 +9888,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10962,8 +9904,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -10979,8 +9919,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11007,8 +9945,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11034,8 +9970,6 @@
     antlr4::tree::TerminalNode *CASE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  CaseKeyword_CaseZContext : public Case_keywordContext {
@@ -11045,8 +9979,6 @@
     antlr4::tree::TerminalNode *CASEZ();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  CaseKeyword_CaseXContext : public Case_keywordContext {
@@ -11056,8 +9988,6 @@
     antlr4::tree::TerminalNode *CASEX();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Case_keywordContext* case_keyword();
@@ -11076,8 +10006,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11096,8 +10024,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11114,8 +10040,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11132,8 +10056,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11149,8 +10071,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11178,8 +10098,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11208,8 +10126,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11224,8 +10140,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11240,8 +10154,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11256,8 +10168,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11272,8 +10182,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11290,8 +10198,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11305,8 +10211,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11326,8 +10230,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11347,8 +10249,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11362,8 +10262,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11377,8 +10275,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11392,8 +10288,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11426,8 +10320,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11445,8 +10337,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11469,8 +10359,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11487,8 +10375,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11504,8 +10390,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11522,8 +10406,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11542,8 +10424,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11558,8 +10438,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11575,8 +10453,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11592,8 +10468,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11608,8 +10482,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11625,8 +10497,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11644,8 +10514,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11663,8 +10531,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11682,8 +10548,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11699,8 +10563,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11720,8 +10582,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11741,8 +10601,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11762,8 +10620,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11777,8 +10633,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11802,8 +10656,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11821,8 +10673,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11843,8 +10693,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -11873,8 +10721,6 @@
     antlr4::tree::TerminalNode *OUTPUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  DefaultSkew_OutputContext : public Default_skewContext {
@@ -11885,8 +10731,6 @@
     Clocking_skewContext *clocking_skew();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  DefaultSkew_IntputContext : public Default_skewContext {
@@ -11897,8 +10741,6 @@
     Clocking_skewContext *clocking_skew();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Default_skewContext* default_skew();
@@ -11926,8 +10768,6 @@
     Clocking_skewContext* clocking_skew(size_t i);
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  ClockingDir_InputContext : public Clocking_directionContext {
@@ -11938,8 +10778,6 @@
     Clocking_skewContext *clocking_skew();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  ClockingDir_OutputContext : public Clocking_directionContext {
@@ -11950,8 +10788,6 @@
     Clocking_skewContext *clocking_skew();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  ClockingDir_InoutContext : public Clocking_directionContext {
@@ -11961,8 +10797,6 @@
     antlr4::tree::TerminalNode *INOUT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Clocking_directionContext* clocking_direction();
@@ -11978,8 +10812,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12004,8 +10836,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12020,8 +10850,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12047,8 +10875,6 @@
     antlr4::tree::TerminalNode *EDGE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Edge_NegedgeContext : public Edge_identifierContext {
@@ -12058,8 +10884,6 @@
     antlr4::tree::TerminalNode *NEGEDGE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Edge_PosedgeContext : public Edge_identifierContext {
@@ -12069,8 +10893,6 @@
     antlr4::tree::TerminalNode *POSEDGE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Edge_identifierContext* edge_identifier();
@@ -12086,8 +10908,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12106,8 +10926,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12131,8 +10949,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12147,8 +10963,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12168,8 +10982,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12193,8 +11005,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12211,8 +11021,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12234,8 +11042,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12254,8 +11060,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12273,8 +11077,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12291,8 +11093,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12312,8 +11112,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12331,8 +11129,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12352,8 +11148,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12373,8 +11167,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12388,8 +11180,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12406,8 +11196,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12425,8 +11213,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12443,8 +11229,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12461,8 +11245,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12479,8 +11261,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12497,8 +11277,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12518,8 +11296,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12539,8 +11315,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12557,8 +11331,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12575,8 +11347,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12595,8 +11365,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12615,8 +11383,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12632,8 +11398,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12664,8 +11428,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12679,8 +11441,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12694,8 +11454,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12709,8 +11467,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12724,8 +11480,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12739,8 +11493,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12754,8 +11506,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12769,8 +11519,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12784,8 +11532,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12799,8 +11545,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12814,8 +11558,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12829,8 +11571,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12844,8 +11584,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12859,8 +11597,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12874,8 +11610,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12889,8 +11623,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12904,8 +11636,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12919,8 +11649,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12937,8 +11665,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12963,8 +11689,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -12989,8 +11713,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13010,8 +11732,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13036,8 +11756,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13061,8 +11779,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13086,8 +11802,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13116,8 +11830,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13141,8 +11853,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13166,8 +11876,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13196,8 +11904,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13221,8 +11927,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13248,8 +11952,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13276,8 +11978,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13300,8 +12000,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13325,8 +12023,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13351,8 +12047,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13369,8 +12063,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13387,8 +12079,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13402,8 +12092,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13417,8 +12105,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13432,8 +12118,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13447,8 +12131,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13462,8 +12144,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13477,8 +12157,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13492,8 +12170,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13507,8 +12183,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13522,8 +12196,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13540,8 +12212,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13558,8 +12228,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13585,8 +12253,6 @@
     antlr4::tree::TerminalNode *NEGEDGE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TimingCheckEventControl_PosedgeContext : public Timing_check_event_controlContext {
@@ -13596,8 +12262,6 @@
     antlr4::tree::TerminalNode *POSEDGE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  TimingCheckEventControl_EdgeContext : public Timing_check_event_controlContext {
@@ -13607,8 +12271,6 @@
     Edge_control_specifierContext *edge_control_specifier();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Timing_check_event_controlContext* timing_check_event_control();
@@ -13622,8 +12284,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13643,8 +12303,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13659,8 +12317,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13676,8 +12332,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13697,8 +12351,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13724,8 +12376,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_b1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_1TickB1Context : public Scalar_constantContext {
@@ -13735,8 +12385,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_B1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_1Tickb0Context : public Scalar_constantContext {
@@ -13746,8 +12394,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_b0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_1TickB0Context : public Scalar_constantContext {
@@ -13757,8 +12403,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_B0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_IntegralContext : public Scalar_constantContext {
@@ -13768,8 +12412,6 @@
     antlr4::tree::TerminalNode *Integral_number();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_Tickb0Context : public Scalar_constantContext {
@@ -13779,8 +12421,6 @@
     antlr4::tree::TerminalNode *TICK_b0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_TickB0Context : public Scalar_constantContext {
@@ -13790,8 +12430,6 @@
     antlr4::tree::TerminalNode *TICK_B0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_Tickb1Context : public Scalar_constantContext {
@@ -13801,8 +12439,6 @@
     antlr4::tree::TerminalNode *TICK_b1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Scalar_TickB1Context : public Scalar_constantContext {
@@ -13812,8 +12448,6 @@
     antlr4::tree::TerminalNode *TICK_B1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Scalar_constantContext* scalar_constant();
@@ -13835,8 +12469,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13859,8 +12491,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13876,8 +12506,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13894,8 +12522,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13914,8 +12540,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13932,8 +12556,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13950,8 +12572,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13969,8 +12589,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -13985,8 +12603,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14001,8 +12617,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14021,8 +12635,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14040,8 +12652,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14059,8 +12669,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14075,8 +12683,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14108,8 +12714,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14134,8 +12738,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14153,8 +12755,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14174,8 +12774,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14190,8 +12788,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14214,8 +12810,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14240,8 +12834,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14269,8 +12861,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14288,8 +12878,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14303,8 +12891,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14318,8 +12904,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14333,8 +12917,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14348,8 +12930,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14366,8 +12946,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14390,8 +12968,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14408,8 +12984,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14425,8 +12999,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14442,8 +13014,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14458,8 +13028,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14474,8 +13042,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14491,8 +13057,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14509,8 +13073,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14545,8 +13107,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14562,8 +13122,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14581,8 +13139,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14599,8 +13155,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14622,8 +13176,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14640,8 +13192,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14656,8 +13206,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14672,8 +13220,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14690,8 +13236,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14722,8 +13266,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14744,8 +13286,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14780,8 +13320,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14816,8 +13354,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14831,8 +13367,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14846,8 +13380,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14861,8 +13393,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14877,8 +13407,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14894,8 +13422,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14909,8 +13435,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14926,8 +13450,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14941,8 +13463,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14958,8 +13478,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -14978,8 +13496,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15001,8 +13517,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15021,8 +13535,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15041,8 +13553,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15064,8 +13574,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15083,8 +13591,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15104,8 +13610,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15125,8 +13629,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15149,8 +13651,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15177,8 +13677,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15196,8 +13694,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -15223,8 +13719,6 @@
     antlr4::tree::TerminalNode *BITW_AND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_ReductNandContext : public Unary_operatorContext {
@@ -15234,8 +13728,6 @@
     antlr4::tree::TerminalNode *REDUCTION_NAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_TildaContext : public Unary_operatorContext {
@@ -15245,8 +13737,6 @@
     antlr4::tree::TerminalNode *TILDA();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_PlusContext : public Unary_operatorContext {
@@ -15256,8 +13746,6 @@
     antlr4::tree::TerminalNode *PLUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_NotContext : public Unary_operatorContext {
@@ -15267,8 +13755,6 @@
     antlr4::tree::TerminalNode *BANG();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_BitwOrContext : public Unary_operatorContext {
@@ -15278,8 +13764,6 @@
     antlr4::tree::TerminalNode *BITW_OR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_ReductXnor2Context : public Unary_operatorContext {
@@ -15289,8 +13773,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR2();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_BitwXorContext : public Unary_operatorContext {
@@ -15300,8 +13782,6 @@
     antlr4::tree::TerminalNode *BITW_XOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_MinusContext : public Unary_operatorContext {
@@ -15311,8 +13791,6 @@
     antlr4::tree::TerminalNode *MINUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_ReductNorContext : public Unary_operatorContext {
@@ -15322,8 +13800,6 @@
     antlr4::tree::TerminalNode *REDUCTION_NOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Unary_ReductXnor1Context : public Unary_operatorContext {
@@ -15333,8 +13809,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Unary_operatorContext* unary_operator();
@@ -15359,8 +13833,6 @@
     antlr4::tree::TerminalNode *BITW_AND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_MinusContext : public Binary_operatorContext {
@@ -15370,8 +13842,6 @@
     antlr4::tree::TerminalNode *MINUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_DivContext : public Binary_operatorContext {
@@ -15381,8 +13851,6 @@
     antlr4::tree::TerminalNode *DIV();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_WildEqualContext : public Binary_operatorContext {
@@ -15392,8 +13860,6 @@
     antlr4::tree::TerminalNode *WILD_EQUAL_OP();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ArithShiftLeftContext : public Binary_operatorContext {
@@ -15403,8 +13869,6 @@
     antlr4::tree::TerminalNode *ARITH_SHIFT_LEFT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_MultContext : public Binary_operatorContext {
@@ -15414,8 +13878,6 @@
     antlr4::tree::TerminalNode *STAR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ReductNandContext : public Binary_operatorContext {
@@ -15425,8 +13887,6 @@
     antlr4::tree::TerminalNode *REDUCTION_NAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_NotContext : public Binary_operatorContext {
@@ -15436,8 +13896,6 @@
     antlr4::tree::TerminalNode *NOTEQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_BitwXorContext : public Binary_operatorContext {
@@ -15447,8 +13905,6 @@
     antlr4::tree::TerminalNode *BITW_XOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ShiftLeftContext : public Binary_operatorContext {
@@ -15458,8 +13914,6 @@
     antlr4::tree::TerminalNode *SHIFT_LEFT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_WildcardEqualContext : public Binary_operatorContext {
@@ -15469,8 +13923,6 @@
     antlr4::tree::TerminalNode *BINARY_WILDCARD_EQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ShiftRightContext : public Binary_operatorContext {
@@ -15480,8 +13932,6 @@
     antlr4::tree::TerminalNode *SHIFT_RIGHT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ArithShiftRightContext : public Binary_operatorContext {
@@ -15491,8 +13941,6 @@
     antlr4::tree::TerminalNode *ARITH_SHIFT_RIGHT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_LogicOrContext : public Binary_operatorContext {
@@ -15502,8 +13950,6 @@
     antlr4::tree::TerminalNode *LOGICAL_OR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_PercentContext : public Binary_operatorContext {
@@ -15513,8 +13959,6 @@
     antlr4::tree::TerminalNode *PERCENT();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ReductNorContext : public Binary_operatorContext {
@@ -15524,8 +13968,6 @@
     antlr4::tree::TerminalNode *REDUCTION_NOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_WildcardNotEqualContext : public Binary_operatorContext {
@@ -15535,8 +13977,6 @@
     antlr4::tree::TerminalNode *BINARY_WILDCARD_NOTEQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_FourStateLogicEqualContext : public Binary_operatorContext {
@@ -15546,8 +13986,6 @@
     antlr4::tree::TerminalNode *FOUR_STATE_LOGIC_EQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ImplyContext : public Binary_operatorContext {
@@ -15557,8 +13995,6 @@
     antlr4::tree::TerminalNode *IMPLY();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_EquivContext : public Binary_operatorContext {
@@ -15568,8 +14004,6 @@
     antlr4::tree::TerminalNode *EQUIV();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_LessEqualContext : public Binary_operatorContext {
@@ -15579,8 +14013,6 @@
     antlr4::tree::TerminalNode *LESS_EQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_LogicAndContext : public Binary_operatorContext {
@@ -15590,8 +14022,6 @@
     antlr4::tree::TerminalNode *LOGICAL_AND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ReductXnor2Context : public Binary_operatorContext {
@@ -15601,8 +14031,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR2();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_ReductXnor1Context : public Binary_operatorContext {
@@ -15612,8 +14040,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_GreatEqualContext : public Binary_operatorContext {
@@ -15623,8 +14049,6 @@
     antlr4::tree::TerminalNode *GREATER_EQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_FourStateLogicNotEqualContext : public Binary_operatorContext {
@@ -15634,8 +14058,6 @@
     antlr4::tree::TerminalNode *FOUR_STATE_LOGIC_NOTEQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_MultMultContext : public Binary_operatorContext {
@@ -15645,8 +14067,6 @@
     antlr4::tree::TerminalNode *STARSTAR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_GreatContext : public Binary_operatorContext {
@@ -15656,8 +14076,6 @@
     antlr4::tree::TerminalNode *GREATER();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_EquivalenceContext : public Binary_operatorContext {
@@ -15667,8 +14085,6 @@
     antlr4::tree::TerminalNode *EQUIVALENCE();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_WildNotEqualContext : public Binary_operatorContext {
@@ -15678,8 +14094,6 @@
     antlr4::tree::TerminalNode *WILD_NOTEQUAL_OP();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_LessContext : public Binary_operatorContext {
@@ -15689,8 +14103,6 @@
     antlr4::tree::TerminalNode *LESS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_PlusContext : public Binary_operatorContext {
@@ -15700,8 +14112,6 @@
     antlr4::tree::TerminalNode *PLUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinOp_BitwOrContext : public Binary_operatorContext {
@@ -15711,8 +14121,6 @@
     antlr4::tree::TerminalNode *BITW_OR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Binary_operatorContext* binary_operator();
@@ -15737,8 +14145,6 @@
     antlr4::tree::TerminalNode *MINUSMINUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  IncDec_PlusPlusContext : public Inc_or_dec_operatorContext {
@@ -15748,8 +14154,6 @@
     antlr4::tree::TerminalNode *PLUSPLUS();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Inc_or_dec_operatorContext* inc_or_dec_operator();
@@ -15774,8 +14178,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR2();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_NotContext : public Unary_module_path_operatorContext {
@@ -15785,8 +14187,6 @@
     antlr4::tree::TerminalNode *BANG();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_ReductNandContext : public Unary_module_path_operatorContext {
@@ -15796,8 +14196,6 @@
     antlr4::tree::TerminalNode *REDUCTION_NAND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_ReductXNor1Context : public Unary_module_path_operatorContext {
@@ -15807,8 +14205,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_TildaContext : public Unary_module_path_operatorContext {
@@ -15818,8 +14214,6 @@
     antlr4::tree::TerminalNode *TILDA();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_BitwOrContext : public Unary_module_path_operatorContext {
@@ -15829,8 +14223,6 @@
     antlr4::tree::TerminalNode *BITW_OR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_ReductNorContext : public Unary_module_path_operatorContext {
@@ -15840,8 +14232,6 @@
     antlr4::tree::TerminalNode *REDUCTION_NOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_BitwXorContext : public Unary_module_path_operatorContext {
@@ -15851,8 +14241,6 @@
     antlr4::tree::TerminalNode *BITW_XOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  UnaryModOp_BitwAndContext : public Unary_module_path_operatorContext {
@@ -15862,8 +14250,6 @@
     antlr4::tree::TerminalNode *BITW_AND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Unary_module_path_operatorContext* unary_module_path_operator();
@@ -15888,8 +14274,6 @@
     antlr4::tree::TerminalNode *EQUIV();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_BitwXorContext : public Binary_module_path_operatorContext {
@@ -15899,8 +14283,6 @@
     antlr4::tree::TerminalNode *BITW_XOR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_LogicOrContext : public Binary_module_path_operatorContext {
@@ -15910,8 +14292,6 @@
     antlr4::tree::TerminalNode *LOGICAL_OR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_NotEqualContext : public Binary_module_path_operatorContext {
@@ -15921,8 +14301,6 @@
     antlr4::tree::TerminalNode *NOTEQUAL();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_LogicAndContext : public Binary_module_path_operatorContext {
@@ -15932,8 +14310,6 @@
     antlr4::tree::TerminalNode *LOGICAL_AND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_BitwAndContext : public Binary_module_path_operatorContext {
@@ -15943,8 +14319,6 @@
     antlr4::tree::TerminalNode *BITW_AND();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_BitwOrContext : public Binary_module_path_operatorContext {
@@ -15954,8 +14328,6 @@
     antlr4::tree::TerminalNode *BITW_OR();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_ReductXnor1Context : public Binary_module_path_operatorContext {
@@ -15965,8 +14337,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  BinModOp_ReductXnor2Context : public Binary_module_path_operatorContext {
@@ -15976,8 +14346,6 @@
     antlr4::tree::TerminalNode *REDUCTION_XNOR2();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Binary_module_path_operatorContext* binary_module_path_operator();
@@ -16002,8 +14370,6 @@
     antlr4::tree::TerminalNode *Real_number();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1Tickb0Context : public NumberContext {
@@ -16013,8 +14379,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_b0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1TickB0Context : public NumberContext {
@@ -16024,8 +14388,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_B0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1Tickb1Context : public NumberContext {
@@ -16035,8 +14397,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_b1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1TickB1Context : public NumberContext {
@@ -16046,8 +14406,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_B1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1TickbxContext : public NumberContext {
@@ -16057,8 +14415,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_bx();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1TickbXContext : public NumberContext {
@@ -16068,8 +14424,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_bX();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1TickBxContext : public NumberContext {
@@ -16079,8 +14433,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_Bx();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_1TickBXContext : public NumberContext {
@@ -16090,8 +14442,6 @@
     antlr4::tree::TerminalNode *ONE_TICK_BX();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_IntegralContext : public NumberContext {
@@ -16101,8 +14451,6 @@
     antlr4::tree::TerminalNode *Integral_number();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_Tick0Context : public NumberContext {
@@ -16112,8 +14460,6 @@
     antlr4::tree::TerminalNode *TICK_0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_Tick1Context : public NumberContext {
@@ -16123,8 +14469,6 @@
     antlr4::tree::TerminalNode *TICK_1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_Tickb0Context : public NumberContext {
@@ -16134,8 +14478,6 @@
     antlr4::tree::TerminalNode *TICK_b0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_TickB0Context : public NumberContext {
@@ -16145,8 +14487,6 @@
     antlr4::tree::TerminalNode *TICK_B0();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_Tickb1Context : public NumberContext {
@@ -16156,8 +14496,6 @@
     antlr4::tree::TerminalNode *TICK_b1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  Number_TickB1Context : public NumberContext {
@@ -16167,8 +14505,6 @@
     antlr4::tree::TerminalNode *TICK_B1();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   NumberContext* number();
@@ -16184,8 +14520,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16204,8 +14538,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16221,8 +14553,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16236,8 +14566,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16295,8 +14623,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16327,8 +14653,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16352,8 +14676,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16373,8 +14695,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16399,8 +14719,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16416,8 +14734,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16444,8 +14760,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16470,8 +14784,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16488,8 +14800,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16508,8 +14818,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16530,8 +14838,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16584,8 +14890,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16604,8 +14908,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16623,8 +14925,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16646,8 +14946,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16666,8 +14964,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16682,8 +14978,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16697,8 +14991,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16715,8 +15007,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16730,8 +15020,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16747,8 +15035,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16762,8 +15048,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16777,8 +15061,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16792,8 +15074,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16807,8 +15087,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16822,8 +15100,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16837,8 +15113,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16852,8 +15126,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16867,8 +15139,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16882,8 +15152,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16897,8 +15165,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16912,8 +15178,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16927,8 +15191,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16942,8 +15204,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16957,8 +15217,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16972,8 +15230,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -16987,8 +15243,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17002,8 +15256,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17017,8 +15269,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17032,8 +15282,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17047,8 +15295,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17062,8 +15308,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17077,8 +15321,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17093,8 +15335,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17110,8 +15350,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17125,8 +15363,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17140,8 +15376,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17155,8 +15389,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17170,8 +15402,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17185,8 +15415,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17203,8 +15431,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17218,8 +15444,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17244,8 +15468,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17264,8 +15486,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17285,8 +15505,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17300,8 +15518,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17316,8 +15532,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17334,8 +15548,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17352,8 +15564,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17369,8 +15579,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17393,8 +15601,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -17416,8 +15622,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
diff --git a/src/parser/SV3_1aPpParser.cpp b/src/parser/SV3_1aPpParser.cpp
index 074908c..e7947b1 100644
--- a/src/parser/SV3_1aPpParser.cpp
+++ b/src/parser/SV3_1aPpParser.cpp
@@ -3,7 +3,6 @@
 
 
 #include "SV3_1aPpParserListener.h"
-#include "SV3_1aPpParserVisitor.h"
 
 #include "SV3_1aPpParser.h"
 
@@ -63,14 +62,6 @@
     parserListener->exitSource_text(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Source_textContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSource_text(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Source_textContext* SV3_1aPpParser::source_text() {
   Source_textContext *_localctx = _tracker.createInstance<Source_textContext>(_ctx, getState());
   enterRule(_localctx, 0, SV3_1aPpParser::RuleSource_text);
@@ -510,14 +501,6 @@
     parserListener->exitDescription(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::DescriptionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDescription(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::DescriptionContext* SV3_1aPpParser::description() {
   DescriptionContext *_localctx = _tracker.createInstance<DescriptionContext>(_ctx, getState());
   enterRule(_localctx, 2, SV3_1aPpParser::RuleDescription);
@@ -1109,13 +1092,6 @@
   if (parserListener != nullptr)
     parserListener->exitMacroInstanceWithArgs(this);
 }
-
-antlrcpp::Any SV3_1aPpParser::MacroInstanceWithArgsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMacroInstanceWithArgs(this);
-  else
-    return visitor->visitChildren(this);
-}
 //----------------- MacroInstanceNoArgsContext ------------------------------------------------------------------
 
 tree::TerminalNode* SV3_1aPpParser::MacroInstanceNoArgsContext::Macro_identifier() {
@@ -1138,13 +1114,6 @@
   if (parserListener != nullptr)
     parserListener->exitMacroInstanceNoArgs(this);
 }
-
-antlrcpp::Any SV3_1aPpParser::MacroInstanceNoArgsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMacroInstanceNoArgs(this);
-  else
-    return visitor->visitChildren(this);
-}
 SV3_1aPpParser::Macro_instanceContext* SV3_1aPpParser::macro_instance() {
   Macro_instanceContext *_localctx = _tracker.createInstance<Macro_instanceContext>(_ctx, getState());
   enterRule(_localctx, 4, SV3_1aPpParser::RuleMacro_instance);
@@ -1258,14 +1227,6 @@
     parserListener->exitUnterminated_string(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Unterminated_stringContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUnterminated_string(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Unterminated_stringContext* SV3_1aPpParser::unterminated_string() {
   Unterminated_stringContext *_localctx = _tracker.createInstance<Unterminated_stringContext>(_ctx, getState());
   enterRule(_localctx, 6, SV3_1aPpParser::RuleUnterminated_string);
@@ -1360,14 +1321,6 @@
     parserListener->exitMacro_actual_args(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Macro_actual_argsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMacro_actual_args(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Macro_actual_argsContext* SV3_1aPpParser::macro_actual_args() {
   Macro_actual_argsContext *_localctx = _tracker.createInstance<Macro_actual_argsContext>(_ctx, getState());
   enterRule(_localctx, 8, SV3_1aPpParser::RuleMacro_actual_args);
@@ -1490,14 +1443,6 @@
     parserListener->exitComments(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::CommentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitComments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::CommentsContext* SV3_1aPpParser::comments() {
   CommentsContext *_localctx = _tracker.createInstance<CommentsContext>(_ctx, getState());
   enterRule(_localctx, 10, SV3_1aPpParser::RuleComments);
@@ -1557,14 +1502,6 @@
     parserListener->exitNumber(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::NumberContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNumber(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::NumberContext* SV3_1aPpParser::number() {
   NumberContext *_localctx = _tracker.createInstance<NumberContext>(_ctx, getState());
   enterRule(_localctx, 12, SV3_1aPpParser::RuleNumber);
@@ -1614,14 +1551,6 @@
     parserListener->exitPound_delay(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Pound_delayContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitPound_delay(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Pound_delayContext* SV3_1aPpParser::pound_delay() {
   Pound_delayContext *_localctx = _tracker.createInstance<Pound_delayContext>(_ctx, getState());
   enterRule(_localctx, 14, SV3_1aPpParser::RulePound_delay);
@@ -1687,14 +1616,6 @@
     parserListener->exitMacro_definition(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Macro_definitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMacro_definition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Macro_definitionContext* SV3_1aPpParser::macro_definition() {
   Macro_definitionContext *_localctx = _tracker.createInstance<Macro_definitionContext>(_ctx, getState());
   enterRule(_localctx, 16, SV3_1aPpParser::RuleMacro_definition);
@@ -1792,14 +1713,6 @@
     parserListener->exitInclude_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Include_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitInclude_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Include_directive_one_lineContext* SV3_1aPpParser::include_directive_one_line() {
   Include_directive_one_lineContext *_localctx = _tracker.createInstance<Include_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 18, SV3_1aPpParser::RuleInclude_directive_one_line);
@@ -1882,14 +1795,6 @@
     parserListener->exitInclude_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Include_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitInclude_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Include_directiveContext* SV3_1aPpParser::include_directive() {
   Include_directiveContext *_localctx = _tracker.createInstance<Include_directiveContext>(_ctx, getState());
   enterRule(_localctx, 20, SV3_1aPpParser::RuleInclude_directive);
@@ -1984,14 +1889,6 @@
     parserListener->exitLine_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Line_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitLine_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Line_directive_one_lineContext* SV3_1aPpParser::line_directive_one_line() {
   Line_directive_one_lineContext *_localctx = _tracker.createInstance<Line_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 22, SV3_1aPpParser::RuleLine_directive_one_line);
@@ -2074,14 +1971,6 @@
     parserListener->exitLine_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Line_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitLine_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Line_directiveContext* SV3_1aPpParser::line_directive() {
   Line_directiveContext *_localctx = _tracker.createInstance<Line_directiveContext>(_ctx, getState());
   enterRule(_localctx, 24, SV3_1aPpParser::RuleLine_directive);
@@ -2153,14 +2042,6 @@
     parserListener->exitDefault_nettype_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Default_nettype_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_nettype_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Default_nettype_directive_one_lineContext* SV3_1aPpParser::default_nettype_directive_one_line() {
   Default_nettype_directive_one_lineContext *_localctx = _tracker.createInstance<Default_nettype_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 26, SV3_1aPpParser::RuleDefault_nettype_directive_one_line);
@@ -2231,14 +2112,6 @@
     parserListener->exitDefault_nettype_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Default_nettype_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_nettype_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Default_nettype_directiveContext* SV3_1aPpParser::default_nettype_directive() {
   Default_nettype_directiveContext *_localctx = _tracker.createInstance<Default_nettype_directiveContext>(_ctx, getState());
   enterRule(_localctx, 28, SV3_1aPpParser::RuleDefault_nettype_directive);
@@ -2292,14 +2165,6 @@
     parserListener->exitSv_file_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Sv_file_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSv_file_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Sv_file_directiveContext* SV3_1aPpParser::sv_file_directive() {
   Sv_file_directiveContext *_localctx = _tracker.createInstance<Sv_file_directiveContext>(_ctx, getState());
   enterRule(_localctx, 30, SV3_1aPpParser::RuleSv_file_directive);
@@ -2349,14 +2214,6 @@
     parserListener->exitSv_line_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Sv_line_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSv_line_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Sv_line_directiveContext* SV3_1aPpParser::sv_line_directive() {
   Sv_line_directiveContext *_localctx = _tracker.createInstance<Sv_line_directiveContext>(_ctx, getState());
   enterRule(_localctx, 32, SV3_1aPpParser::RuleSv_line_directive);
@@ -2418,14 +2275,6 @@
     parserListener->exitTimescale_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Timescale_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitTimescale_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Timescale_directive_one_lineContext* SV3_1aPpParser::timescale_directive_one_line() {
   Timescale_directive_one_lineContext *_localctx = _tracker.createInstance<Timescale_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 34, SV3_1aPpParser::RuleTimescale_directive_one_line);
@@ -2492,14 +2341,6 @@
     parserListener->exitTimescale_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Timescale_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitTimescale_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Timescale_directiveContext* SV3_1aPpParser::timescale_directive() {
   Timescale_directiveContext *_localctx = _tracker.createInstance<Timescale_directiveContext>(_ctx, getState());
   enterRule(_localctx, 36, SV3_1aPpParser::RuleTimescale_directive);
@@ -2567,14 +2408,6 @@
     parserListener->exitUndef_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Undef_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUndef_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Undef_directiveContext* SV3_1aPpParser::undef_directive() {
   Undef_directiveContext *_localctx = _tracker.createInstance<Undef_directiveContext>(_ctx, getState());
   enterRule(_localctx, 38, SV3_1aPpParser::RuleUndef_directive);
@@ -2703,14 +2536,6 @@
     parserListener->exitIfdef_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Ifdef_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitIfdef_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Ifdef_directive_one_lineContext* SV3_1aPpParser::ifdef_directive_one_line() {
   Ifdef_directive_one_lineContext *_localctx = _tracker.createInstance<Ifdef_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 40, SV3_1aPpParser::RuleIfdef_directive_one_line);
@@ -2876,14 +2701,6 @@
     parserListener->exitIfdef_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Ifdef_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitIfdef_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Ifdef_directiveContext* SV3_1aPpParser::ifdef_directive() {
   Ifdef_directiveContext *_localctx = _tracker.createInstance<Ifdef_directiveContext>(_ctx, getState());
   enterRule(_localctx, 42, SV3_1aPpParser::RuleIfdef_directive);
@@ -2976,14 +2793,6 @@
     parserListener->exitIfdef_directive_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Ifdef_directive_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitIfdef_directive_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Ifdef_directive_in_macro_bodyContext* SV3_1aPpParser::ifdef_directive_in_macro_body() {
   Ifdef_directive_in_macro_bodyContext *_localctx = _tracker.createInstance<Ifdef_directive_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 44, SV3_1aPpParser::RuleIfdef_directive_in_macro_body);
@@ -3113,14 +2922,6 @@
     parserListener->exitIfndef_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Ifndef_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitIfndef_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Ifndef_directive_one_lineContext* SV3_1aPpParser::ifndef_directive_one_line() {
   Ifndef_directive_one_lineContext *_localctx = _tracker.createInstance<Ifndef_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 46, SV3_1aPpParser::RuleIfndef_directive_one_line);
@@ -3286,14 +3087,6 @@
     parserListener->exitIfndef_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Ifndef_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitIfndef_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Ifndef_directiveContext* SV3_1aPpParser::ifndef_directive() {
   Ifndef_directiveContext *_localctx = _tracker.createInstance<Ifndef_directiveContext>(_ctx, getState());
   enterRule(_localctx, 48, SV3_1aPpParser::RuleIfndef_directive);
@@ -3386,14 +3179,6 @@
     parserListener->exitIfndef_directive_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Ifndef_directive_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitIfndef_directive_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Ifndef_directive_in_macro_bodyContext* SV3_1aPpParser::ifndef_directive_in_macro_body() {
   Ifndef_directive_in_macro_bodyContext *_localctx = _tracker.createInstance<Ifndef_directive_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 50, SV3_1aPpParser::RuleIfndef_directive_in_macro_body);
@@ -3487,14 +3272,6 @@
     parserListener->exitElsif_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Elsif_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElsif_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Elsif_directive_one_lineContext* SV3_1aPpParser::elsif_directive_one_line() {
   Elsif_directive_one_lineContext *_localctx = _tracker.createInstance<Elsif_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 52, SV3_1aPpParser::RuleElsif_directive_one_line);
@@ -3580,14 +3357,6 @@
     parserListener->exitElsif_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Elsif_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElsif_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Elsif_directiveContext* SV3_1aPpParser::elsif_directive() {
   Elsif_directiveContext *_localctx = _tracker.createInstance<Elsif_directiveContext>(_ctx, getState());
   enterRule(_localctx, 54, SV3_1aPpParser::RuleElsif_directive);
@@ -3680,14 +3449,6 @@
     parserListener->exitElsif_directive_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Elsif_directive_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElsif_directive_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Elsif_directive_in_macro_bodyContext* SV3_1aPpParser::elsif_directive_in_macro_body() {
   Elsif_directive_in_macro_bodyContext *_localctx = _tracker.createInstance<Elsif_directive_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 56, SV3_1aPpParser::RuleElsif_directive_in_macro_body);
@@ -3781,14 +3542,6 @@
     parserListener->exitElseif_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Elseif_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElseif_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Elseif_directive_one_lineContext* SV3_1aPpParser::elseif_directive_one_line() {
   Elseif_directive_one_lineContext *_localctx = _tracker.createInstance<Elseif_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 58, SV3_1aPpParser::RuleElseif_directive_one_line);
@@ -3874,14 +3627,6 @@
     parserListener->exitElseif_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Elseif_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElseif_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Elseif_directiveContext* SV3_1aPpParser::elseif_directive() {
   Elseif_directiveContext *_localctx = _tracker.createInstance<Elseif_directiveContext>(_ctx, getState());
   enterRule(_localctx, 60, SV3_1aPpParser::RuleElseif_directive);
@@ -3974,14 +3719,6 @@
     parserListener->exitElseif_directive_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Elseif_directive_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElseif_directive_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Elseif_directive_in_macro_bodyContext* SV3_1aPpParser::elseif_directive_in_macro_body() {
   Elseif_directive_in_macro_bodyContext *_localctx = _tracker.createInstance<Elseif_directive_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 62, SV3_1aPpParser::RuleElseif_directive_in_macro_body);
@@ -4075,14 +3812,6 @@
     parserListener->exitElse_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Else_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElse_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Else_directive_one_lineContext* SV3_1aPpParser::else_directive_one_line() {
   Else_directive_one_lineContext *_localctx = _tracker.createInstance<Else_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 64, SV3_1aPpParser::RuleElse_directive_one_line);
@@ -4152,14 +3881,6 @@
     parserListener->exitElse_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Else_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitElse_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Else_directiveContext* SV3_1aPpParser::else_directive() {
   Else_directiveContext *_localctx = _tracker.createInstance<Else_directiveContext>(_ctx, getState());
   enterRule(_localctx, 66, SV3_1aPpParser::RuleElse_directive);
@@ -4229,14 +3950,6 @@
     parserListener->exitEndif_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endif_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndif_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endif_directive_one_lineContext* SV3_1aPpParser::endif_directive_one_line() {
   Endif_directive_one_lineContext *_localctx = _tracker.createInstance<Endif_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 68, SV3_1aPpParser::RuleEndif_directive_one_line);
@@ -4347,14 +4060,6 @@
     parserListener->exitEndif_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endif_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndif_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endif_directiveContext* SV3_1aPpParser::endif_directive() {
   Endif_directiveContext *_localctx = _tracker.createInstance<Endif_directiveContext>(_ctx, getState());
   enterRule(_localctx, 70, SV3_1aPpParser::RuleEndif_directive);
@@ -4444,14 +4149,6 @@
     parserListener->exitResetall_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Resetall_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitResetall_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Resetall_directive_one_lineContext* SV3_1aPpParser::resetall_directive_one_line() {
   Resetall_directive_one_lineContext *_localctx = _tracker.createInstance<Resetall_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 72, SV3_1aPpParser::RuleResetall_directive_one_line);
@@ -4514,14 +4211,6 @@
     parserListener->exitResetall_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Resetall_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitResetall_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Resetall_directiveContext* SV3_1aPpParser::resetall_directive() {
   Resetall_directiveContext *_localctx = _tracker.createInstance<Resetall_directiveContext>(_ctx, getState());
   enterRule(_localctx, 74, SV3_1aPpParser::RuleResetall_directive);
@@ -4583,14 +4272,6 @@
     parserListener->exitBegin_keywords_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Begin_keywords_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitBegin_keywords_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Begin_keywords_directive_one_lineContext* SV3_1aPpParser::begin_keywords_directive_one_line() {
   Begin_keywords_directive_one_lineContext *_localctx = _tracker.createInstance<Begin_keywords_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 76, SV3_1aPpParser::RuleBegin_keywords_directive_one_line);
@@ -4661,14 +4342,6 @@
     parserListener->exitBegin_keywords_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Begin_keywords_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitBegin_keywords_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Begin_keywords_directiveContext* SV3_1aPpParser::begin_keywords_directive() {
   Begin_keywords_directiveContext *_localctx = _tracker.createInstance<Begin_keywords_directiveContext>(_ctx, getState());
   enterRule(_localctx, 78, SV3_1aPpParser::RuleBegin_keywords_directive);
@@ -4734,14 +4407,6 @@
     parserListener->exitEnd_keywords_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::End_keywords_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEnd_keywords_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::End_keywords_directive_one_lineContext* SV3_1aPpParser::end_keywords_directive_one_line() {
   End_keywords_directive_one_lineContext *_localctx = _tracker.createInstance<End_keywords_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 80, SV3_1aPpParser::RuleEnd_keywords_directive_one_line);
@@ -4804,14 +4469,6 @@
     parserListener->exitEnd_keywords_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::End_keywords_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEnd_keywords_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::End_keywords_directiveContext* SV3_1aPpParser::end_keywords_directive() {
   End_keywords_directiveContext *_localctx = _tracker.createInstance<End_keywords_directiveContext>(_ctx, getState());
   enterRule(_localctx, 82, SV3_1aPpParser::RuleEnd_keywords_directive);
@@ -4873,14 +4530,6 @@
     parserListener->exitPragma_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Pragma_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitPragma_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Pragma_directive_one_lineContext* SV3_1aPpParser::pragma_directive_one_line() {
   Pragma_directive_one_lineContext *_localctx = _tracker.createInstance<Pragma_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 84, SV3_1aPpParser::RulePragma_directive_one_line);
@@ -4967,14 +4616,6 @@
     parserListener->exitPragma_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Pragma_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitPragma_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Pragma_directiveContext* SV3_1aPpParser::pragma_directive() {
   Pragma_directiveContext *_localctx = _tracker.createInstance<Pragma_directiveContext>(_ctx, getState());
   enterRule(_localctx, 86, SV3_1aPpParser::RulePragma_directive);
@@ -5067,14 +4708,6 @@
     parserListener->exitCelldefine_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Celldefine_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitCelldefine_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Celldefine_directive_one_lineContext* SV3_1aPpParser::celldefine_directive_one_line() {
   Celldefine_directive_one_lineContext *_localctx = _tracker.createInstance<Celldefine_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 88, SV3_1aPpParser::RuleCelldefine_directive_one_line);
@@ -5137,14 +4770,6 @@
     parserListener->exitCelldefine_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Celldefine_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitCelldefine_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Celldefine_directiveContext* SV3_1aPpParser::celldefine_directive() {
   Celldefine_directiveContext *_localctx = _tracker.createInstance<Celldefine_directiveContext>(_ctx, getState());
   enterRule(_localctx, 90, SV3_1aPpParser::RuleCelldefine_directive);
@@ -5206,14 +4831,6 @@
     parserListener->exitEndcelldefine_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endcelldefine_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndcelldefine_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endcelldefine_directive_one_lineContext* SV3_1aPpParser::endcelldefine_directive_one_line() {
   Endcelldefine_directive_one_lineContext *_localctx = _tracker.createInstance<Endcelldefine_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 92, SV3_1aPpParser::RuleEndcelldefine_directive_one_line);
@@ -5276,14 +4893,6 @@
     parserListener->exitEndcelldefine_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endcelldefine_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndcelldefine_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endcelldefine_directiveContext* SV3_1aPpParser::endcelldefine_directive() {
   Endcelldefine_directiveContext *_localctx = _tracker.createInstance<Endcelldefine_directiveContext>(_ctx, getState());
   enterRule(_localctx, 94, SV3_1aPpParser::RuleEndcelldefine_directive);
@@ -5345,14 +4954,6 @@
     parserListener->exitProtect_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Protect_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitProtect_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Protect_directive_one_lineContext* SV3_1aPpParser::protect_directive_one_line() {
   Protect_directive_one_lineContext *_localctx = _tracker.createInstance<Protect_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 96, SV3_1aPpParser::RuleProtect_directive_one_line);
@@ -5415,14 +5016,6 @@
     parserListener->exitProtect_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Protect_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitProtect_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Protect_directiveContext* SV3_1aPpParser::protect_directive() {
   Protect_directiveContext *_localctx = _tracker.createInstance<Protect_directiveContext>(_ctx, getState());
   enterRule(_localctx, 98, SV3_1aPpParser::RuleProtect_directive);
@@ -5484,14 +5077,6 @@
     parserListener->exitEndprotect_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endprotect_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndprotect_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endprotect_directive_one_lineContext* SV3_1aPpParser::endprotect_directive_one_line() {
   Endprotect_directive_one_lineContext *_localctx = _tracker.createInstance<Endprotect_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 100, SV3_1aPpParser::RuleEndprotect_directive_one_line);
@@ -5554,14 +5139,6 @@
     parserListener->exitEndprotect_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endprotect_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndprotect_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endprotect_directiveContext* SV3_1aPpParser::endprotect_directive() {
   Endprotect_directiveContext *_localctx = _tracker.createInstance<Endprotect_directiveContext>(_ctx, getState());
   enterRule(_localctx, 102, SV3_1aPpParser::RuleEndprotect_directive);
@@ -5623,14 +5200,6 @@
     parserListener->exitProtected_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Protected_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitProtected_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Protected_directive_one_lineContext* SV3_1aPpParser::protected_directive_one_line() {
   Protected_directive_one_lineContext *_localctx = _tracker.createInstance<Protected_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 104, SV3_1aPpParser::RuleProtected_directive_one_line);
@@ -5693,14 +5262,6 @@
     parserListener->exitProtected_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Protected_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitProtected_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Protected_directiveContext* SV3_1aPpParser::protected_directive() {
   Protected_directiveContext *_localctx = _tracker.createInstance<Protected_directiveContext>(_ctx, getState());
   enterRule(_localctx, 106, SV3_1aPpParser::RuleProtected_directive);
@@ -5762,14 +5323,6 @@
     parserListener->exitEndprotected_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endprotected_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndprotected_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endprotected_directive_one_lineContext* SV3_1aPpParser::endprotected_directive_one_line() {
   Endprotected_directive_one_lineContext *_localctx = _tracker.createInstance<Endprotected_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 108, SV3_1aPpParser::RuleEndprotected_directive_one_line);
@@ -5832,14 +5385,6 @@
     parserListener->exitEndprotected_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Endprotected_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndprotected_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Endprotected_directiveContext* SV3_1aPpParser::endprotected_directive() {
   Endprotected_directiveContext *_localctx = _tracker.createInstance<Endprotected_directiveContext>(_ctx, getState());
   enterRule(_localctx, 110, SV3_1aPpParser::RuleEndprotected_directive);
@@ -5901,14 +5446,6 @@
     parserListener->exitExpand_vectornets_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Expand_vectornets_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitExpand_vectornets_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Expand_vectornets_directive_one_lineContext* SV3_1aPpParser::expand_vectornets_directive_one_line() {
   Expand_vectornets_directive_one_lineContext *_localctx = _tracker.createInstance<Expand_vectornets_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 112, SV3_1aPpParser::RuleExpand_vectornets_directive_one_line);
@@ -5971,14 +5508,6 @@
     parserListener->exitExpand_vectornets_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Expand_vectornets_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitExpand_vectornets_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Expand_vectornets_directiveContext* SV3_1aPpParser::expand_vectornets_directive() {
   Expand_vectornets_directiveContext *_localctx = _tracker.createInstance<Expand_vectornets_directiveContext>(_ctx, getState());
   enterRule(_localctx, 114, SV3_1aPpParser::RuleExpand_vectornets_directive);
@@ -6040,14 +5569,6 @@
     parserListener->exitNoexpand_vectornets_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noexpand_vectornets_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoexpand_vectornets_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noexpand_vectornets_directive_one_lineContext* SV3_1aPpParser::noexpand_vectornets_directive_one_line() {
   Noexpand_vectornets_directive_one_lineContext *_localctx = _tracker.createInstance<Noexpand_vectornets_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 116, SV3_1aPpParser::RuleNoexpand_vectornets_directive_one_line);
@@ -6110,14 +5631,6 @@
     parserListener->exitNoexpand_vectornets_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noexpand_vectornets_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoexpand_vectornets_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noexpand_vectornets_directiveContext* SV3_1aPpParser::noexpand_vectornets_directive() {
   Noexpand_vectornets_directiveContext *_localctx = _tracker.createInstance<Noexpand_vectornets_directiveContext>(_ctx, getState());
   enterRule(_localctx, 118, SV3_1aPpParser::RuleNoexpand_vectornets_directive);
@@ -6179,14 +5692,6 @@
     parserListener->exitAutoexpand_vectornets_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Autoexpand_vectornets_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitAutoexpand_vectornets_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Autoexpand_vectornets_directive_one_lineContext* SV3_1aPpParser::autoexpand_vectornets_directive_one_line() {
   Autoexpand_vectornets_directive_one_lineContext *_localctx = _tracker.createInstance<Autoexpand_vectornets_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 120, SV3_1aPpParser::RuleAutoexpand_vectornets_directive_one_line);
@@ -6249,14 +5754,6 @@
     parserListener->exitAutoexpand_vectornets_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Autoexpand_vectornets_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitAutoexpand_vectornets_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Autoexpand_vectornets_directiveContext* SV3_1aPpParser::autoexpand_vectornets_directive() {
   Autoexpand_vectornets_directiveContext *_localctx = _tracker.createInstance<Autoexpand_vectornets_directiveContext>(_ctx, getState());
   enterRule(_localctx, 122, SV3_1aPpParser::RuleAutoexpand_vectornets_directive);
@@ -6310,14 +5807,6 @@
     parserListener->exitUselib_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Uselib_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUselib_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Uselib_directive_one_lineContext* SV3_1aPpParser::uselib_directive_one_line() {
   Uselib_directive_one_lineContext *_localctx = _tracker.createInstance<Uselib_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 124, SV3_1aPpParser::RuleUselib_directive_one_line);
@@ -6377,14 +5866,6 @@
     parserListener->exitUselib_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Uselib_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUselib_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Uselib_directiveContext* SV3_1aPpParser::uselib_directive() {
   Uselib_directiveContext *_localctx = _tracker.createInstance<Uselib_directiveContext>(_ctx, getState());
   enterRule(_localctx, 126, SV3_1aPpParser::RuleUselib_directive);
@@ -6465,14 +5946,6 @@
     parserListener->exitDisable_portfaults_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Disable_portfaults_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDisable_portfaults_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Disable_portfaults_directive_one_lineContext* SV3_1aPpParser::disable_portfaults_directive_one_line() {
   Disable_portfaults_directive_one_lineContext *_localctx = _tracker.createInstance<Disable_portfaults_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 128, SV3_1aPpParser::RuleDisable_portfaults_directive_one_line);
@@ -6535,14 +6008,6 @@
     parserListener->exitDisable_portfaults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Disable_portfaults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDisable_portfaults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Disable_portfaults_directiveContext* SV3_1aPpParser::disable_portfaults_directive() {
   Disable_portfaults_directiveContext *_localctx = _tracker.createInstance<Disable_portfaults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 130, SV3_1aPpParser::RuleDisable_portfaults_directive);
@@ -6604,14 +6069,6 @@
     parserListener->exitEnable_portfaults_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Enable_portfaults_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEnable_portfaults_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Enable_portfaults_directive_one_lineContext* SV3_1aPpParser::enable_portfaults_directive_one_line() {
   Enable_portfaults_directive_one_lineContext *_localctx = _tracker.createInstance<Enable_portfaults_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 132, SV3_1aPpParser::RuleEnable_portfaults_directive_one_line);
@@ -6674,14 +6131,6 @@
     parserListener->exitEnable_portfaults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Enable_portfaults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEnable_portfaults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Enable_portfaults_directiveContext* SV3_1aPpParser::enable_portfaults_directive() {
   Enable_portfaults_directiveContext *_localctx = _tracker.createInstance<Enable_portfaults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 134, SV3_1aPpParser::RuleEnable_portfaults_directive);
@@ -6743,14 +6192,6 @@
     parserListener->exitNosuppress_faults_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Nosuppress_faults_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNosuppress_faults_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Nosuppress_faults_directive_one_lineContext* SV3_1aPpParser::nosuppress_faults_directive_one_line() {
   Nosuppress_faults_directive_one_lineContext *_localctx = _tracker.createInstance<Nosuppress_faults_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 136, SV3_1aPpParser::RuleNosuppress_faults_directive_one_line);
@@ -6813,14 +6254,6 @@
     parserListener->exitNosuppress_faults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Nosuppress_faults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNosuppress_faults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Nosuppress_faults_directiveContext* SV3_1aPpParser::nosuppress_faults_directive() {
   Nosuppress_faults_directiveContext *_localctx = _tracker.createInstance<Nosuppress_faults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 138, SV3_1aPpParser::RuleNosuppress_faults_directive);
@@ -6882,14 +6315,6 @@
     parserListener->exitSuppress_faults_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Suppress_faults_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSuppress_faults_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Suppress_faults_directive_one_lineContext* SV3_1aPpParser::suppress_faults_directive_one_line() {
   Suppress_faults_directive_one_lineContext *_localctx = _tracker.createInstance<Suppress_faults_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 140, SV3_1aPpParser::RuleSuppress_faults_directive_one_line);
@@ -6952,14 +6377,6 @@
     parserListener->exitSuppress_faults_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Suppress_faults_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSuppress_faults_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Suppress_faults_directiveContext* SV3_1aPpParser::suppress_faults_directive() {
   Suppress_faults_directiveContext *_localctx = _tracker.createInstance<Suppress_faults_directiveContext>(_ctx, getState());
   enterRule(_localctx, 142, SV3_1aPpParser::RuleSuppress_faults_directive);
@@ -7021,14 +6438,6 @@
     parserListener->exitSigned_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Signed_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSigned_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Signed_directive_one_lineContext* SV3_1aPpParser::signed_directive_one_line() {
   Signed_directive_one_lineContext *_localctx = _tracker.createInstance<Signed_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 144, SV3_1aPpParser::RuleSigned_directive_one_line);
@@ -7091,14 +6500,6 @@
     parserListener->exitSigned_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Signed_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSigned_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Signed_directiveContext* SV3_1aPpParser::signed_directive() {
   Signed_directiveContext *_localctx = _tracker.createInstance<Signed_directiveContext>(_ctx, getState());
   enterRule(_localctx, 146, SV3_1aPpParser::RuleSigned_directive);
@@ -7160,14 +6561,6 @@
     parserListener->exitUnsigned_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Unsigned_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUnsigned_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Unsigned_directive_one_lineContext* SV3_1aPpParser::unsigned_directive_one_line() {
   Unsigned_directive_one_lineContext *_localctx = _tracker.createInstance<Unsigned_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 148, SV3_1aPpParser::RuleUnsigned_directive_one_line);
@@ -7230,14 +6623,6 @@
     parserListener->exitUnsigned_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Unsigned_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUnsigned_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Unsigned_directiveContext* SV3_1aPpParser::unsigned_directive() {
   Unsigned_directiveContext *_localctx = _tracker.createInstance<Unsigned_directiveContext>(_ctx, getState());
   enterRule(_localctx, 150, SV3_1aPpParser::RuleUnsigned_directive);
@@ -7299,14 +6684,6 @@
     parserListener->exitRemove_gatename_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Remove_gatename_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitRemove_gatename_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Remove_gatename_directive_one_lineContext* SV3_1aPpParser::remove_gatename_directive_one_line() {
   Remove_gatename_directive_one_lineContext *_localctx = _tracker.createInstance<Remove_gatename_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 152, SV3_1aPpParser::RuleRemove_gatename_directive_one_line);
@@ -7369,14 +6746,6 @@
     parserListener->exitRemove_gatename_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Remove_gatename_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitRemove_gatename_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Remove_gatename_directiveContext* SV3_1aPpParser::remove_gatename_directive() {
   Remove_gatename_directiveContext *_localctx = _tracker.createInstance<Remove_gatename_directiveContext>(_ctx, getState());
   enterRule(_localctx, 154, SV3_1aPpParser::RuleRemove_gatename_directive);
@@ -7438,14 +6807,6 @@
     parserListener->exitNoremove_gatenames_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noremove_gatenames_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoremove_gatenames_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noremove_gatenames_directive_one_lineContext* SV3_1aPpParser::noremove_gatenames_directive_one_line() {
   Noremove_gatenames_directive_one_lineContext *_localctx = _tracker.createInstance<Noremove_gatenames_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 156, SV3_1aPpParser::RuleNoremove_gatenames_directive_one_line);
@@ -7508,14 +6869,6 @@
     parserListener->exitNoremove_gatenames_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noremove_gatenames_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoremove_gatenames_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noremove_gatenames_directiveContext* SV3_1aPpParser::noremove_gatenames_directive() {
   Noremove_gatenames_directiveContext *_localctx = _tracker.createInstance<Noremove_gatenames_directiveContext>(_ctx, getState());
   enterRule(_localctx, 158, SV3_1aPpParser::RuleNoremove_gatenames_directive);
@@ -7577,14 +6930,6 @@
     parserListener->exitRemove_netname_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Remove_netname_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitRemove_netname_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Remove_netname_directive_one_lineContext* SV3_1aPpParser::remove_netname_directive_one_line() {
   Remove_netname_directive_one_lineContext *_localctx = _tracker.createInstance<Remove_netname_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 160, SV3_1aPpParser::RuleRemove_netname_directive_one_line);
@@ -7647,14 +6992,6 @@
     parserListener->exitRemove_netname_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Remove_netname_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitRemove_netname_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Remove_netname_directiveContext* SV3_1aPpParser::remove_netname_directive() {
   Remove_netname_directiveContext *_localctx = _tracker.createInstance<Remove_netname_directiveContext>(_ctx, getState());
   enterRule(_localctx, 162, SV3_1aPpParser::RuleRemove_netname_directive);
@@ -7716,14 +7053,6 @@
     parserListener->exitNoremove_netnames_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noremove_netnames_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoremove_netnames_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noremove_netnames_directive_one_lineContext* SV3_1aPpParser::noremove_netnames_directive_one_line() {
   Noremove_netnames_directive_one_lineContext *_localctx = _tracker.createInstance<Noremove_netnames_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 164, SV3_1aPpParser::RuleNoremove_netnames_directive_one_line);
@@ -7786,14 +7115,6 @@
     parserListener->exitNoremove_netnames_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noremove_netnames_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoremove_netnames_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noremove_netnames_directiveContext* SV3_1aPpParser::noremove_netnames_directive() {
   Noremove_netnames_directiveContext *_localctx = _tracker.createInstance<Noremove_netnames_directiveContext>(_ctx, getState());
   enterRule(_localctx, 166, SV3_1aPpParser::RuleNoremove_netnames_directive);
@@ -7855,14 +7176,6 @@
     parserListener->exitAccelerate_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Accelerate_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitAccelerate_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Accelerate_directive_one_lineContext* SV3_1aPpParser::accelerate_directive_one_line() {
   Accelerate_directive_one_lineContext *_localctx = _tracker.createInstance<Accelerate_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 168, SV3_1aPpParser::RuleAccelerate_directive_one_line);
@@ -7925,14 +7238,6 @@
     parserListener->exitAccelerate_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Accelerate_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitAccelerate_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Accelerate_directiveContext* SV3_1aPpParser::accelerate_directive() {
   Accelerate_directiveContext *_localctx = _tracker.createInstance<Accelerate_directiveContext>(_ctx, getState());
   enterRule(_localctx, 170, SV3_1aPpParser::RuleAccelerate_directive);
@@ -7994,14 +7299,6 @@
     parserListener->exitNoaccelerate_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noaccelerate_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoaccelerate_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noaccelerate_directive_one_lineContext* SV3_1aPpParser::noaccelerate_directive_one_line() {
   Noaccelerate_directive_one_lineContext *_localctx = _tracker.createInstance<Noaccelerate_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 172, SV3_1aPpParser::RuleNoaccelerate_directive_one_line);
@@ -8064,14 +7361,6 @@
     parserListener->exitNoaccelerate_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Noaccelerate_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNoaccelerate_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Noaccelerate_directiveContext* SV3_1aPpParser::noaccelerate_directive() {
   Noaccelerate_directiveContext *_localctx = _tracker.createInstance<Noaccelerate_directiveContext>(_ctx, getState());
   enterRule(_localctx, 174, SV3_1aPpParser::RuleNoaccelerate_directive);
@@ -8133,14 +7422,6 @@
     parserListener->exitDefault_trireg_strenght_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Default_trireg_strenght_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_trireg_strenght_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Default_trireg_strenght_directive_one_lineContext* SV3_1aPpParser::default_trireg_strenght_directive_one_line() {
   Default_trireg_strenght_directive_one_lineContext *_localctx = _tracker.createInstance<Default_trireg_strenght_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 176, SV3_1aPpParser::RuleDefault_trireg_strenght_directive_one_line);
@@ -8211,14 +7492,6 @@
     parserListener->exitDefault_trireg_strenght_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Default_trireg_strenght_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_trireg_strenght_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Default_trireg_strenght_directiveContext* SV3_1aPpParser::default_trireg_strenght_directive() {
   Default_trireg_strenght_directiveContext *_localctx = _tracker.createInstance<Default_trireg_strenght_directiveContext>(_ctx, getState());
   enterRule(_localctx, 178, SV3_1aPpParser::RuleDefault_trireg_strenght_directive);
@@ -8284,14 +7557,6 @@
     parserListener->exitDefault_decay_time_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Default_decay_time_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_decay_time_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Default_decay_time_directive_one_lineContext* SV3_1aPpParser::default_decay_time_directive_one_line() {
   Default_decay_time_directive_one_lineContext *_localctx = _tracker.createInstance<Default_decay_time_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 180, SV3_1aPpParser::RuleDefault_decay_time_directive_one_line);
@@ -8370,14 +7635,6 @@
     parserListener->exitDefault_decay_time_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Default_decay_time_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_decay_time_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Default_decay_time_directiveContext* SV3_1aPpParser::default_decay_time_directive() {
   Default_decay_time_directiveContext *_localctx = _tracker.createInstance<Default_decay_time_directiveContext>(_ctx, getState());
   enterRule(_localctx, 182, SV3_1aPpParser::RuleDefault_decay_time_directive);
@@ -8465,14 +7722,6 @@
     parserListener->exitUnconnected_drive_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Unconnected_drive_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUnconnected_drive_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Unconnected_drive_directive_one_lineContext* SV3_1aPpParser::unconnected_drive_directive_one_line() {
   Unconnected_drive_directive_one_lineContext *_localctx = _tracker.createInstance<Unconnected_drive_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 184, SV3_1aPpParser::RuleUnconnected_drive_directive_one_line);
@@ -8543,14 +7792,6 @@
     parserListener->exitUnconnected_drive_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Unconnected_drive_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUnconnected_drive_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Unconnected_drive_directiveContext* SV3_1aPpParser::unconnected_drive_directive() {
   Unconnected_drive_directiveContext *_localctx = _tracker.createInstance<Unconnected_drive_directiveContext>(_ctx, getState());
   enterRule(_localctx, 186, SV3_1aPpParser::RuleUnconnected_drive_directive);
@@ -8616,14 +7857,6 @@
     parserListener->exitNounconnected_drive_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Nounconnected_drive_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNounconnected_drive_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Nounconnected_drive_directive_one_lineContext* SV3_1aPpParser::nounconnected_drive_directive_one_line() {
   Nounconnected_drive_directive_one_lineContext *_localctx = _tracker.createInstance<Nounconnected_drive_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 188, SV3_1aPpParser::RuleNounconnected_drive_directive_one_line);
@@ -8686,14 +7919,6 @@
     parserListener->exitNounconnected_drive_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Nounconnected_drive_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitNounconnected_drive_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Nounconnected_drive_directiveContext* SV3_1aPpParser::nounconnected_drive_directive() {
   Nounconnected_drive_directiveContext *_localctx = _tracker.createInstance<Nounconnected_drive_directiveContext>(_ctx, getState());
   enterRule(_localctx, 190, SV3_1aPpParser::RuleNounconnected_drive_directive);
@@ -8755,14 +7980,6 @@
     parserListener->exitDelay_mode_distributed_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_distributed_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_distributed_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_distributed_directive_one_lineContext* SV3_1aPpParser::delay_mode_distributed_directive_one_line() {
   Delay_mode_distributed_directive_one_lineContext *_localctx = _tracker.createInstance<Delay_mode_distributed_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 192, SV3_1aPpParser::RuleDelay_mode_distributed_directive_one_line);
@@ -8825,14 +8042,6 @@
     parserListener->exitDelay_mode_distributed_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_distributed_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_distributed_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_distributed_directiveContext* SV3_1aPpParser::delay_mode_distributed_directive() {
   Delay_mode_distributed_directiveContext *_localctx = _tracker.createInstance<Delay_mode_distributed_directiveContext>(_ctx, getState());
   enterRule(_localctx, 194, SV3_1aPpParser::RuleDelay_mode_distributed_directive);
@@ -8894,14 +8103,6 @@
     parserListener->exitDelay_mode_path_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_path_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_path_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_path_directive_one_lineContext* SV3_1aPpParser::delay_mode_path_directive_one_line() {
   Delay_mode_path_directive_one_lineContext *_localctx = _tracker.createInstance<Delay_mode_path_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 196, SV3_1aPpParser::RuleDelay_mode_path_directive_one_line);
@@ -8964,14 +8165,6 @@
     parserListener->exitDelay_mode_path_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_path_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_path_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_path_directiveContext* SV3_1aPpParser::delay_mode_path_directive() {
   Delay_mode_path_directiveContext *_localctx = _tracker.createInstance<Delay_mode_path_directiveContext>(_ctx, getState());
   enterRule(_localctx, 198, SV3_1aPpParser::RuleDelay_mode_path_directive);
@@ -9033,14 +8226,6 @@
     parserListener->exitDelay_mode_unit_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_unit_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_unit_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_unit_directive_one_lineContext* SV3_1aPpParser::delay_mode_unit_directive_one_line() {
   Delay_mode_unit_directive_one_lineContext *_localctx = _tracker.createInstance<Delay_mode_unit_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 200, SV3_1aPpParser::RuleDelay_mode_unit_directive_one_line);
@@ -9103,14 +8288,6 @@
     parserListener->exitDelay_mode_unit_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_unit_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_unit_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_unit_directiveContext* SV3_1aPpParser::delay_mode_unit_directive() {
   Delay_mode_unit_directiveContext *_localctx = _tracker.createInstance<Delay_mode_unit_directiveContext>(_ctx, getState());
   enterRule(_localctx, 202, SV3_1aPpParser::RuleDelay_mode_unit_directive);
@@ -9172,14 +8349,6 @@
     parserListener->exitDelay_mode_zero_directive_one_line(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_zero_directive_one_lineContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_zero_directive_one_line(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_zero_directive_one_lineContext* SV3_1aPpParser::delay_mode_zero_directive_one_line() {
   Delay_mode_zero_directive_one_lineContext *_localctx = _tracker.createInstance<Delay_mode_zero_directive_one_lineContext>(_ctx, getState());
   enterRule(_localctx, 204, SV3_1aPpParser::RuleDelay_mode_zero_directive_one_line);
@@ -9242,14 +8411,6 @@
     parserListener->exitDelay_mode_zero_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Delay_mode_zero_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDelay_mode_zero_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Delay_mode_zero_directiveContext* SV3_1aPpParser::delay_mode_zero_directive() {
   Delay_mode_zero_directiveContext *_localctx = _tracker.createInstance<Delay_mode_zero_directiveContext>(_ctx, getState());
   enterRule(_localctx, 206, SV3_1aPpParser::RuleDelay_mode_zero_directive);
@@ -9299,14 +8460,6 @@
     parserListener->exitUndefineall_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Undefineall_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitUndefineall_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Undefineall_directiveContext* SV3_1aPpParser::undefineall_directive() {
   Undefineall_directiveContext *_localctx = _tracker.createInstance<Undefineall_directiveContext>(_ctx, getState());
   enterRule(_localctx, 208, SV3_1aPpParser::RuleUndefineall_directive);
@@ -9356,14 +8509,6 @@
     parserListener->exitModule(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::ModuleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitModule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::ModuleContext* SV3_1aPpParser::module() {
   ModuleContext *_localctx = _tracker.createInstance<ModuleContext>(_ctx, getState());
   enterRule(_localctx, 210, SV3_1aPpParser::RuleModule);
@@ -9413,14 +8558,6 @@
     parserListener->exitEndmodule(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::EndmoduleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndmodule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::EndmoduleContext* SV3_1aPpParser::endmodule() {
   EndmoduleContext *_localctx = _tracker.createInstance<EndmoduleContext>(_ctx, getState());
   enterRule(_localctx, 212, SV3_1aPpParser::RuleEndmodule);
@@ -9470,14 +8607,6 @@
     parserListener->exitSv_interface(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Sv_interfaceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSv_interface(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Sv_interfaceContext* SV3_1aPpParser::sv_interface() {
   Sv_interfaceContext *_localctx = _tracker.createInstance<Sv_interfaceContext>(_ctx, getState());
   enterRule(_localctx, 214, SV3_1aPpParser::RuleSv_interface);
@@ -9527,14 +8656,6 @@
     parserListener->exitEndinterface(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::EndinterfaceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndinterface(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::EndinterfaceContext* SV3_1aPpParser::endinterface() {
   EndinterfaceContext *_localctx = _tracker.createInstance<EndinterfaceContext>(_ctx, getState());
   enterRule(_localctx, 216, SV3_1aPpParser::RuleEndinterface);
@@ -9584,14 +8705,6 @@
     parserListener->exitProgram(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::ProgramContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitProgram(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::ProgramContext* SV3_1aPpParser::program() {
   ProgramContext *_localctx = _tracker.createInstance<ProgramContext>(_ctx, getState());
   enterRule(_localctx, 218, SV3_1aPpParser::RuleProgram);
@@ -9641,14 +8754,6 @@
     parserListener->exitEndprogram(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::EndprogramContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndprogram(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::EndprogramContext* SV3_1aPpParser::endprogram() {
   EndprogramContext *_localctx = _tracker.createInstance<EndprogramContext>(_ctx, getState());
   enterRule(_localctx, 220, SV3_1aPpParser::RuleEndprogram);
@@ -9698,14 +8803,6 @@
     parserListener->exitPrimitive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::PrimitiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitPrimitive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::PrimitiveContext* SV3_1aPpParser::primitive() {
   PrimitiveContext *_localctx = _tracker.createInstance<PrimitiveContext>(_ctx, getState());
   enterRule(_localctx, 222, SV3_1aPpParser::RulePrimitive);
@@ -9755,14 +8852,6 @@
     parserListener->exitEndprimitive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::EndprimitiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndprimitive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::EndprimitiveContext* SV3_1aPpParser::endprimitive() {
   EndprimitiveContext *_localctx = _tracker.createInstance<EndprimitiveContext>(_ctx, getState());
   enterRule(_localctx, 224, SV3_1aPpParser::RuleEndprimitive);
@@ -9812,14 +8901,6 @@
     parserListener->exitSv_package(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Sv_packageContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSv_package(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Sv_packageContext* SV3_1aPpParser::sv_package() {
   Sv_packageContext *_localctx = _tracker.createInstance<Sv_packageContext>(_ctx, getState());
   enterRule(_localctx, 226, SV3_1aPpParser::RuleSv_package);
@@ -9869,14 +8950,6 @@
     parserListener->exitEndpackage(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::EndpackageContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndpackage(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::EndpackageContext* SV3_1aPpParser::endpackage() {
   EndpackageContext *_localctx = _tracker.createInstance<EndpackageContext>(_ctx, getState());
   enterRule(_localctx, 228, SV3_1aPpParser::RuleEndpackage);
@@ -9926,14 +8999,6 @@
     parserListener->exitChecker(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::CheckerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitChecker(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::CheckerContext* SV3_1aPpParser::checker() {
   CheckerContext *_localctx = _tracker.createInstance<CheckerContext>(_ctx, getState());
   enterRule(_localctx, 230, SV3_1aPpParser::RuleChecker);
@@ -9983,14 +9048,6 @@
     parserListener->exitEndchecker(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::EndcheckerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndchecker(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::EndcheckerContext* SV3_1aPpParser::endchecker() {
   EndcheckerContext *_localctx = _tracker.createInstance<EndcheckerContext>(_ctx, getState());
   enterRule(_localctx, 232, SV3_1aPpParser::RuleEndchecker);
@@ -10040,14 +9097,6 @@
     parserListener->exitConfig(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::ConfigContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitConfig(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::ConfigContext* SV3_1aPpParser::config() {
   ConfigContext *_localctx = _tracker.createInstance<ConfigContext>(_ctx, getState());
   enterRule(_localctx, 234, SV3_1aPpParser::RuleConfig);
@@ -10097,14 +9146,6 @@
     parserListener->exitEndconfig(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::EndconfigContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEndconfig(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::EndconfigContext* SV3_1aPpParser::endconfig() {
   EndconfigContext *_localctx = _tracker.createInstance<EndconfigContext>(_ctx, getState());
   enterRule(_localctx, 236, SV3_1aPpParser::RuleEndconfig);
@@ -10174,14 +9215,6 @@
     parserListener->exitDefine_directive(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Define_directiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefine_directive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Define_directiveContext* SV3_1aPpParser::define_directive() {
   Define_directiveContext *_localctx = _tracker.createInstance<Define_directiveContext>(_ctx, getState());
   enterRule(_localctx, 238, SV3_1aPpParser::RuleDefine_directive);
@@ -10277,14 +9310,6 @@
     parserListener->exitMultiline_no_args_macro_definition(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Multiline_no_args_macro_definitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMultiline_no_args_macro_definition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Multiline_no_args_macro_definitionContext* SV3_1aPpParser::multiline_no_args_macro_definition() {
   Multiline_no_args_macro_definitionContext *_localctx = _tracker.createInstance<Multiline_no_args_macro_definitionContext>(_ctx, getState());
   enterRule(_localctx, 240, SV3_1aPpParser::RuleMultiline_no_args_macro_definition);
@@ -10387,14 +9412,6 @@
     parserListener->exitMultiline_args_macro_definition(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Multiline_args_macro_definitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMultiline_args_macro_definition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Multiline_args_macro_definitionContext* SV3_1aPpParser::multiline_args_macro_definition() {
   Multiline_args_macro_definitionContext *_localctx = _tracker.createInstance<Multiline_args_macro_definitionContext>(_ctx, getState());
   enterRule(_localctx, 242, SV3_1aPpParser::RuleMultiline_args_macro_definition);
@@ -10503,14 +9520,6 @@
     parserListener->exitSimple_no_args_macro_definition(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Simple_no_args_macro_definitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_no_args_macro_definition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Simple_no_args_macro_definitionContext* SV3_1aPpParser::simple_no_args_macro_definition() {
   Simple_no_args_macro_definitionContext *_localctx = _tracker.createInstance<Simple_no_args_macro_definitionContext>(_ctx, getState());
   enterRule(_localctx, 244, SV3_1aPpParser::RuleSimple_no_args_macro_definition);
@@ -10659,14 +9668,6 @@
     parserListener->exitSimple_args_macro_definition(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Simple_args_macro_definitionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_args_macro_definition(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Simple_args_macro_definitionContext* SV3_1aPpParser::simple_args_macro_definition() {
   Simple_args_macro_definitionContext *_localctx = _tracker.createInstance<Simple_args_macro_definitionContext>(_ctx, getState());
   enterRule(_localctx, 246, SV3_1aPpParser::RuleSimple_args_macro_definition);
@@ -10799,14 +9800,6 @@
     parserListener->exitIdentifier_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Identifier_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitIdentifier_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Identifier_in_macro_bodyContext* SV3_1aPpParser::identifier_in_macro_body() {
   Identifier_in_macro_bodyContext *_localctx = _tracker.createInstance<Identifier_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 248, SV3_1aPpParser::RuleIdentifier_in_macro_body);
@@ -10902,14 +9895,6 @@
     parserListener->exitSimple_no_args_macro_definition_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Simple_no_args_macro_definition_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_no_args_macro_definition_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Simple_no_args_macro_definition_in_macro_bodyContext* SV3_1aPpParser::simple_no_args_macro_definition_in_macro_body() {
   Simple_no_args_macro_definition_in_macro_bodyContext *_localctx = _tracker.createInstance<Simple_no_args_macro_definition_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 250, SV3_1aPpParser::RuleSimple_no_args_macro_definition_in_macro_body);
@@ -11086,14 +10071,6 @@
     parserListener->exitSimple_args_macro_definition_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Simple_args_macro_definition_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_args_macro_definition_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Simple_args_macro_definition_in_macro_bodyContext* SV3_1aPpParser::simple_args_macro_definition_in_macro_body() {
   Simple_args_macro_definition_in_macro_bodyContext *_localctx = _tracker.createInstance<Simple_args_macro_definition_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 252, SV3_1aPpParser::RuleSimple_args_macro_definition_in_macro_body);
@@ -11452,14 +10429,6 @@
     parserListener->exitDirective_in_macro(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Directive_in_macroContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDirective_in_macro(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Directive_in_macroContext* SV3_1aPpParser::directive_in_macro() {
   Directive_in_macroContext *_localctx = _tracker.createInstance<Directive_in_macroContext>(_ctx, getState());
   enterRule(_localctx, 254, SV3_1aPpParser::RuleDirective_in_macro);
@@ -11988,14 +10957,6 @@
     parserListener->exitMacro_arguments(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Macro_argumentsContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMacro_arguments(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Macro_argumentsContext* SV3_1aPpParser::macro_arguments() {
   Macro_argumentsContext *_localctx = _tracker.createInstance<Macro_argumentsContext>(_ctx, getState());
   enterRule(_localctx, 256, SV3_1aPpParser::RuleMacro_arguments);
@@ -12150,14 +11111,6 @@
     parserListener->exitEscaped_macro_definition_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Escaped_macro_definition_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEscaped_macro_definition_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Escaped_macro_definition_bodyContext* SV3_1aPpParser::escaped_macro_definition_body() {
   Escaped_macro_definition_bodyContext *_localctx = _tracker.createInstance<Escaped_macro_definition_bodyContext>(_ctx, getState());
   enterRule(_localctx, 258, SV3_1aPpParser::RuleEscaped_macro_definition_body);
@@ -12450,14 +11403,6 @@
     parserListener->exitEscaped_macro_definition_body_alt1(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Escaped_macro_definition_body_alt1Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEscaped_macro_definition_body_alt1(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Escaped_macro_definition_body_alt1Context* SV3_1aPpParser::escaped_macro_definition_body_alt1() {
   Escaped_macro_definition_body_alt1Context *_localctx = _tracker.createInstance<Escaped_macro_definition_body_alt1Context>(_ctx, getState());
   enterRule(_localctx, 260, SV3_1aPpParser::RuleEscaped_macro_definition_body_alt1);
@@ -12938,14 +11883,6 @@
     parserListener->exitEscaped_macro_definition_body_alt2(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Escaped_macro_definition_body_alt2Context::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEscaped_macro_definition_body_alt2(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Escaped_macro_definition_body_alt2Context* SV3_1aPpParser::escaped_macro_definition_body_alt2() {
   Escaped_macro_definition_body_alt2Context *_localctx = _tracker.createInstance<Escaped_macro_definition_body_alt2Context>(_ctx, getState());
   enterRule(_localctx, 262, SV3_1aPpParser::RuleEscaped_macro_definition_body_alt2);
@@ -13426,14 +12363,6 @@
     parserListener->exitSimple_macro_definition_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Simple_macro_definition_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_macro_definition_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Simple_macro_definition_bodyContext* SV3_1aPpParser::simple_macro_definition_body() {
   Simple_macro_definition_bodyContext *_localctx = _tracker.createInstance<Simple_macro_definition_bodyContext>(_ctx, getState());
   enterRule(_localctx, 264, SV3_1aPpParser::RuleSimple_macro_definition_body);
@@ -13868,14 +12797,6 @@
     parserListener->exitSimple_macro_definition_body_in_macro_body(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Simple_macro_definition_body_in_macro_bodyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitSimple_macro_definition_body_in_macro_body(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Simple_macro_definition_body_in_macro_bodyContext* SV3_1aPpParser::simple_macro_definition_body_in_macro_body() {
   Simple_macro_definition_body_in_macro_bodyContext *_localctx = _tracker.createInstance<Simple_macro_definition_body_in_macro_bodyContext>(_ctx, getState());
   enterRule(_localctx, 266, SV3_1aPpParser::RuleSimple_macro_definition_body_in_macro_body);
@@ -14162,14 +13083,6 @@
     parserListener->exitPragma_expression(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Pragma_expressionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitPragma_expression(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Pragma_expressionContext* SV3_1aPpParser::pragma_expression() {
   Pragma_expressionContext *_localctx = _tracker.createInstance<Pragma_expressionContext>(_ctx, getState());
   enterRule(_localctx, 268, SV3_1aPpParser::RulePragma_expression);
@@ -14412,14 +13325,6 @@
     parserListener->exitMacro_arg(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Macro_argContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitMacro_arg(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Macro_argContext* SV3_1aPpParser::macro_arg() {
   Macro_argContext *_localctx = _tracker.createInstance<Macro_argContext>(_ctx, getState());
   enterRule(_localctx, 270, SV3_1aPpParser::RuleMacro_arg);
@@ -14737,14 +13642,6 @@
     parserListener->exitPaired_parens(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Paired_parensContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitPaired_parens(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Paired_parensContext* SV3_1aPpParser::paired_parens() {
   Paired_parensContext *_localctx = _tracker.createInstance<Paired_parensContext>(_ctx, getState());
   enterRule(_localctx, 272, SV3_1aPpParser::RulePaired_parens);
@@ -15309,14 +14206,6 @@
     parserListener->exitText_blob(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Text_blobContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitText_blob(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Text_blobContext* SV3_1aPpParser::text_blob() {
   Text_blobContext *_localctx = _tracker.createInstance<Text_blobContext>(_ctx, getState());
   enterRule(_localctx, 274, SV3_1aPpParser::RuleText_blob);
@@ -15544,14 +14433,6 @@
     parserListener->exitString(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::StringContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitString(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::StringContext* SV3_1aPpParser::string() {
   StringContext *_localctx = _tracker.createInstance<StringContext>(_ctx, getState());
   enterRule(_localctx, 276, SV3_1aPpParser::RuleString);
@@ -15601,14 +14482,6 @@
     parserListener->exitEscaped_identifier(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Escaped_identifierContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitEscaped_identifier(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Escaped_identifierContext* SV3_1aPpParser::escaped_identifier() {
   Escaped_identifierContext *_localctx = _tracker.createInstance<Escaped_identifierContext>(_ctx, getState());
   enterRule(_localctx, 278, SV3_1aPpParser::RuleEscaped_identifier);
@@ -15706,14 +14579,6 @@
     parserListener->exitDefault_value(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::Default_valueContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitDefault_value(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::Default_valueContext* SV3_1aPpParser::default_value() {
   Default_valueContext *_localctx = _tracker.createInstance<Default_valueContext>(_ctx, getState());
   enterRule(_localctx, 280, SV3_1aPpParser::RuleDefault_value);
@@ -15934,14 +14799,6 @@
     parserListener->exitString_blob(this);
 }
 
-
-antlrcpp::Any SV3_1aPpParser::String_blobContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aPpParserVisitor*>(visitor))
-    return parserVisitor->visitString_blob(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aPpParser::String_blobContext* SV3_1aPpParser::string_blob() {
   String_blobContext *_localctx = _tracker.createInstance<String_blobContext>(_ctx, getState());
   enterRule(_localctx, 282, SV3_1aPpParser::RuleString_blob);
diff --git a/src/parser/SV3_1aPpParser.h b/src/parser/SV3_1aPpParser.h
index 0547e44..4e7fd4d 100644
--- a/src/parser/SV3_1aPpParser.h
+++ b/src/parser/SV3_1aPpParser.h
@@ -262,8 +262,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -349,8 +347,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -382,8 +378,6 @@
     antlr4::tree::TerminalNode* Spaces(size_t i);
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   class  MacroInstanceNoArgsContext : public Macro_instanceContext {
@@ -394,8 +388,6 @@
     antlr4::tree::TerminalNode *Macro_Escaped_identifier();
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
   };
 
   Macro_instanceContext* macro_instance();
@@ -411,8 +403,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -429,8 +419,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -445,8 +433,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -460,8 +446,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -475,8 +459,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -494,8 +476,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -512,8 +492,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -532,8 +510,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -550,8 +526,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -570,8 +544,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -588,8 +560,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -605,8 +575,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -620,8 +588,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -635,8 +601,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -653,8 +617,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -669,8 +631,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -688,8 +648,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -716,8 +674,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -735,8 +691,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -754,8 +708,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -782,8 +734,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -801,8 +751,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -820,8 +768,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -839,8 +785,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -858,8 +802,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -877,8 +819,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -896,8 +836,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -915,8 +853,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -934,8 +870,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -953,8 +887,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -968,8 +900,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -988,8 +918,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1006,8 +934,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1024,8 +950,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1039,8 +963,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1057,8 +979,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1074,8 +994,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1092,8 +1010,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1107,8 +1023,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1125,8 +1039,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1146,8 +1058,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1164,8 +1074,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1179,8 +1087,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1197,8 +1103,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1212,8 +1116,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1230,8 +1132,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1245,8 +1145,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1263,8 +1161,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1278,8 +1174,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1296,8 +1190,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1311,8 +1203,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1329,8 +1219,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1344,8 +1232,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1362,8 +1248,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1377,8 +1261,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1395,8 +1277,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1410,8 +1290,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1428,8 +1306,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1443,8 +1319,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1459,8 +1333,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1476,8 +1348,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1494,8 +1364,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1509,8 +1377,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1527,8 +1393,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1542,8 +1406,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1560,8 +1422,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1575,8 +1435,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1593,8 +1451,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1608,8 +1464,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1626,8 +1480,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1641,8 +1493,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1659,8 +1509,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1674,8 +1522,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1692,8 +1538,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1707,8 +1551,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1725,8 +1567,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1740,8 +1580,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1758,8 +1596,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1773,8 +1609,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1791,8 +1625,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1806,8 +1638,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1824,8 +1654,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1839,8 +1667,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1857,8 +1683,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1872,8 +1696,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1890,8 +1712,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1907,8 +1727,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1925,8 +1743,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1944,8 +1760,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1962,8 +1776,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1979,8 +1791,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -1997,8 +1807,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2012,8 +1820,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2030,8 +1836,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2045,8 +1849,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2063,8 +1865,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2078,8 +1878,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2096,8 +1894,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2111,8 +1907,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2129,8 +1923,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2144,8 +1936,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2159,8 +1949,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2174,8 +1962,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2189,8 +1975,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2204,8 +1988,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2219,8 +2001,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2234,8 +2014,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2249,8 +2027,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2264,8 +2040,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2279,8 +2053,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2294,8 +2066,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2309,8 +2079,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2324,8 +2092,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2339,8 +2105,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2354,8 +2118,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2369,8 +2131,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2389,8 +2149,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2409,8 +2167,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2430,8 +2186,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2452,8 +2206,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2475,8 +2227,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2493,8 +2243,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2514,8 +2262,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2535,8 +2281,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2611,8 +2355,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2637,8 +2379,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2653,8 +2393,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2725,8 +2463,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2797,8 +2533,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2867,8 +2601,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2933,8 +2665,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2965,8 +2695,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -2996,8 +2724,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3048,8 +2774,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3087,8 +2811,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3102,8 +2824,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3117,8 +2837,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3144,8 +2862,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -3178,8 +2894,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
diff --git a/src/parser/SV3_1aPpParserBaseVisitor.cpp b/src/parser/SV3_1aPpParserBaseVisitor.cpp
deleted file mode 100644
index 945f779..0000000
--- a/src/parser/SV3_1aPpParserBaseVisitor.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aPpParser.g4 by ANTLR 4.7.2
-
-
-#include "SV3_1aPpParserBaseVisitor.h"
-
-
diff --git a/src/parser/SV3_1aPpParserBaseVisitor.h b/src/parser/SV3_1aPpParserBaseVisitor.h
deleted file mode 100644
index 690777d..0000000
--- a/src/parser/SV3_1aPpParserBaseVisitor.h
+++ /dev/null
@@ -1,592 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aPpParser.g4 by ANTLR 4.7.2
-
-#pragma once
-
-
-#include "antlr4-runtime.h"
-#include "SV3_1aPpParserVisitor.h"
-
-
-/**
- * This class provides an empty implementation of SV3_1aPpParserVisitor, which can be
- * extended to create a visitor which only needs to handle a subset of the available methods.
- */
-class  SV3_1aPpParserBaseVisitor : public SV3_1aPpParserVisitor {
-public:
-
-  virtual antlrcpp::Any visitSource_text(SV3_1aPpParser::Source_textContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDescription(SV3_1aPpParser::DescriptionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMacroInstanceWithArgs(SV3_1aPpParser::MacroInstanceWithArgsContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMacroInstanceNoArgs(SV3_1aPpParser::MacroInstanceNoArgsContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUnterminated_string(SV3_1aPpParser::Unterminated_stringContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMacro_actual_args(SV3_1aPpParser::Macro_actual_argsContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitComments(SV3_1aPpParser::CommentsContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNumber(SV3_1aPpParser::NumberContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitPound_delay(SV3_1aPpParser::Pound_delayContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMacro_definition(SV3_1aPpParser::Macro_definitionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitInclude_directive_one_line(SV3_1aPpParser::Include_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitInclude_directive(SV3_1aPpParser::Include_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitLine_directive_one_line(SV3_1aPpParser::Line_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitLine_directive(SV3_1aPpParser::Line_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefault_nettype_directive_one_line(SV3_1aPpParser::Default_nettype_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefault_nettype_directive(SV3_1aPpParser::Default_nettype_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSv_file_directive(SV3_1aPpParser::Sv_file_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSv_line_directive(SV3_1aPpParser::Sv_line_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitTimescale_directive_one_line(SV3_1aPpParser::Timescale_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitTimescale_directive(SV3_1aPpParser::Timescale_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUndef_directive(SV3_1aPpParser::Undef_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitIfdef_directive_one_line(SV3_1aPpParser::Ifdef_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitIfdef_directive(SV3_1aPpParser::Ifdef_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitIfdef_directive_in_macro_body(SV3_1aPpParser::Ifdef_directive_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitIfndef_directive_one_line(SV3_1aPpParser::Ifndef_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitIfndef_directive(SV3_1aPpParser::Ifndef_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitIfndef_directive_in_macro_body(SV3_1aPpParser::Ifndef_directive_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElsif_directive_one_line(SV3_1aPpParser::Elsif_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElsif_directive(SV3_1aPpParser::Elsif_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElsif_directive_in_macro_body(SV3_1aPpParser::Elsif_directive_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElseif_directive_one_line(SV3_1aPpParser::Elseif_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElseif_directive(SV3_1aPpParser::Elseif_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElseif_directive_in_macro_body(SV3_1aPpParser::Elseif_directive_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElse_directive_one_line(SV3_1aPpParser::Else_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitElse_directive(SV3_1aPpParser::Else_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndif_directive_one_line(SV3_1aPpParser::Endif_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndif_directive(SV3_1aPpParser::Endif_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitResetall_directive_one_line(SV3_1aPpParser::Resetall_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitResetall_directive(SV3_1aPpParser::Resetall_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitBegin_keywords_directive_one_line(SV3_1aPpParser::Begin_keywords_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitBegin_keywords_directive(SV3_1aPpParser::Begin_keywords_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEnd_keywords_directive_one_line(SV3_1aPpParser::End_keywords_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEnd_keywords_directive(SV3_1aPpParser::End_keywords_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitPragma_directive_one_line(SV3_1aPpParser::Pragma_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitPragma_directive(SV3_1aPpParser::Pragma_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitCelldefine_directive_one_line(SV3_1aPpParser::Celldefine_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitCelldefine_directive(SV3_1aPpParser::Celldefine_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndcelldefine_directive_one_line(SV3_1aPpParser::Endcelldefine_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndcelldefine_directive(SV3_1aPpParser::Endcelldefine_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitProtect_directive_one_line(SV3_1aPpParser::Protect_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitProtect_directive(SV3_1aPpParser::Protect_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprotect_directive_one_line(SV3_1aPpParser::Endprotect_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprotect_directive(SV3_1aPpParser::Endprotect_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitProtected_directive_one_line(SV3_1aPpParser::Protected_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitProtected_directive(SV3_1aPpParser::Protected_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprotected_directive_one_line(SV3_1aPpParser::Endprotected_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprotected_directive(SV3_1aPpParser::Endprotected_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitExpand_vectornets_directive_one_line(SV3_1aPpParser::Expand_vectornets_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitExpand_vectornets_directive(SV3_1aPpParser::Expand_vectornets_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoexpand_vectornets_directive_one_line(SV3_1aPpParser::Noexpand_vectornets_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoexpand_vectornets_directive(SV3_1aPpParser::Noexpand_vectornets_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitAutoexpand_vectornets_directive_one_line(SV3_1aPpParser::Autoexpand_vectornets_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitAutoexpand_vectornets_directive(SV3_1aPpParser::Autoexpand_vectornets_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUselib_directive_one_line(SV3_1aPpParser::Uselib_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUselib_directive(SV3_1aPpParser::Uselib_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDisable_portfaults_directive_one_line(SV3_1aPpParser::Disable_portfaults_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDisable_portfaults_directive(SV3_1aPpParser::Disable_portfaults_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEnable_portfaults_directive_one_line(SV3_1aPpParser::Enable_portfaults_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEnable_portfaults_directive(SV3_1aPpParser::Enable_portfaults_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNosuppress_faults_directive_one_line(SV3_1aPpParser::Nosuppress_faults_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNosuppress_faults_directive(SV3_1aPpParser::Nosuppress_faults_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSuppress_faults_directive_one_line(SV3_1aPpParser::Suppress_faults_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSuppress_faults_directive(SV3_1aPpParser::Suppress_faults_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSigned_directive_one_line(SV3_1aPpParser::Signed_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSigned_directive(SV3_1aPpParser::Signed_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUnsigned_directive_one_line(SV3_1aPpParser::Unsigned_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUnsigned_directive(SV3_1aPpParser::Unsigned_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitRemove_gatename_directive_one_line(SV3_1aPpParser::Remove_gatename_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitRemove_gatename_directive(SV3_1aPpParser::Remove_gatename_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoremove_gatenames_directive_one_line(SV3_1aPpParser::Noremove_gatenames_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoremove_gatenames_directive(SV3_1aPpParser::Noremove_gatenames_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitRemove_netname_directive_one_line(SV3_1aPpParser::Remove_netname_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitRemove_netname_directive(SV3_1aPpParser::Remove_netname_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoremove_netnames_directive_one_line(SV3_1aPpParser::Noremove_netnames_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoremove_netnames_directive(SV3_1aPpParser::Noremove_netnames_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitAccelerate_directive_one_line(SV3_1aPpParser::Accelerate_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitAccelerate_directive(SV3_1aPpParser::Accelerate_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoaccelerate_directive_one_line(SV3_1aPpParser::Noaccelerate_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNoaccelerate_directive(SV3_1aPpParser::Noaccelerate_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefault_trireg_strenght_directive_one_line(SV3_1aPpParser::Default_trireg_strenght_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefault_trireg_strenght_directive(SV3_1aPpParser::Default_trireg_strenght_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefault_decay_time_directive_one_line(SV3_1aPpParser::Default_decay_time_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefault_decay_time_directive(SV3_1aPpParser::Default_decay_time_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUnconnected_drive_directive_one_line(SV3_1aPpParser::Unconnected_drive_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUnconnected_drive_directive(SV3_1aPpParser::Unconnected_drive_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNounconnected_drive_directive_one_line(SV3_1aPpParser::Nounconnected_drive_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitNounconnected_drive_directive(SV3_1aPpParser::Nounconnected_drive_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_distributed_directive_one_line(SV3_1aPpParser::Delay_mode_distributed_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_distributed_directive(SV3_1aPpParser::Delay_mode_distributed_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_path_directive_one_line(SV3_1aPpParser::Delay_mode_path_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_path_directive(SV3_1aPpParser::Delay_mode_path_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_unit_directive_one_line(SV3_1aPpParser::Delay_mode_unit_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_unit_directive(SV3_1aPpParser::Delay_mode_unit_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_zero_directive_one_line(SV3_1aPpParser::Delay_mode_zero_directive_one_lineContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDelay_mode_zero_directive(SV3_1aPpParser::Delay_mode_zero_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitUndefineall_directive(SV3_1aPpParser::Undefineall_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitModule(SV3_1aPpParser::ModuleContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndmodule(SV3_1aPpParser::EndmoduleContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSv_interface(SV3_1aPpParser::Sv_interfaceContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndinterface(SV3_1aPpParser::EndinterfaceContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitProgram(SV3_1aPpParser::ProgramContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprogram(SV3_1aPpParser::EndprogramContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitPrimitive(SV3_1aPpParser::PrimitiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprimitive(SV3_1aPpParser::EndprimitiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSv_package(SV3_1aPpParser::Sv_packageContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndpackage(SV3_1aPpParser::EndpackageContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitChecker(SV3_1aPpParser::CheckerContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndchecker(SV3_1aPpParser::EndcheckerContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitConfig(SV3_1aPpParser::ConfigContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndconfig(SV3_1aPpParser::EndconfigContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefine_directive(SV3_1aPpParser::Define_directiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMultiline_no_args_macro_definition(SV3_1aPpParser::Multiline_no_args_macro_definitionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMultiline_args_macro_definition(SV3_1aPpParser::Multiline_args_macro_definitionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSimple_no_args_macro_definition(SV3_1aPpParser::Simple_no_args_macro_definitionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSimple_args_macro_definition(SV3_1aPpParser::Simple_args_macro_definitionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitIdentifier_in_macro_body(SV3_1aPpParser::Identifier_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSimple_no_args_macro_definition_in_macro_body(SV3_1aPpParser::Simple_no_args_macro_definition_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSimple_args_macro_definition_in_macro_body(SV3_1aPpParser::Simple_args_macro_definition_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDirective_in_macro(SV3_1aPpParser::Directive_in_macroContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMacro_arguments(SV3_1aPpParser::Macro_argumentsContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEscaped_macro_definition_body(SV3_1aPpParser::Escaped_macro_definition_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEscaped_macro_definition_body_alt1(SV3_1aPpParser::Escaped_macro_definition_body_alt1Context *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEscaped_macro_definition_body_alt2(SV3_1aPpParser::Escaped_macro_definition_body_alt2Context *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSimple_macro_definition_body(SV3_1aPpParser::Simple_macro_definition_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSimple_macro_definition_body_in_macro_body(SV3_1aPpParser::Simple_macro_definition_body_in_macro_bodyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitPragma_expression(SV3_1aPpParser::Pragma_expressionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitMacro_arg(SV3_1aPpParser::Macro_argContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitPaired_parens(SV3_1aPpParser::Paired_parensContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitText_blob(SV3_1aPpParser::Text_blobContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitString(SV3_1aPpParser::StringContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEscaped_identifier(SV3_1aPpParser::Escaped_identifierContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDefault_value(SV3_1aPpParser::Default_valueContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitString_blob(SV3_1aPpParser::String_blobContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-
-};
-
diff --git a/src/parser/SV3_1aPpParserVisitor.cpp b/src/parser/SV3_1aPpParserVisitor.cpp
deleted file mode 100644
index baf05df..0000000
--- a/src/parser/SV3_1aPpParserVisitor.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aPpParser.g4 by ANTLR 4.7.2
-
-
-#include "SV3_1aPpParserVisitor.h"
-
-
diff --git a/src/parser/SV3_1aPpParserVisitor.h b/src/parser/SV3_1aPpParserVisitor.h
deleted file mode 100644
index 6f39195..0000000
--- a/src/parser/SV3_1aPpParserVisitor.h
+++ /dev/null
@@ -1,310 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aPpParser.g4 by ANTLR 4.7.2
-
-#pragma once
-
-
-#include "antlr4-runtime.h"
-#include "SV3_1aPpParser.h"
-
-
-
-/**
- * This class defines an abstract visitor for a parse tree
- * produced by SV3_1aPpParser.
- */
-class  SV3_1aPpParserVisitor : public antlr4::tree::AbstractParseTreeVisitor {
-public:
-
-  /**
-   * Visit parse trees produced by SV3_1aPpParser.
-   */
-    virtual antlrcpp::Any visitSource_text(SV3_1aPpParser::Source_textContext *context) = 0;
-
-    virtual antlrcpp::Any visitDescription(SV3_1aPpParser::DescriptionContext *context) = 0;
-
-    virtual antlrcpp::Any visitMacroInstanceWithArgs(SV3_1aPpParser::MacroInstanceWithArgsContext *context) = 0;
-
-    virtual antlrcpp::Any visitMacroInstanceNoArgs(SV3_1aPpParser::MacroInstanceNoArgsContext *context) = 0;
-
-    virtual antlrcpp::Any visitUnterminated_string(SV3_1aPpParser::Unterminated_stringContext *context) = 0;
-
-    virtual antlrcpp::Any visitMacro_actual_args(SV3_1aPpParser::Macro_actual_argsContext *context) = 0;
-
-    virtual antlrcpp::Any visitComments(SV3_1aPpParser::CommentsContext *context) = 0;
-
-    virtual antlrcpp::Any visitNumber(SV3_1aPpParser::NumberContext *context) = 0;
-
-    virtual antlrcpp::Any visitPound_delay(SV3_1aPpParser::Pound_delayContext *context) = 0;
-
-    virtual antlrcpp::Any visitMacro_definition(SV3_1aPpParser::Macro_definitionContext *context) = 0;
-
-    virtual antlrcpp::Any visitInclude_directive_one_line(SV3_1aPpParser::Include_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitInclude_directive(SV3_1aPpParser::Include_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitLine_directive_one_line(SV3_1aPpParser::Line_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitLine_directive(SV3_1aPpParser::Line_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefault_nettype_directive_one_line(SV3_1aPpParser::Default_nettype_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefault_nettype_directive(SV3_1aPpParser::Default_nettype_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitSv_file_directive(SV3_1aPpParser::Sv_file_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitSv_line_directive(SV3_1aPpParser::Sv_line_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitTimescale_directive_one_line(SV3_1aPpParser::Timescale_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitTimescale_directive(SV3_1aPpParser::Timescale_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitUndef_directive(SV3_1aPpParser::Undef_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitIfdef_directive_one_line(SV3_1aPpParser::Ifdef_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitIfdef_directive(SV3_1aPpParser::Ifdef_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitIfdef_directive_in_macro_body(SV3_1aPpParser::Ifdef_directive_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitIfndef_directive_one_line(SV3_1aPpParser::Ifndef_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitIfndef_directive(SV3_1aPpParser::Ifndef_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitIfndef_directive_in_macro_body(SV3_1aPpParser::Ifndef_directive_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitElsif_directive_one_line(SV3_1aPpParser::Elsif_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitElsif_directive(SV3_1aPpParser::Elsif_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitElsif_directive_in_macro_body(SV3_1aPpParser::Elsif_directive_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitElseif_directive_one_line(SV3_1aPpParser::Elseif_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitElseif_directive(SV3_1aPpParser::Elseif_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitElseif_directive_in_macro_body(SV3_1aPpParser::Elseif_directive_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitElse_directive_one_line(SV3_1aPpParser::Else_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitElse_directive(SV3_1aPpParser::Else_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndif_directive_one_line(SV3_1aPpParser::Endif_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndif_directive(SV3_1aPpParser::Endif_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitResetall_directive_one_line(SV3_1aPpParser::Resetall_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitResetall_directive(SV3_1aPpParser::Resetall_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitBegin_keywords_directive_one_line(SV3_1aPpParser::Begin_keywords_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitBegin_keywords_directive(SV3_1aPpParser::Begin_keywords_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEnd_keywords_directive_one_line(SV3_1aPpParser::End_keywords_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitEnd_keywords_directive(SV3_1aPpParser::End_keywords_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitPragma_directive_one_line(SV3_1aPpParser::Pragma_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitPragma_directive(SV3_1aPpParser::Pragma_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitCelldefine_directive_one_line(SV3_1aPpParser::Celldefine_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitCelldefine_directive(SV3_1aPpParser::Celldefine_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndcelldefine_directive_one_line(SV3_1aPpParser::Endcelldefine_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndcelldefine_directive(SV3_1aPpParser::Endcelldefine_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitProtect_directive_one_line(SV3_1aPpParser::Protect_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitProtect_directive(SV3_1aPpParser::Protect_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprotect_directive_one_line(SV3_1aPpParser::Endprotect_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprotect_directive(SV3_1aPpParser::Endprotect_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitProtected_directive_one_line(SV3_1aPpParser::Protected_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitProtected_directive(SV3_1aPpParser::Protected_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprotected_directive_one_line(SV3_1aPpParser::Endprotected_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprotected_directive(SV3_1aPpParser::Endprotected_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitExpand_vectornets_directive_one_line(SV3_1aPpParser::Expand_vectornets_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitExpand_vectornets_directive(SV3_1aPpParser::Expand_vectornets_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoexpand_vectornets_directive_one_line(SV3_1aPpParser::Noexpand_vectornets_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoexpand_vectornets_directive(SV3_1aPpParser::Noexpand_vectornets_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitAutoexpand_vectornets_directive_one_line(SV3_1aPpParser::Autoexpand_vectornets_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitAutoexpand_vectornets_directive(SV3_1aPpParser::Autoexpand_vectornets_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitUselib_directive_one_line(SV3_1aPpParser::Uselib_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitUselib_directive(SV3_1aPpParser::Uselib_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDisable_portfaults_directive_one_line(SV3_1aPpParser::Disable_portfaults_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDisable_portfaults_directive(SV3_1aPpParser::Disable_portfaults_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEnable_portfaults_directive_one_line(SV3_1aPpParser::Enable_portfaults_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitEnable_portfaults_directive(SV3_1aPpParser::Enable_portfaults_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitNosuppress_faults_directive_one_line(SV3_1aPpParser::Nosuppress_faults_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitNosuppress_faults_directive(SV3_1aPpParser::Nosuppress_faults_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitSuppress_faults_directive_one_line(SV3_1aPpParser::Suppress_faults_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitSuppress_faults_directive(SV3_1aPpParser::Suppress_faults_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitSigned_directive_one_line(SV3_1aPpParser::Signed_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitSigned_directive(SV3_1aPpParser::Signed_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitUnsigned_directive_one_line(SV3_1aPpParser::Unsigned_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitUnsigned_directive(SV3_1aPpParser::Unsigned_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitRemove_gatename_directive_one_line(SV3_1aPpParser::Remove_gatename_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitRemove_gatename_directive(SV3_1aPpParser::Remove_gatename_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoremove_gatenames_directive_one_line(SV3_1aPpParser::Noremove_gatenames_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoremove_gatenames_directive(SV3_1aPpParser::Noremove_gatenames_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitRemove_netname_directive_one_line(SV3_1aPpParser::Remove_netname_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitRemove_netname_directive(SV3_1aPpParser::Remove_netname_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoremove_netnames_directive_one_line(SV3_1aPpParser::Noremove_netnames_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoremove_netnames_directive(SV3_1aPpParser::Noremove_netnames_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitAccelerate_directive_one_line(SV3_1aPpParser::Accelerate_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitAccelerate_directive(SV3_1aPpParser::Accelerate_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoaccelerate_directive_one_line(SV3_1aPpParser::Noaccelerate_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitNoaccelerate_directive(SV3_1aPpParser::Noaccelerate_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefault_trireg_strenght_directive_one_line(SV3_1aPpParser::Default_trireg_strenght_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefault_trireg_strenght_directive(SV3_1aPpParser::Default_trireg_strenght_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefault_decay_time_directive_one_line(SV3_1aPpParser::Default_decay_time_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefault_decay_time_directive(SV3_1aPpParser::Default_decay_time_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitUnconnected_drive_directive_one_line(SV3_1aPpParser::Unconnected_drive_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitUnconnected_drive_directive(SV3_1aPpParser::Unconnected_drive_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitNounconnected_drive_directive_one_line(SV3_1aPpParser::Nounconnected_drive_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitNounconnected_drive_directive(SV3_1aPpParser::Nounconnected_drive_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_distributed_directive_one_line(SV3_1aPpParser::Delay_mode_distributed_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_distributed_directive(SV3_1aPpParser::Delay_mode_distributed_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_path_directive_one_line(SV3_1aPpParser::Delay_mode_path_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_path_directive(SV3_1aPpParser::Delay_mode_path_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_unit_directive_one_line(SV3_1aPpParser::Delay_mode_unit_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_unit_directive(SV3_1aPpParser::Delay_mode_unit_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_zero_directive_one_line(SV3_1aPpParser::Delay_mode_zero_directive_one_lineContext *context) = 0;
-
-    virtual antlrcpp::Any visitDelay_mode_zero_directive(SV3_1aPpParser::Delay_mode_zero_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitUndefineall_directive(SV3_1aPpParser::Undefineall_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitModule(SV3_1aPpParser::ModuleContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndmodule(SV3_1aPpParser::EndmoduleContext *context) = 0;
-
-    virtual antlrcpp::Any visitSv_interface(SV3_1aPpParser::Sv_interfaceContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndinterface(SV3_1aPpParser::EndinterfaceContext *context) = 0;
-
-    virtual antlrcpp::Any visitProgram(SV3_1aPpParser::ProgramContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprogram(SV3_1aPpParser::EndprogramContext *context) = 0;
-
-    virtual antlrcpp::Any visitPrimitive(SV3_1aPpParser::PrimitiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprimitive(SV3_1aPpParser::EndprimitiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitSv_package(SV3_1aPpParser::Sv_packageContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndpackage(SV3_1aPpParser::EndpackageContext *context) = 0;
-
-    virtual antlrcpp::Any visitChecker(SV3_1aPpParser::CheckerContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndchecker(SV3_1aPpParser::EndcheckerContext *context) = 0;
-
-    virtual antlrcpp::Any visitConfig(SV3_1aPpParser::ConfigContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndconfig(SV3_1aPpParser::EndconfigContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefine_directive(SV3_1aPpParser::Define_directiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitMultiline_no_args_macro_definition(SV3_1aPpParser::Multiline_no_args_macro_definitionContext *context) = 0;
-
-    virtual antlrcpp::Any visitMultiline_args_macro_definition(SV3_1aPpParser::Multiline_args_macro_definitionContext *context) = 0;
-
-    virtual antlrcpp::Any visitSimple_no_args_macro_definition(SV3_1aPpParser::Simple_no_args_macro_definitionContext *context) = 0;
-
-    virtual antlrcpp::Any visitSimple_args_macro_definition(SV3_1aPpParser::Simple_args_macro_definitionContext *context) = 0;
-
-    virtual antlrcpp::Any visitIdentifier_in_macro_body(SV3_1aPpParser::Identifier_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitSimple_no_args_macro_definition_in_macro_body(SV3_1aPpParser::Simple_no_args_macro_definition_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitSimple_args_macro_definition_in_macro_body(SV3_1aPpParser::Simple_args_macro_definition_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitDirective_in_macro(SV3_1aPpParser::Directive_in_macroContext *context) = 0;
-
-    virtual antlrcpp::Any visitMacro_arguments(SV3_1aPpParser::Macro_argumentsContext *context) = 0;
-
-    virtual antlrcpp::Any visitEscaped_macro_definition_body(SV3_1aPpParser::Escaped_macro_definition_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitEscaped_macro_definition_body_alt1(SV3_1aPpParser::Escaped_macro_definition_body_alt1Context *context) = 0;
-
-    virtual antlrcpp::Any visitEscaped_macro_definition_body_alt2(SV3_1aPpParser::Escaped_macro_definition_body_alt2Context *context) = 0;
-
-    virtual antlrcpp::Any visitSimple_macro_definition_body(SV3_1aPpParser::Simple_macro_definition_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitSimple_macro_definition_body_in_macro_body(SV3_1aPpParser::Simple_macro_definition_body_in_macro_bodyContext *context) = 0;
-
-    virtual antlrcpp::Any visitPragma_expression(SV3_1aPpParser::Pragma_expressionContext *context) = 0;
-
-    virtual antlrcpp::Any visitMacro_arg(SV3_1aPpParser::Macro_argContext *context) = 0;
-
-    virtual antlrcpp::Any visitPaired_parens(SV3_1aPpParser::Paired_parensContext *context) = 0;
-
-    virtual antlrcpp::Any visitText_blob(SV3_1aPpParser::Text_blobContext *context) = 0;
-
-    virtual antlrcpp::Any visitString(SV3_1aPpParser::StringContext *context) = 0;
-
-    virtual antlrcpp::Any visitEscaped_identifier(SV3_1aPpParser::Escaped_identifierContext *context) = 0;
-
-    virtual antlrcpp::Any visitDefault_value(SV3_1aPpParser::Default_valueContext *context) = 0;
-
-    virtual antlrcpp::Any visitString_blob(SV3_1aPpParser::String_blobContext *context) = 0;
-
-
-};
-
diff --git a/src/parser/SV3_1aSplitterParser.cpp b/src/parser/SV3_1aSplitterParser.cpp
index a4e159d..a098ff9 100644
--- a/src/parser/SV3_1aSplitterParser.cpp
+++ b/src/parser/SV3_1aSplitterParser.cpp
@@ -3,7 +3,6 @@
 
 
 #include "SV3_1aSplitterParserListener.h"
-#include "SV3_1aSplitterParserVisitor.h"
 
 #include "SV3_1aSplitterParser.h"
 
@@ -63,14 +62,6 @@
     parserListener->exitSource_text(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::Source_textContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitSource_text(this);
-  else
-    return visitor->visitChildren(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);
@@ -200,14 +191,6 @@
     parserListener->exitDescription(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::DescriptionContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitDescription(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::DescriptionContext* SV3_1aSplitterParser::description() {
   DescriptionContext *_localctx = _tracker.createInstance<DescriptionContext>(_ctx, getState());
   enterRule(_localctx, 2, SV3_1aSplitterParser::RuleDescription);
@@ -365,14 +348,6 @@
     parserListener->exitModule(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::ModuleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitModule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::ModuleContext* SV3_1aSplitterParser::module() {
   ModuleContext *_localctx = _tracker.createInstance<ModuleContext>(_ctx, getState());
   enterRule(_localctx, 4, SV3_1aSplitterParser::RuleModule);
@@ -422,14 +397,6 @@
     parserListener->exitEndmodule(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::EndmoduleContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitEndmodule(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::EndmoduleContext* SV3_1aSplitterParser::endmodule() {
   EndmoduleContext *_localctx = _tracker.createInstance<EndmoduleContext>(_ctx, getState());
   enterRule(_localctx, 6, SV3_1aSplitterParser::RuleEndmodule);
@@ -479,14 +446,6 @@
     parserListener->exitSv_interface(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::Sv_interfaceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitSv_interface(this);
-  else
-    return visitor->visitChildren(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);
@@ -536,14 +495,6 @@
     parserListener->exitEndinterface(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::EndinterfaceContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitEndinterface(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::EndinterfaceContext* SV3_1aSplitterParser::endinterface() {
   EndinterfaceContext *_localctx = _tracker.createInstance<EndinterfaceContext>(_ctx, getState());
   enterRule(_localctx, 10, SV3_1aSplitterParser::RuleEndinterface);
@@ -593,14 +544,6 @@
     parserListener->exitProgram(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::ProgramContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitProgram(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::ProgramContext* SV3_1aSplitterParser::program() {
   ProgramContext *_localctx = _tracker.createInstance<ProgramContext>(_ctx, getState());
   enterRule(_localctx, 12, SV3_1aSplitterParser::RuleProgram);
@@ -650,14 +593,6 @@
     parserListener->exitEndprogram(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::EndprogramContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitEndprogram(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::EndprogramContext* SV3_1aSplitterParser::endprogram() {
   EndprogramContext *_localctx = _tracker.createInstance<EndprogramContext>(_ctx, getState());
   enterRule(_localctx, 14, SV3_1aSplitterParser::RuleEndprogram);
@@ -707,14 +642,6 @@
     parserListener->exitPrimitive(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::PrimitiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitPrimitive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::PrimitiveContext* SV3_1aSplitterParser::primitive() {
   PrimitiveContext *_localctx = _tracker.createInstance<PrimitiveContext>(_ctx, getState());
   enterRule(_localctx, 16, SV3_1aSplitterParser::RulePrimitive);
@@ -764,14 +691,6 @@
     parserListener->exitEndprimitive(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::EndprimitiveContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitEndprimitive(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::EndprimitiveContext* SV3_1aSplitterParser::endprimitive() {
   EndprimitiveContext *_localctx = _tracker.createInstance<EndprimitiveContext>(_ctx, getState());
   enterRule(_localctx, 18, SV3_1aSplitterParser::RuleEndprimitive);
@@ -821,14 +740,6 @@
     parserListener->exitSv_package(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::Sv_packageContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitSv_package(this);
-  else
-    return visitor->visitChildren(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);
@@ -878,14 +789,6 @@
     parserListener->exitEndpackage(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::EndpackageContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitEndpackage(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::EndpackageContext* SV3_1aSplitterParser::endpackage() {
   EndpackageContext *_localctx = _tracker.createInstance<EndpackageContext>(_ctx, getState());
   enterRule(_localctx, 22, SV3_1aSplitterParser::RuleEndpackage);
@@ -935,14 +838,6 @@
     parserListener->exitChecker(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::CheckerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitChecker(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::CheckerContext* SV3_1aSplitterParser::checker() {
   CheckerContext *_localctx = _tracker.createInstance<CheckerContext>(_ctx, getState());
   enterRule(_localctx, 24, SV3_1aSplitterParser::RuleChecker);
@@ -992,14 +887,6 @@
     parserListener->exitEndchecker(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::EndcheckerContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitEndchecker(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::EndcheckerContext* SV3_1aSplitterParser::endchecker() {
   EndcheckerContext *_localctx = _tracker.createInstance<EndcheckerContext>(_ctx, getState());
   enterRule(_localctx, 26, SV3_1aSplitterParser::RuleEndchecker);
@@ -1049,14 +936,6 @@
     parserListener->exitConfig(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::ConfigContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitConfig(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::ConfigContext* SV3_1aSplitterParser::config() {
   ConfigContext *_localctx = _tracker.createInstance<ConfigContext>(_ctx, getState());
   enterRule(_localctx, 28, SV3_1aSplitterParser::RuleConfig);
@@ -1106,14 +985,6 @@
     parserListener->exitEndconfig(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::EndconfigContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitEndconfig(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::EndconfigContext* SV3_1aSplitterParser::endconfig() {
   EndconfigContext *_localctx = _tracker.createInstance<EndconfigContext>(_ctx, getState());
   enterRule(_localctx, 30, SV3_1aSplitterParser::RuleEndconfig);
@@ -1163,14 +1034,6 @@
     parserListener->exitAny(this);
 }
 
-
-antlrcpp::Any SV3_1aSplitterParser::AnyContext::accept(tree::ParseTreeVisitor *visitor) {
-  if (auto parserVisitor = dynamic_cast<SV3_1aSplitterParserVisitor*>(visitor))
-    return parserVisitor->visitAny(this);
-  else
-    return visitor->visitChildren(this);
-}
-
 SV3_1aSplitterParser::AnyContext* SV3_1aSplitterParser::any() {
   AnyContext *_localctx = _tracker.createInstance<AnyContext>(_ctx, getState());
   enterRule(_localctx, 32, SV3_1aSplitterParser::RuleAny);
diff --git a/src/parser/SV3_1aSplitterParser.h b/src/parser/SV3_1aSplitterParser.h
index b879dd2..7d44302 100644
--- a/src/parser/SV3_1aSplitterParser.h
+++ b/src/parser/SV3_1aSplitterParser.h
@@ -63,8 +63,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -92,8 +90,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -107,8 +103,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -122,8 +116,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -137,8 +129,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -152,8 +142,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -167,8 +155,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -182,8 +168,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -197,8 +181,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -212,8 +194,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -227,8 +207,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -242,8 +220,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -257,8 +233,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -272,8 +246,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -287,8 +259,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -302,8 +272,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
@@ -317,8 +285,6 @@
 
     virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override;
     virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override;
-
-    virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
    
   };
 
diff --git a/src/parser/SV3_1aSplitterParserBaseVisitor.cpp b/src/parser/SV3_1aSplitterParserBaseVisitor.cpp
deleted file mode 100644
index 1d17a79..0000000
--- a/src/parser/SV3_1aSplitterParserBaseVisitor.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aSplitterParser.g4 by ANTLR 4.7.2
-
-
-#include "SV3_1aSplitterParserBaseVisitor.h"
-
-
diff --git a/src/parser/SV3_1aSplitterParserBaseVisitor.h b/src/parser/SV3_1aSplitterParserBaseVisitor.h
deleted file mode 100644
index 8239f03..0000000
--- a/src/parser/SV3_1aSplitterParserBaseVisitor.h
+++ /dev/null
@@ -1,88 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aSplitterParser.g4 by ANTLR 4.7.2
-
-#pragma once
-
-
-#include "antlr4-runtime.h"
-#include "SV3_1aSplitterParserVisitor.h"
-
-
-/**
- * This class provides an empty implementation of SV3_1aSplitterParserVisitor, which can be
- * extended to create a visitor which only needs to handle a subset of the available methods.
- */
-class  SV3_1aSplitterParserBaseVisitor : public SV3_1aSplitterParserVisitor {
-public:
-
-  virtual antlrcpp::Any visitSource_text(SV3_1aSplitterParser::Source_textContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitDescription(SV3_1aSplitterParser::DescriptionContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitModule(SV3_1aSplitterParser::ModuleContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndmodule(SV3_1aSplitterParser::EndmoduleContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSv_interface(SV3_1aSplitterParser::Sv_interfaceContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndinterface(SV3_1aSplitterParser::EndinterfaceContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitProgram(SV3_1aSplitterParser::ProgramContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprogram(SV3_1aSplitterParser::EndprogramContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitPrimitive(SV3_1aSplitterParser::PrimitiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndprimitive(SV3_1aSplitterParser::EndprimitiveContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitSv_package(SV3_1aSplitterParser::Sv_packageContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndpackage(SV3_1aSplitterParser::EndpackageContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitChecker(SV3_1aSplitterParser::CheckerContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndchecker(SV3_1aSplitterParser::EndcheckerContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitConfig(SV3_1aSplitterParser::ConfigContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitEndconfig(SV3_1aSplitterParser::EndconfigContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-  virtual antlrcpp::Any visitAny(SV3_1aSplitterParser::AnyContext *ctx) override {
-    return visitChildren(ctx);
-  }
-
-
-};
-
diff --git a/src/parser/SV3_1aSplitterParserVisitor.cpp b/src/parser/SV3_1aSplitterParserVisitor.cpp
deleted file mode 100644
index 88034b3..0000000
--- a/src/parser/SV3_1aSplitterParserVisitor.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aSplitterParser.g4 by ANTLR 4.7.2
-
-
-#include "SV3_1aSplitterParserVisitor.h"
-
-
diff --git a/src/parser/SV3_1aSplitterParserVisitor.h b/src/parser/SV3_1aSplitterParserVisitor.h
deleted file mode 100644
index 7ab7624..0000000
--- a/src/parser/SV3_1aSplitterParserVisitor.h
+++ /dev/null
@@ -1,58 +0,0 @@
-
-// Generated from /home/alain/Surelog/grammar/SV3_1aSplitterParser.g4 by ANTLR 4.7.2
-
-#pragma once
-
-
-#include "antlr4-runtime.h"
-#include "SV3_1aSplitterParser.h"
-
-
-
-/**
- * This class defines an abstract visitor for a parse tree
- * produced by SV3_1aSplitterParser.
- */
-class  SV3_1aSplitterParserVisitor : public antlr4::tree::AbstractParseTreeVisitor {
-public:
-
-  /**
-   * Visit parse trees produced by SV3_1aSplitterParser.
-   */
-    virtual antlrcpp::Any visitSource_text(SV3_1aSplitterParser::Source_textContext *context) = 0;
-
-    virtual antlrcpp::Any visitDescription(SV3_1aSplitterParser::DescriptionContext *context) = 0;
-
-    virtual antlrcpp::Any visitModule(SV3_1aSplitterParser::ModuleContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndmodule(SV3_1aSplitterParser::EndmoduleContext *context) = 0;
-
-    virtual antlrcpp::Any visitSv_interface(SV3_1aSplitterParser::Sv_interfaceContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndinterface(SV3_1aSplitterParser::EndinterfaceContext *context) = 0;
-
-    virtual antlrcpp::Any visitProgram(SV3_1aSplitterParser::ProgramContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprogram(SV3_1aSplitterParser::EndprogramContext *context) = 0;
-
-    virtual antlrcpp::Any visitPrimitive(SV3_1aSplitterParser::PrimitiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndprimitive(SV3_1aSplitterParser::EndprimitiveContext *context) = 0;
-
-    virtual antlrcpp::Any visitSv_package(SV3_1aSplitterParser::Sv_packageContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndpackage(SV3_1aSplitterParser::EndpackageContext *context) = 0;
-
-    virtual antlrcpp::Any visitChecker(SV3_1aSplitterParser::CheckerContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndchecker(SV3_1aSplitterParser::EndcheckerContext *context) = 0;
-
-    virtual antlrcpp::Any visitConfig(SV3_1aSplitterParser::ConfigContext *context) = 0;
-
-    virtual antlrcpp::Any visitEndconfig(SV3_1aSplitterParser::EndconfigContext *context) = 0;
-
-    virtual antlrcpp::Any visitAny(SV3_1aSplitterParser::AnyContext *context) = 0;
-
-
-};
-
