diff --git a/runtime/Cpp/demo/Mac/antlr4-cpp-demo/main.cpp b/runtime/Cpp/demo/Mac/antlr4-cpp-demo/main.cpp index 361e4080e..61ad21118 100644 --- a/runtime/Cpp/demo/Mac/antlr4-cpp-demo/main.cpp +++ b/runtime/Cpp/demo/Mac/antlr4-cpp-demo/main.cpp @@ -33,6 +33,9 @@ int main(int argc, const char * argv[]) { ANTLRInputStream input(L"ab"); TestLexer lexer(&input); CommonTokenStream tokens(&lexer); + for (auto token : tokens.getTokens()) { + std::cout << token << std::endl; + } TestParser parser(&tokens); std::shared_ptr tree = parser.main(); diff --git a/runtime/Cpp/demo/Mac/antlrcpp.xcodeproj/project.pbxproj b/runtime/Cpp/demo/Mac/antlrcpp.xcodeproj/project.pbxproj index 323b85ce6..d46ccbd02 100644 --- a/runtime/Cpp/demo/Mac/antlrcpp.xcodeproj/project.pbxproj +++ b/runtime/Cpp/demo/Mac/antlrcpp.xcodeproj/project.pbxproj @@ -598,7 +598,7 @@ 27C666861C9584050021E494 /* LexerInterpreter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexerInterpreter.cpp; path = ../../runtime/LexerInterpreter.cpp; sourceTree = SOURCE_ROOT; }; 27C666871C9584050021E494 /* LexerInterpreter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LexerInterpreter.h; path = ../../runtime/LexerInterpreter.h; sourceTree = SOURCE_ROOT; }; 27C666881C9584050021E494 /* LexerNoViableAltException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexerNoViableAltException.cpp; path = ../../runtime/LexerNoViableAltException.cpp; sourceTree = SOURCE_ROOT; wrapsLines = 0; }; - 27C666891C9584050021E494 /* LexerNoViableAltException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LexerNoViableAltException.h; path = ../../runtime/LexerNoViableAltException.h; sourceTree = SOURCE_ROOT; }; + 27C666891C9584050021E494 /* LexerNoViableAltException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LexerNoViableAltException.h; path = ../../runtime/LexerNoViableAltException.h; sourceTree = SOURCE_ROOT; wrapsLines = 0; }; 27C6668A1C9584050021E494 /* ListTokenSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ListTokenSource.cpp; path = ../../runtime/ListTokenSource.cpp; sourceTree = SOURCE_ROOT; wrapsLines = 0; }; 27C6668B1C9584050021E494 /* ListTokenSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ListTokenSource.h; path = ../../runtime/ListTokenSource.h; sourceTree = SOURCE_ROOT; }; 27C6668C1C9584050021E494 /* NoViableAltException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NoViableAltException.cpp; path = ../../runtime/NoViableAltException.cpp; sourceTree = SOURCE_ROOT; wrapsLines = 0; }; @@ -729,7 +729,7 @@ 27C668661C9584B60021E494 /* DFA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DFA.h; sourceTree = ""; }; 27C668671C9584B60021E494 /* DFASerializer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DFASerializer.cpp; sourceTree = ""; wrapsLines = 0; }; 27C668681C9584B60021E494 /* DFASerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DFASerializer.h; sourceTree = ""; }; - 27C668691C9584B60021E494 /* DFAState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DFAState.cpp; sourceTree = ""; }; + 27C668691C9584B60021E494 /* DFAState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DFAState.cpp; sourceTree = ""; wrapsLines = 0; }; 27C6686A1C9584B60021E494 /* DFAState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DFAState.h; sourceTree = ""; }; 27C6686B1C9584B60021E494 /* LexerDFASerializer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LexerDFASerializer.cpp; sourceTree = ""; }; 27C6686C1C9584B60021E494 /* LexerDFASerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LexerDFASerializer.h; sourceTree = ""; }; diff --git a/runtime/Cpp/runtime/ANTLRErrorListener.h b/runtime/Cpp/runtime/ANTLRErrorListener.h index 58f981c2b..9bee5ece7 100755 --- a/runtime/Cpp/runtime/ANTLRErrorListener.h +++ b/runtime/Cpp/runtime/ANTLRErrorListener.h @@ -108,7 +108,7 @@ namespace runtime { /// the ATN configuration set where the ambiguity was /// determined virtual void reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, bool exact, - antlrcpp::BitSet *ambigAlts, atn::ATNConfigSet *configs) = 0; + antlrcpp::BitSet *ambigAlts, std::shared_ptr configs) = 0; /// /// This method is called when an SLL conflict occurs and the parser is about @@ -131,7 +131,7 @@ namespace runtime { /// the ATN configuration set where the SLL conflict was /// detected virtual void reportAttemptingFullContext(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - antlrcpp::BitSet *conflictingAlts, atn::ATNConfigSet *configs) = 0; + antlrcpp::BitSet *conflictingAlts, std::shared_ptr configs) = 0; /// /// This method is called by the parser when a full-context prediction has a @@ -161,7 +161,7 @@ namespace runtime { /// the ATN configuration set where the unambiguous prediction /// was determined virtual void reportContextSensitivity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - int prediction, atn::ATNConfigSet *configs) = 0; + int prediction, std::shared_ptr configs) = 0; }; } // namespace runtime diff --git a/runtime/Cpp/runtime/BaseErrorListener.cpp b/runtime/Cpp/runtime/BaseErrorListener.cpp index cfe3cab8c..1407e332c 100755 --- a/runtime/Cpp/runtime/BaseErrorListener.cpp +++ b/runtime/Cpp/runtime/BaseErrorListener.cpp @@ -39,13 +39,13 @@ void BaseErrorListener::syntaxError(IRecognizer *recognizer, Token *offendingSym } void BaseErrorListener::reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - bool exact, antlrcpp::BitSet *ambigAlts, atn::ATNConfigSet *configs) { + bool exact, antlrcpp::BitSet *ambigAlts, std::shared_ptr configs) { } void BaseErrorListener::reportAttemptingFullContext(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, - size_t stopIndex, antlrcpp::BitSet *conflictingAlts, atn::ATNConfigSet *configs) { + size_t stopIndex, antlrcpp::BitSet *conflictingAlts, std::shared_ptr configs) { } void BaseErrorListener::reportContextSensitivity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - int prediction, atn::ATNConfigSet *configs) { + int prediction, std::shared_ptr configs) { } diff --git a/runtime/Cpp/runtime/BaseErrorListener.h b/runtime/Cpp/runtime/BaseErrorListener.h index 471491e3d..ba3dd8595 100755 --- a/runtime/Cpp/runtime/BaseErrorListener.h +++ b/runtime/Cpp/runtime/BaseErrorListener.h @@ -45,16 +45,16 @@ namespace runtime { class BaseErrorListener : public ANTLRErrorListener { virtual void syntaxError(IRecognizer *recognizer, Token *offendingSymbol, size_t line, int charPositionInLine, - const std::wstring &msg, std::exception_ptr e) override; + const std::wstring &msg, std::exception_ptr e) override; virtual void reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, bool exact, - antlrcpp::BitSet *ambigAlts, atn::ATNConfigSet *configs) override; + antlrcpp::BitSet *ambigAlts, std::shared_ptr configs) override; virtual void reportAttemptingFullContext(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - antlrcpp::BitSet *conflictingAlts, atn::ATNConfigSet *configs) override; + antlrcpp::BitSet *conflictingAlts, std::shared_ptr configs) override; virtual void reportContextSensitivity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - int prediction, atn::ATNConfigSet *configs) override; + int prediction, std::shared_ptr configs) override; }; } // namespace runtime diff --git a/runtime/Cpp/runtime/DiagnosticErrorListener.cpp b/runtime/Cpp/runtime/DiagnosticErrorListener.cpp index 5c35cf2c7..ee4c40142 100755 --- a/runtime/Cpp/runtime/DiagnosticErrorListener.cpp +++ b/runtime/Cpp/runtime/DiagnosticErrorListener.cpp @@ -47,7 +47,7 @@ DiagnosticErrorListener::DiagnosticErrorListener(bool exactOnly) : exactOnly(exa } void DiagnosticErrorListener::reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - bool exact, antlrcpp::BitSet *ambigAlts, atn::ATNConfigSet *configs) { + bool exact, antlrcpp::BitSet *ambigAlts, std::shared_ptr configs) { if (exactOnly && !exact) { return; } @@ -61,7 +61,7 @@ void DiagnosticErrorListener::reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, } void DiagnosticErrorListener::reportAttemptingFullContext(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, - size_t stopIndex, antlrcpp::BitSet *conflictingAlts, atn::ATNConfigSet *configs) { + size_t stopIndex, antlrcpp::BitSet *conflictingAlts, std::shared_ptr configs) { std::wstring decision = getDecisionDescription(recognizer, dfa); std::wstring text = recognizer->getTokenStream()->getText(misc::Interval((int)startIndex, (int)stopIndex)); std::wstring message = L"reportAttemptingFullContext d = " + decision + L", input = '" + text + L"'"; @@ -69,7 +69,7 @@ void DiagnosticErrorListener::reportAttemptingFullContext(Parser *recognizer, df } void DiagnosticErrorListener::reportContextSensitivity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, - size_t stopIndex, int prediction, atn::ATNConfigSet *configs) { + size_t stopIndex, int prediction, std::shared_ptr configs) { std::wstring decision = getDecisionDescription(recognizer, dfa); std::wstring text = recognizer->getTokenStream()->getText(misc::Interval((int)startIndex, (int)stopIndex)); std::wstring message = L"reportContextSensitivity d = " + decision + L", input = '" + text + L"'"; @@ -93,7 +93,8 @@ std::wstring DiagnosticErrorListener::getDecisionDescription(Parser *recognizer, return std::to_wstring(decision) + L"(" + ruleName + L")"; } -antlrcpp::BitSet *DiagnosticErrorListener::getConflictingAlts(antlrcpp::BitSet *reportedAlts, atn::ATNConfigSet *configs) { +antlrcpp::BitSet *DiagnosticErrorListener::getConflictingAlts(antlrcpp::BitSet *reportedAlts, + std::shared_ptr configs) { if (reportedAlts != nullptr) { return reportedAlts; } diff --git a/runtime/Cpp/runtime/DiagnosticErrorListener.h b/runtime/Cpp/runtime/DiagnosticErrorListener.h index c4768970c..3832629f8 100755 --- a/runtime/Cpp/runtime/DiagnosticErrorListener.h +++ b/runtime/Cpp/runtime/DiagnosticErrorListener.h @@ -82,13 +82,13 @@ namespace runtime { DiagnosticErrorListener(bool exactOnly); virtual void reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, bool exact, - antlrcpp::BitSet *ambigAlts, atn::ATNConfigSet *configs) override; + antlrcpp::BitSet *ambigAlts, std::shared_ptr configs) override; virtual void reportAttemptingFullContext(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - antlrcpp::BitSet *conflictingAlts, atn::ATNConfigSet *configs) override; + antlrcpp::BitSet *conflictingAlts, std::shared_ptr configs) override; virtual void reportContextSensitivity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - int prediction, atn::ATNConfigSet *configs) override; + int prediction, std::shared_ptr configs) override; protected: virtual std::wstring getDecisionDescription(Parser *recognizer, dfa::DFA *dfa); @@ -103,7 +103,7 @@ namespace runtime { /// The conflicting or ambiguous configuration set. /// Returns {@code reportedAlts} if it is not {@code null}, otherwise /// returns the set of alternatives represented in {@code configs}. - virtual antlrcpp::BitSet *getConflictingAlts(antlrcpp::BitSet *reportedAlts, atn::ATNConfigSet *configs); + virtual antlrcpp::BitSet *getConflictingAlts(antlrcpp::BitSet *reportedAlts, std::shared_ptr configs); }; } // namespace runtime diff --git a/runtime/Cpp/runtime/LexerNoViableAltException.cpp b/runtime/Cpp/runtime/LexerNoViableAltException.cpp index e1c689ca6..02c9b50a5 100755 --- a/runtime/Cpp/runtime/LexerNoViableAltException.cpp +++ b/runtime/Cpp/runtime/LexerNoViableAltException.cpp @@ -38,7 +38,8 @@ using namespace org::antlr::v4::runtime; -LexerNoViableAltException::LexerNoViableAltException(Lexer *lexer, CharStream *input, size_t startIndex, atn::ATNConfigSet *deadEndConfigs) +LexerNoViableAltException::LexerNoViableAltException(Lexer *lexer, CharStream *input, size_t startIndex, + std::shared_ptr deadEndConfigs) : RecognitionException(lexer, input, nullptr, nullptr), _startIndex(startIndex), _deadEndConfigs(deadEndConfigs) { } @@ -46,7 +47,7 @@ size_t LexerNoViableAltException::getStartIndex() { return _startIndex; } -atn::ATNConfigSet* LexerNoViableAltException::getDeadEndConfigs() { +std::shared_ptr LexerNoViableAltException::getDeadEndConfigs() { return _deadEndConfigs; } diff --git a/runtime/Cpp/runtime/LexerNoViableAltException.h b/runtime/Cpp/runtime/LexerNoViableAltException.h index 90e14bc01..ea1a4fa0e 100755 --- a/runtime/Cpp/runtime/LexerNoViableAltException.h +++ b/runtime/Cpp/runtime/LexerNoViableAltException.h @@ -41,10 +41,11 @@ namespace runtime { class LexerNoViableAltException : public RecognitionException { public: - LexerNoViableAltException(Lexer *lexer, CharStream *input, size_t startIndex, atn::ATNConfigSet *deadEndConfigs); + LexerNoViableAltException(Lexer *lexer, CharStream *input, size_t startIndex, + std::shared_ptr deadEndConfigs); virtual size_t getStartIndex(); - virtual atn::ATNConfigSet* getDeadEndConfigs(); + virtual std::shared_ptr getDeadEndConfigs(); virtual std::wstring toString(); private: @@ -52,7 +53,7 @@ namespace runtime { const size_t _startIndex; /// Which configurations did we try at input.index() that couldn't match input.LA(1)? - atn::ATNConfigSet* _deadEndConfigs; + std::shared_ptr _deadEndConfigs; }; diff --git a/runtime/Cpp/runtime/NoViableAltException.cpp b/runtime/Cpp/runtime/NoViableAltException.cpp index 2beb8f9f5..f3d3ea977 100755 --- a/runtime/Cpp/runtime/NoViableAltException.cpp +++ b/runtime/Cpp/runtime/NoViableAltException.cpp @@ -36,12 +36,12 @@ using namespace org::antlr::v4::runtime; NoViableAltException::NoViableAltException(Parser *recognizer) - : NoViableAltException(recognizer, recognizer->getInputStream(), recognizer->getCurrentToken(), recognizer->getCurrentToken(), - nullptr, recognizer->ctx) { + : NoViableAltException(recognizer, recognizer->getInputStream(), recognizer->getCurrentToken(), + recognizer->getCurrentToken(), nullptr, recognizer->ctx) { } NoViableAltException::NoViableAltException(Parser *recognizer, TokenStream *input, Token *startToken, - Token *offendingToken, atn::ATNConfigSet *deadEndConfigs, ParserRuleContext *ctx) + Token *offendingToken, std::shared_ptr deadEndConfigs, ParserRuleContext *ctx) : RecognitionException(recognizer, input, ctx, offendingToken), _deadEndConfigs(deadEndConfigs), _startToken(startToken) { } @@ -49,6 +49,6 @@ Token* NoViableAltException::getStartToken() const { return _startToken; } -atn::ATNConfigSet* NoViableAltException::getDeadEndConfigs() const { +std::shared_ptr NoViableAltException::getDeadEndConfigs() const { return _deadEndConfigs; } diff --git a/runtime/Cpp/runtime/NoViableAltException.h b/runtime/Cpp/runtime/NoViableAltException.h index 773712cd5..0e13b428a 100755 --- a/runtime/Cpp/runtime/NoViableAltException.h +++ b/runtime/Cpp/runtime/NoViableAltException.h @@ -48,14 +48,14 @@ namespace runtime { public: NoViableAltException(Parser *recognizer); // LL(1) error NoViableAltException(Parser *recognizer, TokenStream *input, Token *startToken, Token *offendingToken, - atn::ATNConfigSet *deadEndConfigs, ParserRuleContext *ctx); + std::shared_ptr deadEndConfigs, ParserRuleContext *ctx); virtual Token* getStartToken() const; - virtual atn::ATNConfigSet* getDeadEndConfigs() const; + virtual std::shared_ptr getDeadEndConfigs() const; private: /// Which configurations did we try at input.index() that couldn't match input.LT(1)? - atn::ATNConfigSet* _deadEndConfigs; + std::shared_ptr _deadEndConfigs; /// The token object at the start index; the input stream might /// not be buffering tokens so get a reference to it. (At the diff --git a/runtime/Cpp/runtime/ProxyErrorListener.cpp b/runtime/Cpp/runtime/ProxyErrorListener.cpp index c2f9b4ccc..ec182cfb1 100755 --- a/runtime/Cpp/runtime/ProxyErrorListener.cpp +++ b/runtime/Cpp/runtime/ProxyErrorListener.cpp @@ -34,21 +34,21 @@ using namespace org::antlr::v4::runtime; void ProxyErrorListener::reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - bool exact, antlrcpp::BitSet *ambigAlts, atn::ATNConfigSet *configs) { + bool exact, antlrcpp::BitSet *ambigAlts, std::shared_ptr configs) { for (auto listener : *delegates) { listener->reportAmbiguity(recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs); } } void ProxyErrorListener::reportAttemptingFullContext(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, - size_t stopIndex, antlrcpp::BitSet *conflictingAlts, atn::ATNConfigSet *configs) { + size_t stopIndex, antlrcpp::BitSet *conflictingAlts, std::shared_ptr configs) { for (auto listener : *delegates) { listener->reportAttemptingFullContext(recognizer, dfa, startIndex, stopIndex, conflictingAlts, configs); } } void ProxyErrorListener::reportContextSensitivity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - int prediction, atn::ATNConfigSet *configs) { + int prediction, std::shared_ptr configs) { for (auto listener : *delegates) { listener->reportContextSensitivity(recognizer, dfa, startIndex, stopIndex, prediction, configs); } diff --git a/runtime/Cpp/runtime/ProxyErrorListener.h b/runtime/Cpp/runtime/ProxyErrorListener.h index 32290dba9..b274eeb18 100755 --- a/runtime/Cpp/runtime/ProxyErrorListener.h +++ b/runtime/Cpp/runtime/ProxyErrorListener.h @@ -62,13 +62,13 @@ namespace runtime { } virtual void reportAmbiguity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, bool exact, - antlrcpp::BitSet *ambigAlts, atn::ATNConfigSet *configs) override; + antlrcpp::BitSet *ambigAlts, std::shared_ptr configs) override; virtual void reportAttemptingFullContext(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - antlrcpp::BitSet *conflictingAlts, atn::ATNConfigSet *configs) override; + antlrcpp::BitSet *conflictingAlts, std::shared_ptr configs) override; virtual void reportContextSensitivity(Parser *recognizer, dfa::DFA *dfa, size_t startIndex, size_t stopIndex, - int prediction, atn::ATNConfigSet *configs) override; + int prediction, std::shared_ptr configs) override; }; } // namespace runtime diff --git a/runtime/Cpp/runtime/atn/ATNConfigSet.cpp b/runtime/Cpp/runtime/atn/ATNConfigSet.cpp index d9b113a25..87d962333 100755 --- a/runtime/Cpp/runtime/atn/ATNConfigSet.cpp +++ b/runtime/Cpp/runtime/atn/ATNConfigSet.cpp @@ -62,7 +62,7 @@ ATNConfigSet::ATNConfigSet(bool fullCtx, std::shared_ptr lookup) : InitializeInstanceFields(); } -ATNConfigSet::ATNConfigSet(ATNConfigSet *old) : ATNConfigSet(old->fullCtx, std::shared_ptr()) { +ATNConfigSet::ATNConfigSet(std::shared_ptr old) : ATNConfigSet(old->fullCtx, std::shared_ptr()) { addAll(old); uniqueAlt = old->uniqueAlt; conflictingAlts = old->conflictingAlts; @@ -106,7 +106,7 @@ bool ATNConfigSet::add(ATNConfig *config, PredictionContextMergeCache *mergeCach return true; } -bool ATNConfigSet::addAll(ATNConfigSet *other) { +bool ATNConfigSet::addAll(std::shared_ptr other) { for (auto &c : other->configs) { add(c); } @@ -152,19 +152,19 @@ void ATNConfigSet::optimizeConfigs(ATNSimulator *interpreter) { } } -bool ATNConfigSet::equals(ATNConfigSet *other) { - if (other == this) { +bool ATNConfigSet::operator == (const ATNConfigSet &other) { + if (&other == this) { return true; } bool configEquals = true; - if (configs.size() == other->configs.size()) { + if (configs.size() == other.configs.size()) { for (size_t i = 0; i < configs.size(); i++) { - if (other->configs.size() < i) { + if (other.configs.size() < i) { configEquals = false; break; } - if (configs[i] != other->configs[i]) { + if (configs[i] != other.configs[i]) { configEquals = false; break; } @@ -173,9 +173,9 @@ bool ATNConfigSet::equals(ATNConfigSet *other) { configEquals = false; } - bool same = configs.size() > 0 && configEquals && this->fullCtx == other->fullCtx && this->uniqueAlt == other->uniqueAlt && - this->conflictingAlts == other->conflictingAlts && this->hasSemanticContext == other->hasSemanticContext && - this->dipsIntoOuterContext == other->dipsIntoOuterContext; // includes stack context + bool same = configs.size() > 0 && configEquals && fullCtx == other.fullCtx && uniqueAlt == other.uniqueAlt && + conflictingAlts == other.conflictingAlts && hasSemanticContext == other.hasSemanticContext && + dipsIntoOuterContext == other.dipsIntoOuterContext; // includes stack context return same; } diff --git a/runtime/Cpp/runtime/atn/ATNConfigSet.h b/runtime/Cpp/runtime/atn/ATNConfigSet.h index 03e4272c1..db428eb9e 100755 --- a/runtime/Cpp/runtime/atn/ATNConfigSet.h +++ b/runtime/Cpp/runtime/atn/ATNConfigSet.h @@ -84,7 +84,7 @@ namespace atn { const bool fullCtx; ATNConfigSet(bool fullCtx, std::shared_ptr lookup); - ATNConfigSet(ATNConfigSet *old); + ATNConfigSet(std::shared_ptr old); virtual ~ATNConfigSet(); @@ -114,9 +114,9 @@ namespace atn { virtual void optimizeConfigs(ATNSimulator *interpreter); - bool addAll(ATNConfigSet *other); + bool addAll(std::shared_ptr other); - virtual bool equals(ATNConfigSet *other); + bool operator == (const ATNConfigSet &other); virtual size_t hashCode(); virtual size_t size(); virtual bool isEmpty(); diff --git a/runtime/Cpp/runtime/atn/ATNSimulator.cpp b/runtime/Cpp/runtime/atn/ATNSimulator.cpp index 783f8887a..e22b7447e 100755 --- a/runtime/Cpp/runtime/atn/ATNSimulator.cpp +++ b/runtime/Cpp/runtime/atn/ATNSimulator.cpp @@ -40,7 +40,7 @@ using namespace org::antlr::v4::runtime::dfa; using namespace org::antlr::v4::runtime::atn; -DFAState ATNSimulator::ERROR(INT32_MAX); +const std::shared_ptr ATNSimulator::ERROR = std::make_shared(INT32_MAX); ATNSimulator::ATNSimulator() { } diff --git a/runtime/Cpp/runtime/atn/ATNSimulator.h b/runtime/Cpp/runtime/atn/ATNSimulator.h index b6371dc76..9f7c370e9 100755 --- a/runtime/Cpp/runtime/atn/ATNSimulator.h +++ b/runtime/Cpp/runtime/atn/ATNSimulator.h @@ -48,7 +48,7 @@ namespace atn { ATNSimulator(); /// Must distinguish between missing edge and edge we know leads nowhere. - static dfa::DFAState ERROR; + static const std::shared_ptr ERROR; ATN atn; ATNSimulator(const ATN &atn, std::shared_ptr sharedContextCache); diff --git a/runtime/Cpp/runtime/atn/LexerATNSimulator.cpp b/runtime/Cpp/runtime/atn/LexerATNSimulator.cpp index e054e9b22..55c875761 100755 --- a/runtime/Cpp/runtime/atn/LexerATNSimulator.cpp +++ b/runtime/Cpp/runtime/atn/LexerATNSimulator.cpp @@ -125,7 +125,7 @@ int LexerATNSimulator::matchATN(CharStream *input) { size_t old_mode = _mode; - ATNConfigSet *s0_closure = computeStartState(input, startState); + std::shared_ptr s0_closure = computeStartState(input, startState); bool suppressEdge = s0_closure->hasSemanticContext; s0_closure->hasSemanticContext = false; @@ -179,7 +179,7 @@ int LexerATNSimulator::execATN(CharStream *input, dfa::DFAState *ds0) { target = computeTargetState(input, s, t); } - if (target == &ERROR) { + if (target == ERROR.get()) { break; } @@ -215,7 +215,7 @@ dfa::DFAState *LexerATNSimulator::getExistingTargetState(dfa::DFAState *s, ssize } dfa::DFAState *LexerATNSimulator::computeTargetState(CharStream *input, dfa::DFAState *s, ssize_t t) { - OrderedATNConfigSet *reach = new OrderedATNConfigSet(); + std::shared_ptr reach = std::make_shared(); // if we don't find an existing DFA state // Fill reach starting from closure, following t transitions @@ -224,16 +224,16 @@ dfa::DFAState *LexerATNSimulator::computeTargetState(CharStream *input, dfa::DFA if (reach->isEmpty()) { // we got nowhere on t from s // we got nowhere on t, don't throw out this knowledge; it'd // cause a failover from DFA later. - addDFAEdge(s, t, &ERROR); + addDFAEdge(s, t, ERROR.get()); // stop when we can't match any more char - return &ERROR; + return ERROR.get(); } // Add an edge from s to target DFA found/created for reach return addDFAEdge(s, t, reach); } -int LexerATNSimulator::failOrAccept(SimState *prevAccept, CharStream *input, ATNConfigSet *reach, ssize_t t) { +int LexerATNSimulator::failOrAccept(SimState *prevAccept, CharStream *input, std::shared_ptr reach, ssize_t t) { if (prevAccept->dfaState != nullptr) { int ruleIndex = prevAccept->dfaState->lexerRuleIndex; int actionIndex = prevAccept->dfaState->lexerActionIndex; @@ -249,7 +249,8 @@ int LexerATNSimulator::failOrAccept(SimState *prevAccept, CharStream *input, ATN } } -void LexerATNSimulator::getReachableConfigSet(CharStream *input, ATNConfigSet *closure, ATNConfigSet *reach, ssize_t t) { +void LexerATNSimulator::getReachableConfigSet(CharStream *input, std::shared_ptr closure, + std::shared_ptr reach, ssize_t t) { // this is used to skip processing for configs which have a lower priority // than a config that already reached an accept state for the same rule int skipAlt = ATN::INVALID_ALT_NUMBER; @@ -313,9 +314,9 @@ atn::ATNState *LexerATNSimulator::getReachableTarget(Transition *trans, ssize_t return nullptr; } -atn::ATNConfigSet *LexerATNSimulator::computeStartState(CharStream *input, ATNState *p) { +std::shared_ptr LexerATNSimulator::computeStartState(CharStream *input, ATNState *p) { std::shared_ptr initialContext = PredictionContext::EMPTY; // ml: the purpose of this assignment is unclear - ATNConfigSet *configs = new OrderedATNConfigSet(); + std::shared_ptr configs = std::make_shared(); for (size_t i = 0; i < p->getNumberOfTransitions(); i++) { ATNState *target = p->transition(i)->target; LexerATNConfig *c = new LexerATNConfig(target, (int)(i + 1), initialContext); @@ -324,7 +325,7 @@ atn::ATNConfigSet *LexerATNSimulator::computeStartState(CharStream *input, ATNSt return configs; } -bool LexerATNSimulator::closure(CharStream *input, LexerATNConfig *config, ATNConfigSet *configs, +bool LexerATNSimulator::closure(CharStream *input, LexerATNConfig *config, std::shared_ptr configs, bool currentAltReachedAcceptState, bool speculative) { if (debug) { std::wcout << L"closure(" << config->toString(true) << L")" << std::endl; @@ -382,7 +383,8 @@ bool LexerATNSimulator::closure(CharStream *input, LexerATNConfig *config, ATNCo return currentAltReachedAcceptState; } -atn::LexerATNConfig *LexerATNSimulator::getEpsilonTarget(CharStream *input, LexerATNConfig *config, Transition *t, ATNConfigSet *configs, bool speculative) { +atn::LexerATNConfig *LexerATNSimulator::getEpsilonTarget(CharStream *input, LexerATNConfig *config, Transition *t, + std::shared_ptr configs, bool speculative) { LexerATNConfig *c = nullptr; switch (t->getSerializationType()) { case Transition::RULE: { @@ -469,7 +471,7 @@ void LexerATNSimulator::captureSimState(SimState *settings, CharStream *input, d settings->dfaState = dfaState; } -dfa::DFAState *LexerATNSimulator::addDFAEdge(dfa::DFAState *from, ssize_t t, ATNConfigSet *q) { +dfa::DFAState *LexerATNSimulator::addDFAEdge(dfa::DFAState *from, ssize_t t, std::shared_ptr q) { /* leading to this call, ATNConfigSet.hasSemanticContext is used as a * marker indicating dynamic predicate evaluation makes this edge * dependent on the specific input sequence, so the static edge in the @@ -512,7 +514,7 @@ void LexerATNSimulator::addDFAEdge(dfa::DFAState *p, ssize_t t, dfa::DFAState *q p->edges[(size_t)(t - MIN_DFA_EDGE)] = q; // connect } -dfa::DFAState *LexerATNSimulator::addDFAState(ATNConfigSet *configs) { +dfa::DFAState *LexerATNSimulator::addDFAState(std::shared_ptr configs) { /* the lexer evaluates predicates on-the-fly; by this point configs * should not contain any configurations with unevaluated predicates. */ diff --git a/runtime/Cpp/runtime/atn/LexerATNSimulator.h b/runtime/Cpp/runtime/atn/LexerATNSimulator.h index 828d48d58..87344bc39 100755 --- a/runtime/Cpp/runtime/atn/LexerATNSimulator.h +++ b/runtime/Cpp/runtime/atn/LexerATNSimulator.h @@ -155,20 +155,20 @@ namespace atn { /// returns . virtual dfa::DFAState *computeTargetState(CharStream *input, dfa::DFAState *s, ssize_t t); - virtual int failOrAccept(SimState *prevAccept, CharStream *input, ATNConfigSet *reach, ssize_t t); + virtual int failOrAccept(SimState *prevAccept, CharStream *input, std::shared_ptr reach, ssize_t t); /// /// Given a starting configuration set, figure out all ATN configurations /// we can reach upon input {@code t}. Parameter {@code reach} is a return /// parameter. /// - void getReachableConfigSet(CharStream *input, ATNConfigSet *closure, ATNConfigSet *reach, ssize_t t); + void getReachableConfigSet(CharStream *input, std::shared_ptr closure, std::shared_ptr reach, ssize_t t); virtual void accept(CharStream *input, int ruleIndex, int actionIndex, size_t index, size_t line, size_t charPos); virtual ATNState *getReachableTarget(Transition *trans, ssize_t t); - virtual atn::ATNConfigSet *computeStartState(CharStream *input, ATNState *p); + virtual std::shared_ptr computeStartState(CharStream *input, ATNState *p); /// /// Since the alternatives within any lexer decision are ordered by @@ -179,10 +179,12 @@ namespace atn { /// /// {@code true} if an accept state is reached, otherwise /// {@code false}. - virtual bool closure(CharStream *input, LexerATNConfig *config, ATNConfigSet *configs, bool currentAltReachedAcceptState, bool speculative); + virtual bool closure(CharStream *input, LexerATNConfig *config, std::shared_ptr configs, + bool currentAltReachedAcceptState, bool speculative); // side-effect: can alter configs.hasSemanticContext - virtual LexerATNConfig *getEpsilonTarget(CharStream *input, LexerATNConfig *config, Transition *t, ATNConfigSet *configs, bool speculative); + virtual LexerATNConfig *getEpsilonTarget(CharStream *input, LexerATNConfig *config, Transition *t, + std::shared_ptr configs, bool speculative); /// /// Evaluate a predicate specified in the lexer. @@ -207,7 +209,7 @@ namespace atn { virtual bool evaluatePredicate(CharStream *input, int ruleIndex, int predIndex, bool speculative); virtual void captureSimState(SimState *settings, CharStream *input, dfa::DFAState *dfaState); - virtual dfa::DFAState *addDFAEdge(dfa::DFAState *from, ssize_t t, ATNConfigSet *q); + virtual dfa::DFAState *addDFAEdge(dfa::DFAState *from, ssize_t t, std::shared_ptr q); virtual void addDFAEdge(dfa::DFAState *p, ssize_t t, dfa::DFAState *q); /// @@ -216,7 +218,7 @@ namespace atn { /// configuration containing an ATN rule stop state. Later, when /// traversing the DFA, we will know which rule to accept. /// - virtual dfa::DFAState *addDFAState(ATNConfigSet *configs); + virtual dfa::DFAState *addDFAState(std::shared_ptr configs); public: dfa::DFA *getDFA(size_t mode); diff --git a/runtime/Cpp/runtime/atn/ParserATNSimulator.cpp b/runtime/Cpp/runtime/atn/ParserATNSimulator.cpp index fb1cad8bd..002ba9f2b 100755 --- a/runtime/Cpp/runtime/atn/ParserATNSimulator.cpp +++ b/runtime/Cpp/runtime/atn/ParserATNSimulator.cpp @@ -99,8 +99,8 @@ int ParserATNSimulator::adaptivePredict(TokenStream *input, int decision, Parser std::wcout << L"predictATN decision " << dfa->decision << L" exec LA(1)==" << getLookaheadName(input) << L", outerContext=" << outerContext->toString(parser) << std::endl; } bool fullCtx = false; - ATNConfigSet *s0_closure = computeStartState(dynamic_cast(dfa->atnStartState), - ParserRuleContext::EMPTY, fullCtx); + std::shared_ptr s0_closure = computeStartState(dynamic_cast(dfa->atnStartState), + ParserRuleContext::EMPTY, fullCtx); dfa->s0 = addDFAState(dfa, new dfa::DFAState(s0_closure)); } @@ -142,7 +142,7 @@ int ParserATNSimulator::execATN(dfa::DFA *dfa, dfa::DFAState *s0, TokenStream *i D = computeTargetState(dfa, previousD, t); } - if (D == &ERROR) { + if (D == ERROR.get()) { // if any configs in previous dipped into outer context, that // means that input up to t actually finished entry rule // at least for SLL decision. Full LL doesn't dip into outer @@ -192,7 +192,7 @@ int ParserATNSimulator::execATN(dfa::DFA *dfa, dfa::DFAState *s0, TokenStream *i std::wcout << L"ctx sensitive state " << outerContext << L" in " << D << std::endl; } bool fullCtx = true; - ATNConfigSet *s0_closure = computeStartState(dfa->atnStartState, outerContext, fullCtx); + std::shared_ptr s0_closure = computeStartState(dfa->atnStartState, outerContext, fullCtx); reportAttemptingFullContext(dfa, conflictingAlts, D->configs, startIndex, input->index()); int alt = execATNWithFullContext(dfa, D, s0_closure, input, startIndex, outerContext); return alt; @@ -240,10 +240,10 @@ dfa::DFAState *ParserATNSimulator::getExistingTargetState(dfa::DFAState *previou } dfa::DFAState *ParserATNSimulator::computeTargetState(dfa::DFA *dfa, dfa::DFAState *previousD, ssize_t t) { - ATNConfigSet *reach = computeReachSet(previousD->configs, t, false); + std::shared_ptr reach = computeReachSet(previousD->configs, t, false); if (reach == nullptr) { - addDFAEdge(dfa, previousD, t, &ERROR); - return &ERROR; + addDFAEdge(dfa, previousD, t, ERROR.get()); + return ERROR.get(); } // create new target state; we'll add to DFA after it's complete @@ -309,15 +309,15 @@ void ParserATNSimulator::predicateDFAState(dfa::DFAState *dfaState, DecisionStat } } -int ParserATNSimulator::execATNWithFullContext(dfa::DFA *dfa, dfa::DFAState *D, ATNConfigSet *s0, TokenStream *input, - size_t startIndex, ParserRuleContext *outerContext) { +int ParserATNSimulator::execATNWithFullContext(dfa::DFA *dfa, dfa::DFAState *D, std::shared_ptr s0, + TokenStream *input, size_t startIndex, ParserRuleContext *outerContext) { if (debug || debug_list_atn_decisions) { std::cout << "execATNWithFullContext " << s0 << std::endl; } bool fullCtx = true; bool foundExactAmbig = false; - ATNConfigSet *reach = nullptr; - ATNConfigSet *previous = s0; + std::shared_ptr reach; + std::shared_ptr previous = s0; input->seek(startIndex); ssize_t t = input->LA(1); int predictedAlt; @@ -422,12 +422,13 @@ int ParserATNSimulator::execATNWithFullContext(dfa::DFA *dfa, dfa::DFAState *D, return predictedAlt; } -atn::ATNConfigSet *ParserATNSimulator::computeReachSet(ATNConfigSet *closure, ssize_t t, bool fullCtx) { +std::shared_ptr ParserATNSimulator::computeReachSet(std::shared_ptr closure, + ssize_t t, bool fullCtx) { if (debug) { std::wcout << L"in computeReachSet, starting closure: " << closure << std::endl; } - ATNConfigSet *intermediate = new ATNConfigSet(fullCtx, std::shared_ptr()); + std::shared_ptr intermediate = std::make_shared(fullCtx, std::shared_ptr()); /* Configurations already in a rule stop state indicate reaching the end * of the decision rule (local context) or end of the start rule (full @@ -472,8 +473,7 @@ atn::ATNConfigSet *ParserATNSimulator::computeReachSet(ATNConfigSet *closure, ss } // Now figure out where the reach operation can take us... - - ATNConfigSet *reach = nullptr; + std::shared_ptr reach; /* This block optimizes the reach operation for intermediate sets which * trivially indicate a termination state for the overall @@ -502,7 +502,7 @@ atn::ATNConfigSet *ParserATNSimulator::computeReachSet(ATNConfigSet *closure, ss * operation on the intermediate set to compute its initial value. */ if (reach == nullptr) { - reach = new ATNConfigSet(fullCtx, std::shared_ptr()); + reach = std::make_shared(fullCtx, std::shared_ptr()); std::set closureBusy; for (auto c : *intermediate->configLookup) { @@ -553,12 +553,13 @@ atn::ATNConfigSet *ParserATNSimulator::computeReachSet(ATNConfigSet *closure, ss return reach; } -atn::ATNConfigSet *ParserATNSimulator::removeAllConfigsNotInRuleStopState(ATNConfigSet *configs, bool lookToEndOfRule) { +std::shared_ptr ParserATNSimulator::removeAllConfigsNotInRuleStopState(std::shared_ptr configs, + bool lookToEndOfRule) { if (PredictionModeClass::allConfigsInRuleStopStates(configs)) { return configs; } - ATNConfigSet *result = new ATNConfigSet(configs->fullCtx, std::shared_ptr()); + std::shared_ptr result = std::make_shared(configs->fullCtx, std::shared_ptr()); for (auto config : *configs->configLookup) { if (dynamic_cast(config->state) != nullptr) { @@ -578,10 +579,10 @@ atn::ATNConfigSet *ParserATNSimulator::removeAllConfigsNotInRuleStopState(ATNCon return result; } -atn::ATNConfigSet *ParserATNSimulator::computeStartState(ATNState *p, RuleContext *ctx, bool fullCtx) { +std::shared_ptr ParserATNSimulator::computeStartState(ATNState *p, RuleContext *ctx, bool fullCtx) { // always at least the implicit call to start rule PredictionContextRef initialContext = PredictionContext::fromRuleContext(atn, ctx); - ATNConfigSet *configs = new ATNConfigSet(fullCtx, std::shared_ptr()); + std::shared_ptr configs = std::make_shared(fullCtx, std::shared_ptr()); for (size_t i = 0; i < p->getNumberOfTransitions(); i++) { ATNState *target = p->transition(i)->target; @@ -603,7 +604,7 @@ atn::ATNState *ParserATNSimulator::getReachableTarget(Transition *trans, int tty // Note that caller must memory manage the returned value from this function std::vector ParserATNSimulator::getPredsForAmbigAlts(BitSet *ambigAlts, - ATNConfigSet *configs, size_t nalts) { + std::shared_ptr configs, size_t nalts) { // REACH=[1|1|[]|0:0, 1|2|[]|0:1] /* altToPred starts as an array of all null contexts. The entry at index i * corresponds to alternative i. altToPred[i] may have one of three values: @@ -670,7 +671,7 @@ std::vector ParserATNSimulator::getPredicatePre return pairs; } -int ParserATNSimulator::getAltThatFinishedDecisionEntryRule(ATNConfigSet *configs) { +int ParserATNSimulator::getAltThatFinishedDecisionEntryRule(std::shared_ptr configs) { misc::IntervalSet *alts = nullptr; for (auto c : *configs->configLookup) { if (c->reachesIntoOuterContext > 0 || (dynamic_cast(c->state) != nullptr && c->context->hasEmptyPath())) { @@ -713,14 +714,16 @@ BitSet *ParserATNSimulator::evalSemanticContext(std::vector &closureBusy, bool collectPredicates, bool fullCtx) { +void ParserATNSimulator::closure(ATNConfig *config, std::shared_ptr configs, + std::set &closureBusy, bool collectPredicates, bool fullCtx) { const int initialDepth = 0; closureCheckingStopState(config, configs, closureBusy, collectPredicates, fullCtx, initialDepth); assert(!fullCtx || !configs->dipsIntoOuterContext); } -void ParserATNSimulator::closureCheckingStopState(ATNConfig *config, ATNConfigSet *configs, std::set &closureBusy, bool collectPredicates, bool fullCtx, int depth) { +void ParserATNSimulator::closureCheckingStopState(ATNConfig *config, std::shared_ptr configs, + std::set &closureBusy, bool collectPredicates, bool fullCtx, int depth) { if (debug) { std::wcout << L"closure(" << config->toString(true) << L")" << std::endl; } @@ -770,7 +773,8 @@ void ParserATNSimulator::closureCheckingStopState(ATNConfig *config, ATNConfigSe closure_(config, configs, closureBusy, collectPredicates, fullCtx, depth); } -void ParserATNSimulator::closure_(ATNConfig *config, ATNConfigSet *configs, std::set &closureBusy, bool collectPredicates, bool fullCtx, int depth) { +void ParserATNSimulator::closure_(ATNConfig *config, std::shared_ptr configs, + std::set &closureBusy, bool collectPredicates, bool fullCtx, int depth) { ATNState *p = config->state; // optimization if (!p->onlyHasEpsilonTransitions()) { @@ -940,12 +944,12 @@ atn::ATNConfig *ParserATNSimulator::ruleTransition(ATNConfig *config, RuleTransi return new atn::ATNConfig(config, t->target, newContext); } -BitSet ParserATNSimulator::getConflictingAlts(ATNConfigSet *configs) { +BitSet ParserATNSimulator::getConflictingAlts(std::shared_ptr configs) { std::vector altsets = PredictionModeClass::getConflictingAltSubsets(configs); return PredictionModeClass::getAlts(altsets); } -BitSet ParserATNSimulator::getConflictingAltsOrUniqueAlt(ATNConfigSet *configs) { +BitSet ParserATNSimulator::getConflictingAltsOrUniqueAlt(std::shared_ptr configs) { BitSet conflictingAlts; if (configs->uniqueAlt != ATN::INVALID_ALT_NUMBER) { conflictingAlts.set((size_t)configs->uniqueAlt); @@ -997,11 +1001,11 @@ void ParserATNSimulator::dumpDeadEndConfigs(NoViableAltException *nvae) { } NoViableAltException *ParserATNSimulator::noViableAlt(TokenStream *input, ParserRuleContext *outerContext, - ATNConfigSet *configs, size_t startIndex) { + std::shared_ptr configs, size_t startIndex) { return new NoViableAltException(parser, input, input->get(startIndex), input->LT(1), configs, outerContext); } -int ParserATNSimulator::getUniqueAlt(ATNConfigSet *configs) { +int ParserATNSimulator::getUniqueAlt(std::shared_ptr configs) { int alt = ATN::INVALID_ALT_NUMBER; for (auto c : *configs->configLookup) { if (alt == ATN::INVALID_ALT_NUMBER) { @@ -1049,7 +1053,7 @@ dfa::DFAState *ParserATNSimulator::addDFAEdge(dfa::DFA *dfa, dfa::DFAState *from } dfa::DFAState *ParserATNSimulator::addDFAState(dfa::DFA *dfa, dfa::DFAState *D) { - if (D == &ERROR) { + if (D == ERROR.get()) { return D; } @@ -1073,8 +1077,8 @@ dfa::DFAState *ParserATNSimulator::addDFAState(dfa::DFA *dfa, dfa::DFAState *D) } } -void ParserATNSimulator::reportAttemptingFullContext(dfa::DFA *dfa, BitSet *conflictingAlts, ATNConfigSet *configs, - size_t startIndex, size_t stopIndex) { +void ParserATNSimulator::reportAttemptingFullContext(dfa::DFA *dfa, BitSet *conflictingAlts, + std::shared_ptr configs, size_t startIndex, size_t stopIndex) { if (debug || retry_debug) { misc::Interval interval = misc::Interval((int)startIndex, (int)stopIndex); std::wcout << L"reportAttemptingFullContext decision=" << dfa->decision << L":" << configs << L", input=" << parser->getTokenStream()->getText(interval) << std::endl; @@ -1084,8 +1088,8 @@ void ParserATNSimulator::reportAttemptingFullContext(dfa::DFA *dfa, BitSet *conf } } -void ParserATNSimulator::reportContextSensitivity(dfa::DFA *dfa, int prediction, ATNConfigSet *configs, size_t startIndex, - size_t stopIndex) { +void ParserATNSimulator::reportContextSensitivity(dfa::DFA *dfa, int prediction, std::shared_ptr configs, + size_t startIndex, size_t stopIndex) { if (debug || retry_debug) { misc::Interval interval = misc::Interval((int)startIndex, (int)stopIndex); std::wcout << L"reportContextSensitivity decision=" << dfa->decision << L":" << configs << L", input=" << parser->getTokenStream()->getText(interval) << std::endl; @@ -1096,7 +1100,7 @@ void ParserATNSimulator::reportContextSensitivity(dfa::DFA *dfa, int prediction, } void ParserATNSimulator::reportAmbiguity(dfa::DFA *dfa, dfa::DFAState *D, size_t startIndex, size_t stopIndex, - bool exact, BitSet *ambigAlts, ATNConfigSet *configs) { + bool exact, BitSet *ambigAlts, std::shared_ptr configs) { if (debug || retry_debug) { // ParserATNPathFinder finder = new ParserATNPathFinder(parser, atn); // int i = 1; diff --git a/runtime/Cpp/runtime/atn/ParserATNSimulator.h b/runtime/Cpp/runtime/atn/ParserATNSimulator.h index 4a640ae59..f983cdcdf 100755 --- a/runtime/Cpp/runtime/atn/ParserATNSimulator.h +++ b/runtime/Cpp/runtime/atn/ParserATNSimulator.h @@ -353,9 +353,9 @@ namespace atn { virtual void predicateDFAState(dfa::DFAState *dfaState, DecisionState *decisionState); // comes back with reach.uniqueAlt set to a valid alt - virtual int execATNWithFullContext(dfa::DFA *dfa, dfa::DFAState *D, ATNConfigSet *s0, TokenStream *input, size_t startIndex, ParserRuleContext *outerContext); // how far we got before failing over + virtual int execATNWithFullContext(dfa::DFA *dfa, dfa::DFAState *D, std::shared_ptr s0, TokenStream *input, size_t startIndex, ParserRuleContext *outerContext); // how far we got before failing over - virtual ATNConfigSet *computeReachSet(ATNConfigSet *closure, ssize_t t, bool fullCtx); + virtual std::shared_ptr computeReachSet(std::shared_ptr closure, ssize_t t, bool fullCtx); /// /// Return a configuration set containing only the configurations from @@ -376,19 +376,19 @@ namespace atn { /// {@code configs} if all configurations in {@code configs} are in a /// rule stop state, otherwise return a new configuration set containing only /// the configurations from {@code configs} which are in a rule stop state - virtual ATNConfigSet *removeAllConfigsNotInRuleStopState(ATNConfigSet *configs, bool lookToEndOfRule); + virtual std::shared_ptr removeAllConfigsNotInRuleStopState(std::shared_ptr configs, bool lookToEndOfRule); - virtual ATNConfigSet *computeStartState(ATNState *p, RuleContext *ctx, bool fullCtx); + virtual std::shared_ptr computeStartState(ATNState *p, RuleContext *ctx, bool fullCtx); virtual ATNState *getReachableTarget(Transition *trans, int ttype); virtual std::vector getPredsForAmbigAlts(antlrcpp::BitSet *ambigAlts, - ATNConfigSet *configs, size_t nalts); + std::shared_ptr configs, size_t nalts); virtual std::vector getPredicatePredictions(antlrcpp::BitSet *ambigAlts, std::vector altToPred); - virtual int getAltThatFinishedDecisionEntryRule(ATNConfigSet *configs); + virtual int getAltThatFinishedDecisionEntryRule(std::shared_ptr configs); /// /// Look through a list of predicate/alt pairs, returning alts for the @@ -407,14 +407,14 @@ namespace atn { ambig detection thought :( */ - virtual void closure(ATNConfig *config, ATNConfigSet *configs, std::set &closureBusy, + virtual void closure(ATNConfig *config, std::shared_ptr configs, std::set &closureBusy, bool collectPredicates, bool fullCtx); - virtual void closureCheckingStopState(ATNConfig *config, ATNConfigSet *configs, std::set &closureBusy, - bool collectPredicates, bool fullCtx, int depth); + virtual void closureCheckingStopState(ATNConfig *config, std::shared_ptr configs, + std::set &closureBusy, bool collectPredicates, bool fullCtx, int depth); /// Do the actual work of walking epsilon edges. - virtual void closure_(ATNConfig *config, ATNConfigSet *configs, std::set &closureBusy, + virtual void closure_(ATNConfig *config, std::shared_ptr configs, std::set &closureBusy, bool collectPredicates, bool fullCtx, int depth); public: @@ -432,7 +432,7 @@ namespace atn { virtual ATNConfig *ruleTransition(ATNConfig *config, RuleTransition *t); - virtual antlrcpp::BitSet getConflictingAlts(ATNConfigSet *configs); + virtual antlrcpp::BitSet getConflictingAlts(std::shared_ptr configs); /// /// Sam pointed out a problem with the previous definition, v3, of @@ -471,7 +471,7 @@ namespace atn { /// that we still need to pursue. /// - virtual antlrcpp::BitSet getConflictingAltsOrUniqueAlt(ATNConfigSet *configs); + virtual antlrcpp::BitSet getConflictingAltsOrUniqueAlt(std::shared_ptr configs); public: virtual std::wstring getTokenName(ssize_t t); @@ -486,9 +486,10 @@ namespace atn { virtual void dumpDeadEndConfigs(NoViableAltException *nvae); protected: - virtual NoViableAltException *noViableAlt(TokenStream *input, ParserRuleContext *outerContext, ATNConfigSet *configs, size_t startIndex); + virtual NoViableAltException *noViableAlt(TokenStream *input, ParserRuleContext *outerContext, + std::shared_ptr configs, size_t startIndex); - static int getUniqueAlt(ATNConfigSet *configs); + static int getUniqueAlt(std::shared_ptr configs); /// /// Add an edge to the DFA, if possible. This method calls @@ -527,14 +528,16 @@ namespace atn { /// state was not already present. virtual dfa::DFAState *addDFAState(dfa::DFA *dfa, dfa::DFAState *D); - virtual void reportAttemptingFullContext(dfa::DFA *dfa, antlrcpp::BitSet *conflictingAlts, ATNConfigSet *configs, - size_t startIndex, size_t stopIndex); + virtual void reportAttemptingFullContext(dfa::DFA *dfa, antlrcpp::BitSet *conflictingAlts, + std::shared_ptr configs, size_t startIndex, size_t stopIndex); - virtual void reportContextSensitivity(dfa::DFA *dfa, int prediction, ATNConfigSet *configs, size_t startIndex, size_t stopIndex); + virtual void reportContextSensitivity(dfa::DFA *dfa, int prediction, std::shared_ptr configs, + size_t startIndex, size_t stopIndex); /// /// If context sensitive parsing, we know it's ambiguity not conflict - virtual void reportAmbiguity(dfa::DFA *dfa, dfa::DFAState *D, size_t startIndex, size_t stopIndex, bool exact, antlrcpp::BitSet *ambigAlts, ATNConfigSet *configs); + virtual void reportAmbiguity(dfa::DFA *dfa, dfa::DFAState *D, size_t startIndex, size_t stopIndex, bool exact, + antlrcpp::BitSet *ambigAlts, std::shared_ptr configs); public: void setPredictionMode(PredictionMode mode); diff --git a/runtime/Cpp/runtime/atn/PredictionMode.cpp b/runtime/Cpp/runtime/atn/PredictionMode.cpp index f69a55e86..c1c5bdd51 100755 --- a/runtime/Cpp/runtime/atn/PredictionMode.cpp +++ b/runtime/Cpp/runtime/atn/PredictionMode.cpp @@ -59,7 +59,7 @@ struct AltAndContextConfigComparer { } }; -bool PredictionModeClass::hasSLLConflictTerminatingPrediction(PredictionMode* mode, ATNConfigSet* configs) { +bool PredictionModeClass::hasSLLConflictTerminatingPrediction(PredictionMode* mode, std::shared_ptr configs) { /* Configs in rule stop states indicate reaching the end of the decision * rule (local context) or end of start rule (full context). If all * configs meet this condition, then none of the configurations is able @@ -76,7 +76,7 @@ bool PredictionModeClass::hasSLLConflictTerminatingPrediction(PredictionMode* mo // since we'll often fail over anyway. if (configs->hasSemanticContext) { // dup configs, tossing out semantic predicates - ATNConfigSet* dup = new ATNConfigSet(true, std::shared_ptr()); + std::shared_ptr dup = std::make_shared(true, std::shared_ptr()); for (ATNConfig config : *configs->configLookup) { ATNConfig* c = new ATNConfig(&config, SemanticContext::NONE); dup->add(c); @@ -93,7 +93,7 @@ bool PredictionModeClass::hasSLLConflictTerminatingPrediction(PredictionMode* mo return heuristic; } -bool PredictionModeClass::hasConfigInRuleStopState(ATNConfigSet* configs) { +bool PredictionModeClass::hasConfigInRuleStopState(std::shared_ptr configs) { for (ATNConfig c : *configs->configLookup) { if (dynamic_cast(c.state) != NULL) { return true; @@ -103,7 +103,7 @@ bool PredictionModeClass::hasConfigInRuleStopState(ATNConfigSet* configs) { return false; } -bool PredictionModeClass::allConfigsInRuleStopStates(ATNConfigSet* configs) { +bool PredictionModeClass::allConfigsInRuleStopStates(std::shared_ptr configs) { for (ATNConfig config : *configs->configLookup) { if (dynamic_cast(config.state) == NULL) { return false; @@ -170,7 +170,7 @@ antlrcpp::BitSet PredictionModeClass::getAlts(const std::vector PredictionModeClass::getConflictingAltSubsets(ATNConfigSet* configs) { +std::vector PredictionModeClass::getConflictingAltSubsets(std::shared_ptr configs) { std::unordered_map configToAlts; for (auto config : *configs->configLookup) { configToAlts[config].set((size_t)config->alt); @@ -182,7 +182,7 @@ std::vector PredictionModeClass::getConflictingAltSubsets(ATNC return values; } -std::map PredictionModeClass::getStateToAltMap(ATNConfigSet* configs) { +std::map PredictionModeClass::getStateToAltMap(std::shared_ptr configs) { std::map m; for (ATNConfig c : *configs->configLookup) { m[c.state].set((size_t)c.alt); @@ -190,7 +190,7 @@ std::map PredictionModeClass::getStateToAltMap(ATNC return m; } -bool PredictionModeClass::hasStateAssociatedWithOneAlt(ATNConfigSet* configs) { +bool PredictionModeClass::hasStateAssociatedWithOneAlt(std::shared_ptr configs) { std::map x = getStateToAltMap(configs); for (std::map::iterator it = x.begin(); it != x.end(); it++){ if (it->second.count() == 1) return true; diff --git a/runtime/Cpp/runtime/atn/PredictionMode.h b/runtime/Cpp/runtime/atn/PredictionMode.h index 7beca5c03..1df81c27d 100755 --- a/runtime/Cpp/runtime/atn/PredictionMode.h +++ b/runtime/Cpp/runtime/atn/PredictionMode.h @@ -204,8 +204,7 @@ namespace atn { /// the configurations to strip out all of the predicates so that a standard /// will merge everything ignoring predicates. /// - static bool hasSLLConflictTerminatingPrediction(PredictionMode *mode, - ATNConfigSet *configs); + static bool hasSLLConflictTerminatingPrediction(PredictionMode *mode, std::shared_ptr configs); /// /// Checks if any configuration in {@code configs} is in a @@ -217,7 +216,7 @@ namespace atn { /// the configuration set to test /// {@code true} if any configuration in {@code configs} is in a /// , otherwise {@code false} - static bool hasConfigInRuleStopState(ATNConfigSet *configs); + static bool hasConfigInRuleStopState(std::shared_ptr configs); /// /// Checks if all configurations in {@code configs} are in a @@ -229,7 +228,7 @@ namespace atn { /// the configuration set to test /// {@code true} if all configurations in {@code configs} are in a /// , otherwise {@code false} - static bool allConfigsInRuleStopStates(ATNConfigSet *configs); + static bool allConfigsInRuleStopStates(std::shared_ptr configs); /// /// Full LL prediction termination. @@ -486,7 +485,7 @@ namespace atn { /// alt and not pred /// /// - static std::vector getConflictingAltSubsets(ATNConfigSet *configs); + static std::vector getConflictingAltSubsets(std::shared_ptr configs); /// /// Get a map from state to alt subset from a configuration set. For each @@ -497,9 +496,9 @@ namespace atn { /// cref="ATNConfig#alt alt"/> /// /// - static std::map getStateToAltMap(ATNConfigSet *configs); + static std::map getStateToAltMap(std::shared_ptr configs); - static bool hasStateAssociatedWithOneAlt(ATNConfigSet *configs); + static bool hasStateAssociatedWithOneAlt(std::shared_ptr configs); static int getSingleViableAlt(const std::vector &altsets); }; diff --git a/runtime/Cpp/runtime/dfa/DFAState.cpp b/runtime/Cpp/runtime/dfa/DFAState.cpp index 12b1057ef..f98c8c1e1 100755 --- a/runtime/Cpp/runtime/dfa/DFAState.cpp +++ b/runtime/Cpp/runtime/dfa/DFAState.cpp @@ -55,10 +55,11 @@ void DFAState::PredPrediction::InitializeInstanceFields() { DFAState::DFAState() : DFAState(-1) { } -DFAState::DFAState(int stateNumber) : DFAState(new atn::ATNConfigSet(true, std::shared_ptr()), stateNumber) { +DFAState::DFAState(int stateNumber) : DFAState(std::make_shared(true, std::shared_ptr()), + stateNumber) { } -DFAState::DFAState(atn::ATNConfigSet *configs, int stateNumber) : configs(configs), stateNumber(stateNumber) { +DFAState::DFAState(std::shared_ptr configs, int stateNumber) : configs(configs), stateNumber(stateNumber) { InitializeInstanceFields(); } @@ -82,13 +83,13 @@ size_t DFAState::hashCode() { return hash; } -bool DFAState::equals(DFAState *o) { +bool DFAState::operator == (const DFAState &o) { // compare set of ATN configurations in this set with other - if (this == o) { + if (this == &o) { return true; } - return configs->equals(o->configs); + return configs == o.configs; } std::wstring DFAState::toString() { diff --git a/runtime/Cpp/runtime/dfa/DFAState.h b/runtime/Cpp/runtime/dfa/DFAState.h index 38f37ea1b..8d8496c95 100755 --- a/runtime/Cpp/runtime/dfa/DFAState.h +++ b/runtime/Cpp/runtime/dfa/DFAState.h @@ -78,7 +78,7 @@ namespace dfa { public: int stateNumber; - atn::ATNConfigSet *configs; + std::shared_ptr configs; /// /// {@code edges[symbol]} points to target of symbol. Shift up by 1 so (-1) @@ -124,7 +124,7 @@ namespace dfa { /// Map a predicate to a predicted alternative. DFAState(); DFAState(int stateNumber); - DFAState(atn::ATNConfigSet *configs, int stateNumber = -1); + DFAState(std::shared_ptr configs, int stateNumber = -1); /// /// Get the set of all alts mentioned by all ATN configurations in this @@ -147,7 +147,7 @@ namespace dfa { /// exists that has this exact set of ATN configurations. The /// is irrelevant. /// - virtual bool equals(DFAState *o); + bool operator == (const DFAState &o); virtual std::wstring toString();