expressir 1.2.3 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.cross_rubies +0 -6
- data/.github/workflows/rake.yml +223 -31
- data/.gitignore +7 -1
- data/.gitmodules +3 -0
- data/.rubocop.yml +13 -4
- data/README.adoc +8 -0
- data/Rakefile +4 -1
- data/bin/console +0 -1
- data/bin/rspec +3 -3
- data/exe/expressir +4 -2
- data/exe/format +1 -1
- data/exe/format-test +25 -25
- data/exe/generate-parser +16 -13
- data/expressir.gemspec +11 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/CMakeLists.txt +44 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj +11 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj.filters +0 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj +11 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj.filters +0 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj +11 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj.filters +0 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj +19 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj.filters +0 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/project.pbxproj +51 -35
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/xcshareddata/xcschemes/antlr4.xcscheme +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/xcshareddata/xcschemes/antlr4_ios.xcscheme +1 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/xcshareddata/xcschemes/antlr4_static.xcscheme +1 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRFileStream.cpp +1 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRFileStream.h +9 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.cpp +43 -18
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.h +16 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonToken.cpp +2 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonTokenFactory.cpp +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonTokenFactory.h +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/DefaultErrorStrategy.cpp +16 -13
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.cpp +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.h +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.cpp +5 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.h +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/IntStream.h +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.cpp +2 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.h +9 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.cpp +0 -15
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.h +1 -7
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ListTokenSource.cpp +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ListTokenSource.h +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.cpp +51 -31
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.h +1 -7
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.cpp +27 -39
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.h +1 -7
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.cpp +20 -23
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.h +21 -21
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ProxyErrorListener.cpp +4 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RecognitionException.cpp +0 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.cpp +16 -27
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.h +12 -17
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.cpp +4 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.h +5 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuntimeMetaData.cpp +2 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Token.h +7 -7
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenSource.h +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.cpp +6 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.cpp +15 -18
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.h +12 -18
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Version.h +42 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.cpp +13 -53
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.h +11 -27
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-common.h +19 -58
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-runtime.h +7 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.cpp +6 -57
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.h +35 -15
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.cpp +29 -36
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.h +36 -27
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.cpp +58 -54
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.h +77 -31
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.cpp +22 -32
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.h +22 -24
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp +335 -464
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.h +9 -62
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.cpp +9 -39
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.h +6 -22
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.cpp +10 -26
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.h +42 -36
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.cpp +33 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.h +36 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.cpp +2 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.cpp +49 -22
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.h +20 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.cpp +1 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.h +5 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.h +5 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.h +10 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionInfo.h +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.cpp +0 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.h +12 -8
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.cpp +2 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.h +6 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.cpp +139 -108
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.h +10 -43
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.cpp +16 -33
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.h +12 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.cpp +69 -82
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.h +17 -28
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.cpp +12 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.h +45 -11
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.cpp +48 -44
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.h +31 -18
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionType.h +3 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.cpp +14 -26
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.h +12 -16
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.cpp +15 -32
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.h +12 -24
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.cpp +23 -29
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.h +13 -19
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.cpp +13 -26
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.h +12 -16
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.cpp +6 -17
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.h +12 -16
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.cpp +6 -17
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.h +12 -16
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.cpp +13 -26
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.h +12 -16
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.cpp +6 -17
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.h +11 -15
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.cpp +13 -26
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.h +13 -17
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.h +5 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.cpp +1 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.cpp +6 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.h +8 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp +169 -152
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.h +26 -19
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulatorOptions.h +50 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.h +5 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.h +5 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.cpp +2 -11
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.h +15 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.cpp +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.h +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.cpp +4 -14
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.h +22 -11
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.cpp +255 -338
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.h +87 -116
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.cpp +56 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.h +64 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.cpp +167 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.h +101 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCacheOptions.h +71 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextType.h +21 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.cpp +18 -17
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.h +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.cpp +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.h +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.cpp +1 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.h +4 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.cpp +1 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.h +5 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.cpp +197 -156
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.h +92 -81
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContextType.h +23 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SerializedATNView.h +101 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.cpp +2 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.h +11 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.cpp +39 -34
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.h +17 -10
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.h +5 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.cpp +6 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.h +6 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.h +5 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.cpp +1 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.h +11 -22
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.cpp +27 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.h +33 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.cpp +1 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.h +4 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.cpp +11 -23
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.h +20 -15
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.cpp +2 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.h +4 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.cpp +9 -50
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.h +57 -48
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.cpp +1 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.h +3 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.cpp +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.h +3 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.cpp +1 -29
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.h +10 -10
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.cpp +15 -28
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.h +1 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.cpp +54 -68
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.h +35 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.cpp +0 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.h +1 -155
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Arrays.cpp +2 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Arrays.h +39 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/BitSet.h +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.cpp +13 -54
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.h +16 -29
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Casts.h +34 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Declarations.h +0 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.cpp +25 -23
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.h +2 -40
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Unicode.h +28 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.cpp +242 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.h +54 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/AbstractParseTreeVisitor.h +13 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.h +7 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.cpp +36 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.h +14 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/IterativeParseTreeWalker.cpp +14 -19
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.cpp +0 -3
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.h +14 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeType.h +22 -0
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeVisitor.h +4 -4
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.cpp +8 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.h +30 -6
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.h +10 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.cpp +2 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.h +4 -5
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/Trees.cpp +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/pattern/ParseTreePattern.cpp +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/pattern/ParseTreePatternMatcher.cpp +1 -2
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPath.cpp +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.cpp +128 -119
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.h +18 -27
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathRuleElement.cpp +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathTokenElement.cpp +1 -1
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/tests/Utf8Test.cpp +110 -0
- data/ext/express-parser/antlrgen/Express.interp +1 -1
- data/ext/express-parser/antlrgen/ExpressBaseListener.cpp +1 -1
- data/ext/express-parser/antlrgen/ExpressBaseListener.h +1 -1
- data/ext/express-parser/antlrgen/ExpressBaseVisitor.cpp +1 -1
- data/ext/express-parser/antlrgen/ExpressBaseVisitor.h +200 -200
- data/ext/express-parser/antlrgen/ExpressLexer.cpp +645 -1129
- data/ext/express-parser/antlrgen/ExpressLexer.h +20 -27
- data/ext/express-parser/antlrgen/ExpressLexer.interp +1 -1
- data/ext/express-parser/antlrgen/ExpressListener.cpp +1 -1
- data/ext/express-parser/antlrgen/ExpressListener.h +1 -1
- data/ext/express-parser/antlrgen/ExpressParser.cpp +1754 -1447
- data/ext/express-parser/antlrgen/ExpressParser.h +219 -223
- data/ext/express-parser/antlrgen/ExpressVisitor.cpp +1 -1
- data/ext/express-parser/antlrgen/ExpressVisitor.h +200 -200
- data/ext/express-parser/express_parser.cpp +165 -101
- data/ext/express-parser/extconf.rb +14 -14
- data/lib/expressir/config.rb +1 -1
- data/lib/expressir/express/parser.rb +17 -15
- data/lib/expressir/express/visitor.rb +7 -3
- data/lib/expressir/model.rb +78 -78
- data/lib/expressir/version.rb +1 -1
- data/rakelib/antlr4-native.rake +161 -0
- data/rakelib/cross-ruby.rake +213 -162
- data/spec/acceptance/version_spec.rb +17 -2
- data/spec/expressir/express/cache_spec.rb +23 -5
- data/spec/expressir/express/formatter_spec.rb +54 -8
- data/spec/expressir/express/parser_spec.rb +47 -11
- data/spec/expressir/model/model_element_spec.rb +198 -146
- data/spec/spec_helper.rb +7 -0
- metadata +79 -91
- data/demo.rb +0 -18
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.cpp +0 -621
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.h +0 -61
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.cpp +0 -14
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.h +0 -24
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.cpp +0 -15
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.cpp +0 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.cpp +0 -35
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.h +0 -27
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Makefile +0 -67
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.cpp +0 -16
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.cpp +0 -15
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.cpp +0 -12
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.cpp +0 -303
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.h +0 -112
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.cpp +0 -9
- data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.cpp +0 -9
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +0 -9589
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +0 -36619
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +0 -13294
- data/original/examples/employment/eclipse/.project +0 -17
- data/original/examples/employment/eclipse/Export/Employment.png +0 -0
- data/original/examples/employment/eclipse/Express/employment_schema.exp +0 -33
- data/original/examples/employment/eclipse/Express/employment_schema.xmi +0 -77
- data/original/examples/employment/eclipse/Express/employment_schema.xml +0 -93
- data/original/examples/employment/eclipse/Models/Employment.uml +0 -4
- data/original/examples/employment/eclipse/Models/Employment.umldi +0 -240
- data/original/examples/employment/eclipse/readme.txt +0 -7
- data/original/examples/employment/employment_schema.exp +0 -33
- data/original/examples/employment/employment_schema.rb +0 -232
- data/original/examples/employment/employment_schema.xml +0 -93
- data/original/examples/employment/employment_schema___module.rb +0 -46
- data/original/examples/employment/employment_schema___p28attr.rb +0 -126
- data/original/examples/employment/employment_schema___p28inst.rb +0 -26
- data/original/examples/employment/example_employment_data.xml +0 -1
- data/original/examples/employment/example_employment_data_copy.xml +0 -1
- data/original/examples/employment/example_employment_reader.rb +0 -30
- data/original/examples/employment/example_employment_writer.rb +0 -51
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +0 -3710
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +0 -35880
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +0 -15357
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +0 -9468
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +0 -8404
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +0 -43147
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +0 -18341
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +0 -11632
- data/original/exp2ruby.rb +0 -525
- data/original/expsm.rb +0 -34
- data/original/mapping_owl.rb +0 -1018
- data/original/mapping_sysml.rb +0 -2281
- data/original/mapping_uml2.rb +0 -599
- data/original/mapping_uml2_eclipse.rb +0 -433
- data/original/reeper.rb +0 -134
- data/spec/expressr_spec.rb +0 -5
@@ -3,35 +3,136 @@
|
|
3
3
|
* can be found in the LICENSE.txt file in the project root.
|
4
4
|
*/
|
5
5
|
|
6
|
-
#include "atn/
|
6
|
+
#include "atn/SingletonPredictionContext.h"
|
7
7
|
#include "misc/MurmurHash.h"
|
8
8
|
#include "atn/ArrayPredictionContext.h"
|
9
|
+
#include "atn/PredictionContextCache.h"
|
10
|
+
#include "atn/PredictionContextMergeCache.h"
|
9
11
|
#include "RuleContext.h"
|
10
12
|
#include "ParserRuleContext.h"
|
11
13
|
#include "atn/RuleTransition.h"
|
12
14
|
#include "support/Arrays.h"
|
13
15
|
#include "support/CPPUtils.h"
|
16
|
+
#include "support/Casts.h"
|
14
17
|
|
15
18
|
#include "atn/PredictionContext.h"
|
16
19
|
|
17
20
|
using namespace antlr4;
|
18
21
|
using namespace antlr4::misc;
|
19
22
|
using namespace antlr4::atn;
|
20
|
-
|
21
23
|
using namespace antlrcpp;
|
22
24
|
|
23
|
-
|
24
|
-
const Ref<PredictionContext> PredictionContext::EMPTY = std::make_shared<EmptyPredictionContext>();
|
25
|
+
namespace {
|
25
26
|
|
26
|
-
|
27
|
+
void combineCommonParents(std::vector<Ref<const PredictionContext>> &parents) {
|
28
|
+
std::unordered_set<Ref<const PredictionContext>> uniqueParents;
|
29
|
+
uniqueParents.reserve(parents.size());
|
30
|
+
for (const auto &parent : parents) {
|
31
|
+
uniqueParents.insert(parent);
|
32
|
+
}
|
33
|
+
for (auto &parent : parents) {
|
34
|
+
parent = *uniqueParents.find(parent);
|
35
|
+
}
|
36
|
+
}
|
27
37
|
|
28
|
-
PredictionContext
|
29
|
-
|
38
|
+
Ref<const PredictionContext> getCachedContextImpl(const Ref<const PredictionContext> &context,
|
39
|
+
PredictionContextCache &contextCache,
|
40
|
+
std::unordered_map<Ref<const PredictionContext>,
|
41
|
+
Ref<const PredictionContext>> &visited) {
|
42
|
+
if (context->isEmpty()) {
|
43
|
+
return context;
|
44
|
+
}
|
45
|
+
|
46
|
+
{
|
47
|
+
auto iterator = visited.find(context);
|
48
|
+
if (iterator != visited.end()) {
|
49
|
+
return iterator->second; // Not necessarly the same as context.
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
auto cached = contextCache.get(context);
|
54
|
+
if (cached) {
|
55
|
+
visited[context] = cached;
|
56
|
+
return cached;
|
57
|
+
}
|
58
|
+
|
59
|
+
bool changed = false;
|
60
|
+
|
61
|
+
std::vector<Ref<const PredictionContext>> parents(context->size());
|
62
|
+
for (size_t i = 0; i < parents.size(); i++) {
|
63
|
+
auto parent = getCachedContextImpl(context->getParent(i), contextCache, visited);
|
64
|
+
if (changed || parent != context->getParent(i)) {
|
65
|
+
if (!changed) {
|
66
|
+
parents.clear();
|
67
|
+
for (size_t j = 0; j < context->size(); j++) {
|
68
|
+
parents.push_back(context->getParent(j));
|
69
|
+
}
|
70
|
+
|
71
|
+
changed = true;
|
72
|
+
}
|
73
|
+
|
74
|
+
parents[i] = std::move(parent);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
if (!changed) {
|
79
|
+
visited[context] = context;
|
80
|
+
contextCache.put(context);
|
81
|
+
return context;
|
82
|
+
}
|
83
|
+
|
84
|
+
Ref<const PredictionContext> updated;
|
85
|
+
if (parents.empty()) {
|
86
|
+
updated = PredictionContext::EMPTY;
|
87
|
+
} else if (parents.size() == 1) {
|
88
|
+
updated = SingletonPredictionContext::create(std::move(parents[0]), context->getReturnState(0));
|
89
|
+
contextCache.put(updated);
|
90
|
+
} else {
|
91
|
+
updated = std::make_shared<ArrayPredictionContext>(std::move(parents), downCast<const ArrayPredictionContext*>(context.get())->returnStates);
|
92
|
+
contextCache.put(updated);
|
93
|
+
}
|
94
|
+
|
95
|
+
visited[updated] = updated;
|
96
|
+
visited[context] = updated;
|
97
|
+
|
98
|
+
return updated;
|
99
|
+
}
|
100
|
+
|
101
|
+
void getAllContextNodesImpl(const Ref<const PredictionContext> &context,
|
102
|
+
std::vector<Ref<const PredictionContext>> &nodes,
|
103
|
+
std::unordered_set<const PredictionContext*> &visited) {
|
104
|
+
|
105
|
+
if (visited.find(context.get()) != visited.end()) {
|
106
|
+
return; // Already done.
|
107
|
+
}
|
108
|
+
|
109
|
+
visited.insert(context.get());
|
110
|
+
nodes.push_back(context);
|
111
|
+
|
112
|
+
for (size_t i = 0; i < context->size(); i++) {
|
113
|
+
getAllContextNodesImpl(context->getParent(i), nodes, visited);
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
size_t insertOrAssignNodeId(std::unordered_map<const PredictionContext*, size_t> &nodeIds, size_t &nodeId, const PredictionContext *node) {
|
118
|
+
auto existing = nodeIds.find(node);
|
119
|
+
if (existing != nodeIds.end()) {
|
120
|
+
return existing->second;
|
121
|
+
}
|
122
|
+
return nodeIds.insert({node, nodeId++}).first->second;
|
123
|
+
}
|
30
124
|
|
31
|
-
PredictionContext::~PredictionContext() {
|
32
125
|
}
|
33
126
|
|
34
|
-
Ref<PredictionContext> PredictionContext::
|
127
|
+
const Ref<const PredictionContext> PredictionContext::EMPTY = std::make_shared<SingletonPredictionContext>(nullptr, PredictionContext::EMPTY_RETURN_STATE);
|
128
|
+
|
129
|
+
//----------------- PredictionContext ----------------------------------------------------------------------------------
|
130
|
+
|
131
|
+
PredictionContext::PredictionContext(PredictionContextType contextType) : _contextType(contextType), _hashCode(0) {}
|
132
|
+
|
133
|
+
PredictionContext::PredictionContext(PredictionContext&& other) : _contextType(other._contextType), _hashCode(other._hashCode.exchange(0, std::memory_order_relaxed)) {}
|
134
|
+
|
135
|
+
Ref<const PredictionContext> PredictionContext::fromRuleContext(const ATN &atn, RuleContext *outerContext) {
|
35
136
|
if (outerContext == nullptr) {
|
36
137
|
return PredictionContext::EMPTY;
|
37
138
|
}
|
@@ -43,15 +144,9 @@ Ref<PredictionContext> PredictionContext::fromRuleContext(const ATN &atn, RuleCo
|
|
43
144
|
}
|
44
145
|
|
45
146
|
// If we have a parent, convert it to a PredictionContext graph
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
RuleTransition *transition = (RuleTransition *)state->transitions[0];
|
50
|
-
return SingletonPredictionContext::create(parent, transition->followState->stateNumber);
|
51
|
-
}
|
52
|
-
|
53
|
-
bool PredictionContext::isEmpty() const {
|
54
|
-
return this == EMPTY.get();
|
147
|
+
auto parent = PredictionContext::fromRuleContext(atn, RuleContext::is(outerContext->parent) ? downCast<RuleContext*>(outerContext->parent) : nullptr);
|
148
|
+
const auto *transition = downCast<const RuleTransition*>(atn.states[outerContext->invokingState]->transitions[0].get());
|
149
|
+
return SingletonPredictionContext::create(std::move(parent), transition->followState->stateNumber);
|
55
150
|
}
|
56
151
|
|
57
152
|
bool PredictionContext::hasEmptyPath() const {
|
@@ -60,40 +155,19 @@ bool PredictionContext::hasEmptyPath() const {
|
|
60
155
|
}
|
61
156
|
|
62
157
|
size_t PredictionContext::hashCode() const {
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
}
|
71
|
-
|
72
|
-
size_t PredictionContext::calculateHashCode(Ref<PredictionContext> parent, size_t returnState) {
|
73
|
-
size_t hash = MurmurHash::initialize(INITIAL_HASH);
|
74
|
-
hash = MurmurHash::update(hash, parent);
|
75
|
-
hash = MurmurHash::update(hash, returnState);
|
76
|
-
hash = MurmurHash::finish(hash, 2);
|
77
|
-
return hash;
|
78
|
-
}
|
79
|
-
|
80
|
-
size_t PredictionContext::calculateHashCode(const std::vector<Ref<PredictionContext>> &parents,
|
81
|
-
const std::vector<size_t> &returnStates) {
|
82
|
-
size_t hash = MurmurHash::initialize(INITIAL_HASH);
|
83
|
-
|
84
|
-
for (auto parent : parents) {
|
85
|
-
hash = MurmurHash::update(hash, parent);
|
86
|
-
}
|
87
|
-
|
88
|
-
for (auto returnState : returnStates) {
|
89
|
-
hash = MurmurHash::update(hash, returnState);
|
158
|
+
auto hash = cachedHashCode();
|
159
|
+
if (hash == 0) {
|
160
|
+
hash = hashCodeImpl();
|
161
|
+
if (hash == 0) {
|
162
|
+
hash = std::numeric_limits<size_t>::max();
|
163
|
+
}
|
164
|
+
_hashCode.store(hash, std::memory_order_relaxed);
|
90
165
|
}
|
91
|
-
|
92
|
-
return MurmurHash::finish(hash, parents.size() + returnStates.size());
|
166
|
+
return hash;
|
93
167
|
}
|
94
168
|
|
95
|
-
Ref<PredictionContext> PredictionContext::merge(const Ref<PredictionContext>
|
96
|
-
|
169
|
+
Ref<const PredictionContext> PredictionContext::merge(Ref<const PredictionContext> a, Ref<const PredictionContext> b,
|
170
|
+
bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
|
97
171
|
assert(a && b);
|
98
172
|
|
99
173
|
// share same graph if both same
|
@@ -101,42 +175,45 @@ Ref<PredictionContext> PredictionContext::merge(const Ref<PredictionContext> &a,
|
|
101
175
|
return a;
|
102
176
|
}
|
103
177
|
|
104
|
-
|
105
|
-
|
106
|
-
|
178
|
+
const auto aType = a->getContextType();
|
179
|
+
const auto bType = b->getContextType();
|
180
|
+
|
181
|
+
if (aType == PredictionContextType::SINGLETON && bType == PredictionContextType::SINGLETON) {
|
182
|
+
return mergeSingletons(std::static_pointer_cast<const SingletonPredictionContext>(std::move(a)),
|
183
|
+
std::static_pointer_cast<const SingletonPredictionContext>(std::move(b)), rootIsWildcard, mergeCache);
|
107
184
|
}
|
108
185
|
|
109
186
|
// At least one of a or b is array.
|
110
187
|
// If one is $ and rootIsWildcard, return $ as * wildcard.
|
111
188
|
if (rootIsWildcard) {
|
112
|
-
if (
|
189
|
+
if (a == PredictionContext::EMPTY) {
|
113
190
|
return a;
|
114
191
|
}
|
115
|
-
if (
|
192
|
+
if (b == PredictionContext::EMPTY) {
|
116
193
|
return b;
|
117
194
|
}
|
118
195
|
}
|
119
196
|
|
120
197
|
// convert singleton so both are arrays to normalize
|
121
|
-
Ref<ArrayPredictionContext> left;
|
122
|
-
if (
|
123
|
-
left = std::make_shared<ArrayPredictionContext>(
|
198
|
+
Ref<const ArrayPredictionContext> left;
|
199
|
+
if (aType == PredictionContextType::SINGLETON) {
|
200
|
+
left = std::make_shared<ArrayPredictionContext>(downCast<const SingletonPredictionContext&>(*a));
|
124
201
|
} else {
|
125
|
-
left = std::
|
202
|
+
left = std::static_pointer_cast<const ArrayPredictionContext>(std::move(a));
|
126
203
|
}
|
127
|
-
Ref<ArrayPredictionContext> right;
|
128
|
-
if (
|
129
|
-
right = std::make_shared<ArrayPredictionContext>(
|
204
|
+
Ref<const ArrayPredictionContext> right;
|
205
|
+
if (bType == PredictionContextType::SINGLETON) {
|
206
|
+
right = std::make_shared<ArrayPredictionContext>(downCast<const SingletonPredictionContext&>(*b));
|
130
207
|
} else {
|
131
|
-
right = std::
|
208
|
+
right = std::static_pointer_cast<const ArrayPredictionContext>(std::move(b));
|
132
209
|
}
|
133
|
-
return mergeArrays(left, right, rootIsWildcard, mergeCache);
|
210
|
+
return mergeArrays(std::move(left), std::move(right), rootIsWildcard, mergeCache);
|
134
211
|
}
|
135
212
|
|
136
|
-
Ref<PredictionContext> PredictionContext::mergeSingletons(const Ref<SingletonPredictionContext>
|
137
|
-
|
213
|
+
Ref<const PredictionContext> PredictionContext::mergeSingletons(Ref<const SingletonPredictionContext> a, Ref<const SingletonPredictionContext> b,
|
214
|
+
bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
|
138
215
|
|
139
|
-
if (mergeCache
|
216
|
+
if (mergeCache) {
|
140
217
|
auto existing = mergeCache->get(a, b);
|
141
218
|
if (existing) {
|
142
219
|
return existing;
|
@@ -147,18 +224,18 @@ Ref<PredictionContext> PredictionContext::mergeSingletons(const Ref<SingletonPre
|
|
147
224
|
}
|
148
225
|
}
|
149
226
|
|
150
|
-
|
227
|
+
auto rootMerge = mergeRoot(a, b, rootIsWildcard);
|
151
228
|
if (rootMerge) {
|
152
|
-
if (mergeCache
|
153
|
-
mergeCache->put(a, b, rootMerge);
|
229
|
+
if (mergeCache) {
|
230
|
+
return mergeCache->put(a, b, std::move(rootMerge));
|
154
231
|
}
|
155
232
|
return rootMerge;
|
156
233
|
}
|
157
234
|
|
158
|
-
|
159
|
-
|
235
|
+
const auto& parentA = a->parent;
|
236
|
+
const auto& parentB = b->parent;
|
160
237
|
if (a->returnState == b->returnState) { // a == b
|
161
|
-
|
238
|
+
auto parent = merge(parentA, parentB, rootIsWildcard, mergeCache);
|
162
239
|
|
163
240
|
// If parent is same as existing a or b parent or reduced to a parent, return it.
|
164
241
|
if (parent == parentA) { // ax + bx = ax, if a=b
|
@@ -172,55 +249,55 @@ Ref<PredictionContext> PredictionContext::mergeSingletons(const Ref<SingletonPre
|
|
172
249
|
// merge parents x and y, giving array node with x,y then remainders
|
173
250
|
// of those graphs. dup a, a' points at merged array
|
174
251
|
// new joined parent so create new singleton pointing to it, a'
|
175
|
-
|
176
|
-
if (mergeCache
|
177
|
-
mergeCache->put(a, b,
|
178
|
-
}
|
179
|
-
return
|
180
|
-
}
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
252
|
+
auto c = SingletonPredictionContext::create(std::move(parent), a->returnState);
|
253
|
+
if (mergeCache) {
|
254
|
+
return mergeCache->put(a, b, std::move(c));
|
255
|
+
}
|
256
|
+
return c;
|
257
|
+
}
|
258
|
+
// a != b payloads differ
|
259
|
+
// see if we can collapse parents due to $+x parents if local ctx
|
260
|
+
Ref<const PredictionContext> singleParent;
|
261
|
+
if (a == b || (*parentA == *parentB)) { // ax + bx = [a,b]x
|
262
|
+
singleParent = parentA;
|
263
|
+
}
|
264
|
+
if (singleParent) { // parents are same, sort payloads and use same parent
|
265
|
+
std::vector<size_t> payloads = { a->returnState, b->returnState };
|
266
|
+
if (a->returnState > b->returnState) {
|
267
|
+
payloads[0] = b->returnState;
|
268
|
+
payloads[1] = a->returnState;
|
269
|
+
}
|
270
|
+
std::vector<Ref<const PredictionContext>> parents = { singleParent, singleParent };
|
271
|
+
auto c = std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
|
272
|
+
if (mergeCache) {
|
273
|
+
return mergeCache->put(a, b, std::move(c));
|
274
|
+
}
|
275
|
+
return c;
|
276
|
+
}
|
277
|
+
|
278
|
+
// parents differ and can't merge them. Just pack together
|
279
|
+
// into array; can't merge.
|
280
|
+
// ax + by = [ax,by]
|
281
|
+
if (a->returnState > b->returnState) { // sort by payload
|
282
|
+
std::vector<size_t> payloads = { b->returnState, a->returnState };
|
283
|
+
std::vector<Ref<const PredictionContext>> parents = { b->parent, a->parent };
|
284
|
+
auto c = std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
|
285
|
+
if (mergeCache) {
|
286
|
+
return mergeCache->put(a, b, std::move(c));
|
287
|
+
}
|
288
|
+
return c;
|
289
|
+
}
|
290
|
+
std::vector<size_t> payloads = {a->returnState, b->returnState};
|
291
|
+
std::vector<Ref<const PredictionContext>> parents = { a->parent, b->parent };
|
292
|
+
auto c = std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
|
293
|
+
if (mergeCache) {
|
294
|
+
return mergeCache->put(a, b, std::move(c));
|
295
|
+
}
|
296
|
+
return c;
|
220
297
|
}
|
221
298
|
|
222
|
-
Ref<PredictionContext> PredictionContext::mergeRoot(const Ref<SingletonPredictionContext>
|
223
|
-
|
299
|
+
Ref<const PredictionContext> PredictionContext::mergeRoot(Ref<const SingletonPredictionContext> a, Ref<const SingletonPredictionContext> b,
|
300
|
+
bool rootIsWildcard) {
|
224
301
|
if (rootIsWildcard) {
|
225
302
|
if (a == EMPTY) { // * + b = *
|
226
303
|
return EMPTY;
|
@@ -234,24 +311,22 @@ Ref<PredictionContext> PredictionContext::mergeRoot(const Ref<SingletonPredictio
|
|
234
311
|
}
|
235
312
|
if (a == EMPTY) { // $ + x = [$,x]
|
236
313
|
std::vector<size_t> payloads = { b->returnState, EMPTY_RETURN_STATE };
|
237
|
-
std::vector<Ref<PredictionContext>> parents = { b->parent, nullptr };
|
238
|
-
|
239
|
-
return joined;
|
314
|
+
std::vector<Ref<const PredictionContext>> parents = { b->parent, nullptr };
|
315
|
+
return std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
|
240
316
|
}
|
241
317
|
if (b == EMPTY) { // x + $ = [$,x] ($ is always first if present)
|
242
318
|
std::vector<size_t> payloads = { a->returnState, EMPTY_RETURN_STATE };
|
243
|
-
std::vector<Ref<PredictionContext>> parents = { a->parent, nullptr };
|
244
|
-
|
245
|
-
return joined;
|
319
|
+
std::vector<Ref<const PredictionContext>> parents = { a->parent, nullptr };
|
320
|
+
return std::make_shared<ArrayPredictionContext>(std::move(parents), std::move(payloads));
|
246
321
|
}
|
247
322
|
}
|
248
323
|
return nullptr;
|
249
324
|
}
|
250
325
|
|
251
|
-
Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionContext>
|
252
|
-
|
326
|
+
Ref<const PredictionContext> PredictionContext::mergeArrays(Ref<const ArrayPredictionContext> a, Ref<const ArrayPredictionContext> b,
|
327
|
+
bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
|
253
328
|
|
254
|
-
if (mergeCache
|
329
|
+
if (mergeCache) {
|
255
330
|
auto existing = mergeCache->get(a, b);
|
256
331
|
if (existing) {
|
257
332
|
return existing;
|
@@ -268,36 +343,33 @@ Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionC
|
|
268
343
|
size_t k = 0; // walks target M array
|
269
344
|
|
270
345
|
std::vector<size_t> mergedReturnStates(a->returnStates.size() + b->returnStates.size());
|
271
|
-
std::vector<Ref<PredictionContext>> mergedParents(a->returnStates.size() + b->returnStates.size());
|
346
|
+
std::vector<Ref<const PredictionContext>> mergedParents(a->returnStates.size() + b->returnStates.size());
|
272
347
|
|
273
348
|
// walk and merge to yield mergedParents, mergedReturnStates
|
274
349
|
while (i < a->returnStates.size() && j < b->returnStates.size()) {
|
275
|
-
|
276
|
-
|
350
|
+
const auto& parentA = a->parents[i];
|
351
|
+
const auto& parentB = b->parents[j];
|
277
352
|
if (a->returnStates[i] == b->returnStates[j]) {
|
278
353
|
// same payload (stack tops are equal), must yield merged singleton
|
279
354
|
size_t payload = a->returnStates[i];
|
280
355
|
// $+$ = $
|
281
|
-
bool both$ = payload == EMPTY_RETURN_STATE && !
|
282
|
-
bool ax_ax = (
|
356
|
+
bool both$ = payload == EMPTY_RETURN_STATE && !parentA && !parentB;
|
357
|
+
bool ax_ax = (parentA && parentB) && *parentA == *parentB; // ax+ax -> ax
|
283
358
|
if (both$ || ax_ax) {
|
284
|
-
mergedParents[k] =
|
359
|
+
mergedParents[k] = parentA; // choose left
|
285
360
|
mergedReturnStates[k] = payload;
|
286
|
-
}
|
287
|
-
|
288
|
-
Ref<PredictionContext> mergedParent = merge(a_parent, b_parent, rootIsWildcard, mergeCache);
|
289
|
-
mergedParents[k] = mergedParent;
|
361
|
+
} else { // ax+ay -> a'[x,y]
|
362
|
+
mergedParents[k] = merge(parentA, parentB, rootIsWildcard, mergeCache);
|
290
363
|
mergedReturnStates[k] = payload;
|
291
364
|
}
|
292
365
|
i++; // hop over left one as usual
|
293
366
|
j++; // but also skip one in right side since we merge
|
294
367
|
} else if (a->returnStates[i] < b->returnStates[j]) { // copy a[i] to M
|
295
|
-
mergedParents[k] =
|
368
|
+
mergedParents[k] = parentA;
|
296
369
|
mergedReturnStates[k] = a->returnStates[i];
|
297
370
|
i++;
|
298
|
-
}
|
299
|
-
|
300
|
-
mergedParents[k] = b_parent;
|
371
|
+
} else { // b > a, copy b[j] to M
|
372
|
+
mergedParents[k] = parentB;
|
301
373
|
mergedReturnStates[k] = b->returnStates[j];
|
302
374
|
j++;
|
303
375
|
}
|
@@ -306,13 +378,13 @@ Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionC
|
|
306
378
|
|
307
379
|
// copy over any payloads remaining in either array
|
308
380
|
if (i < a->returnStates.size()) {
|
309
|
-
for (
|
381
|
+
for (auto p = i; p < a->returnStates.size(); p++) {
|
310
382
|
mergedParents[k] = a->parents[p];
|
311
383
|
mergedReturnStates[k] = a->returnStates[p];
|
312
384
|
k++;
|
313
385
|
}
|
314
386
|
} else {
|
315
|
-
for (
|
387
|
+
for (auto p = j; p < b->returnStates.size(); p++) {
|
316
388
|
mergedParents[k] = b->parents[p];
|
317
389
|
mergedReturnStates[k] = b->returnStates[p];
|
318
390
|
k++;
|
@@ -322,63 +394,42 @@ Ref<PredictionContext> PredictionContext::mergeArrays(const Ref<ArrayPredictionC
|
|
322
394
|
// trim merged if we combined a few that had same stack tops
|
323
395
|
if (k < mergedParents.size()) { // write index < last position; trim
|
324
396
|
if (k == 1) { // for just one merged element, return singleton top
|
325
|
-
|
326
|
-
if (mergeCache
|
327
|
-
mergeCache->put(a, b,
|
397
|
+
auto c = SingletonPredictionContext::create(std::move(mergedParents[0]), mergedReturnStates[0]);
|
398
|
+
if (mergeCache) {
|
399
|
+
return mergeCache->put(a, b, std::move(c));
|
328
400
|
}
|
329
|
-
return
|
401
|
+
return c;
|
330
402
|
}
|
331
403
|
mergedParents.resize(k);
|
332
404
|
mergedReturnStates.resize(k);
|
333
405
|
}
|
334
406
|
|
335
|
-
|
407
|
+
ArrayPredictionContext m(std::move(mergedParents), std::move(mergedReturnStates));
|
336
408
|
|
337
409
|
// if we created same array as a or b, return that instead
|
338
410
|
// TODO: track whether this is possible above during merge sort for speed
|
339
|
-
if (
|
340
|
-
if (mergeCache
|
341
|
-
mergeCache->put(a, b, a);
|
411
|
+
if (m == *a) {
|
412
|
+
if (mergeCache) {
|
413
|
+
return mergeCache->put(a, b, a);
|
342
414
|
}
|
343
415
|
return a;
|
344
416
|
}
|
345
|
-
if (
|
346
|
-
if (mergeCache
|
347
|
-
mergeCache->put(a, b, b);
|
417
|
+
if (m == *b) {
|
418
|
+
if (mergeCache) {
|
419
|
+
return mergeCache->put(a, b, b);
|
348
420
|
}
|
349
421
|
return b;
|
350
422
|
}
|
351
423
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
}
|
357
|
-
|
358
|
-
if (mergeCache != nullptr) {
|
359
|
-
mergeCache->put(a, b, M);
|
360
|
-
}
|
361
|
-
return M;
|
362
|
-
}
|
363
|
-
|
364
|
-
bool PredictionContext::combineCommonParents(std::vector<Ref<PredictionContext>> &parents) {
|
365
|
-
|
366
|
-
std::set<Ref<PredictionContext>> uniqueParents;
|
367
|
-
for (size_t p = 0; p < parents.size(); ++p) {
|
368
|
-
Ref<PredictionContext> parent = parents[p];
|
369
|
-
if (uniqueParents.find(parent) == uniqueParents.end()) { // don't replace
|
370
|
-
uniqueParents.insert(parent);
|
371
|
-
}
|
372
|
-
}
|
373
|
-
|
374
|
-
for (size_t p = 0; p < parents.size(); ++p) {
|
375
|
-
parents[p] = *uniqueParents.find(parents[p]);
|
424
|
+
combineCommonParents(m.parents);
|
425
|
+
auto c = std::make_shared<ArrayPredictionContext>(std::move(m));
|
426
|
+
if (mergeCache) {
|
427
|
+
return mergeCache->put(a, b, std::move(c));
|
376
428
|
}
|
377
|
-
|
378
|
-
return true;
|
429
|
+
return c;
|
379
430
|
}
|
380
431
|
|
381
|
-
std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context) {
|
432
|
+
std::string PredictionContext::toDOTString(const Ref<const PredictionContext> &context) {
|
382
433
|
if (context == nullptr) {
|
383
434
|
return "";
|
384
435
|
}
|
@@ -386,24 +437,23 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
|
|
386
437
|
std::stringstream ss;
|
387
438
|
ss << "digraph G {\n" << "rankdir=LR;\n";
|
388
439
|
|
389
|
-
std::vector<Ref<PredictionContext>> nodes = getAllContextNodes(context);
|
390
|
-
std::
|
391
|
-
|
392
|
-
});
|
440
|
+
std::vector<Ref<const PredictionContext>> nodes = getAllContextNodes(context);
|
441
|
+
std::unordered_map<const PredictionContext*, size_t> nodeIds;
|
442
|
+
size_t nodeId = 0;
|
393
443
|
|
394
|
-
for (auto current : nodes) {
|
395
|
-
if (
|
396
|
-
std::string s = std::to_string(current
|
444
|
+
for (const auto ¤t : nodes) {
|
445
|
+
if (current->getContextType() == PredictionContextType::SINGLETON) {
|
446
|
+
std::string s = std::to_string(insertOrAssignNodeId(nodeIds, nodeId, current.get()));
|
397
447
|
ss << " s" << s;
|
398
448
|
std::string returnState = std::to_string(current->getReturnState(0));
|
399
|
-
if (
|
449
|
+
if (current == PredictionContext::EMPTY) {
|
400
450
|
returnState = "$";
|
401
451
|
}
|
402
452
|
ss << " [label=\"" << returnState << "\"];\n";
|
403
453
|
continue;
|
404
454
|
}
|
405
|
-
Ref<ArrayPredictionContext> arr = std::static_pointer_cast<ArrayPredictionContext>(current);
|
406
|
-
ss << " s" << arr
|
455
|
+
Ref<const ArrayPredictionContext> arr = std::static_pointer_cast<const ArrayPredictionContext>(current);
|
456
|
+
ss << " s" << insertOrAssignNodeId(nodeIds, nodeId, arr.get()) << " [shape=box, label=\"" << "[";
|
407
457
|
bool first = true;
|
408
458
|
for (auto inv : arr->returnStates) {
|
409
459
|
if (!first) {
|
@@ -420,7 +470,7 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
|
|
420
470
|
ss << "\"];\n";
|
421
471
|
}
|
422
472
|
|
423
|
-
for (auto current : nodes) {
|
473
|
+
for (const auto ¤t : nodes) {
|
424
474
|
if (current == EMPTY) {
|
425
475
|
continue;
|
426
476
|
}
|
@@ -428,7 +478,7 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
|
|
428
478
|
if (!current->getParent(i)) {
|
429
479
|
continue;
|
430
480
|
}
|
431
|
-
ss << " s" << current
|
481
|
+
ss << " s" << insertOrAssignNodeId(nodeIds, nodeId, current.get()) << "->" << "s" << insertOrAssignNodeId(nodeIds, nodeId, current->getParent(i).get());
|
432
482
|
if (current->size() > 1) {
|
433
483
|
ss << " [label=\"parent[" << i << "]\"];\n";
|
434
484
|
} else {
|
@@ -442,112 +492,31 @@ std::string PredictionContext::toDOTString(const Ref<PredictionContext> &context
|
|
442
492
|
}
|
443
493
|
|
444
494
|
// The "visited" map is just a temporary structure to control the retrieval process (which is recursive).
|
445
|
-
Ref<PredictionContext> PredictionContext::getCachedContext(const Ref<PredictionContext> &context,
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
}
|
450
|
-
|
451
|
-
{
|
452
|
-
auto iterator = visited.find(context);
|
453
|
-
if (iterator != visited.end())
|
454
|
-
return iterator->second; // Not necessarly the same as context.
|
455
|
-
}
|
456
|
-
|
457
|
-
auto iterator = contextCache.find(context);
|
458
|
-
if (iterator != contextCache.end()) {
|
459
|
-
visited[context] = *iterator;
|
460
|
-
|
461
|
-
return *iterator;
|
462
|
-
}
|
463
|
-
|
464
|
-
bool changed = false;
|
465
|
-
|
466
|
-
std::vector<Ref<PredictionContext>> parents(context->size());
|
467
|
-
for (size_t i = 0; i < parents.size(); i++) {
|
468
|
-
Ref<PredictionContext> parent = getCachedContext(context->getParent(i), contextCache, visited);
|
469
|
-
if (changed || parent != context->getParent(i)) {
|
470
|
-
if (!changed) {
|
471
|
-
parents.clear();
|
472
|
-
for (size_t j = 0; j < context->size(); j++) {
|
473
|
-
parents.push_back(context->getParent(j));
|
474
|
-
}
|
475
|
-
|
476
|
-
changed = true;
|
477
|
-
}
|
478
|
-
|
479
|
-
parents[i] = parent;
|
480
|
-
}
|
481
|
-
}
|
482
|
-
|
483
|
-
if (!changed) {
|
484
|
-
contextCache.insert(context);
|
485
|
-
visited[context] = context;
|
486
|
-
|
487
|
-
return context;
|
488
|
-
}
|
489
|
-
|
490
|
-
Ref<PredictionContext> updated;
|
491
|
-
if (parents.empty()) {
|
492
|
-
updated = EMPTY;
|
493
|
-
} else if (parents.size() == 1) {
|
494
|
-
updated = SingletonPredictionContext::create(parents[0], context->getReturnState(0));
|
495
|
-
contextCache.insert(updated);
|
496
|
-
} else {
|
497
|
-
updated = std::make_shared<ArrayPredictionContext>(parents, std::dynamic_pointer_cast<ArrayPredictionContext>(context)->returnStates);
|
498
|
-
contextCache.insert(updated);
|
499
|
-
}
|
500
|
-
|
501
|
-
visited[updated] = updated;
|
502
|
-
visited[context] = updated;
|
503
|
-
|
504
|
-
return updated;
|
495
|
+
Ref<const PredictionContext> PredictionContext::getCachedContext(const Ref<const PredictionContext> &context,
|
496
|
+
PredictionContextCache &contextCache) {
|
497
|
+
std::unordered_map<Ref<const PredictionContext>, Ref<const PredictionContext>> visited;
|
498
|
+
return getCachedContextImpl(context, contextCache, visited);
|
505
499
|
}
|
506
500
|
|
507
|
-
std::vector<Ref<PredictionContext>> PredictionContext::getAllContextNodes(const Ref<PredictionContext> &context) {
|
508
|
-
std::vector<Ref<PredictionContext>> nodes;
|
509
|
-
std::
|
510
|
-
|
501
|
+
std::vector<Ref<const PredictionContext>> PredictionContext::getAllContextNodes(const Ref<const PredictionContext> &context) {
|
502
|
+
std::vector<Ref<const PredictionContext>> nodes;
|
503
|
+
std::unordered_set<const PredictionContext*> visited;
|
504
|
+
getAllContextNodesImpl(context, nodes, visited);
|
511
505
|
return nodes;
|
512
506
|
}
|
513
507
|
|
514
|
-
|
515
|
-
void PredictionContext::getAllContextNodes_(const Ref<PredictionContext> &context, std::vector<Ref<PredictionContext>> &nodes,
|
516
|
-
std::set<PredictionContext *> &visited) {
|
517
|
-
|
518
|
-
if (visited.find(context.get()) != visited.end()) {
|
519
|
-
return; // Already done.
|
520
|
-
}
|
521
|
-
|
522
|
-
visited.insert(context.get());
|
523
|
-
nodes.push_back(context);
|
524
|
-
|
525
|
-
for (size_t i = 0; i < context->size(); i++) {
|
526
|
-
getAllContextNodes_(context->getParent(i), nodes, visited);
|
527
|
-
}
|
528
|
-
}
|
529
|
-
|
530
|
-
std::string PredictionContext::toString() const {
|
531
|
-
|
532
|
-
return antlrcpp::toString(this);
|
533
|
-
}
|
534
|
-
|
535
|
-
std::string PredictionContext::toString(Recognizer * /*recog*/) const {
|
536
|
-
return toString();
|
537
|
-
}
|
538
|
-
|
539
|
-
std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, int currentState) {
|
508
|
+
std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, int currentState) const {
|
540
509
|
return toStrings(recognizer, EMPTY, currentState);
|
541
510
|
}
|
542
511
|
|
543
|
-
std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, const Ref<PredictionContext> &stop, int currentState) {
|
512
|
+
std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, const Ref<const PredictionContext> &stop, int currentState) const {
|
544
513
|
|
545
514
|
std::vector<std::string> result;
|
546
515
|
|
547
516
|
for (size_t perm = 0; ; perm++) {
|
548
517
|
size_t offset = 0;
|
549
518
|
bool last = true;
|
550
|
-
PredictionContext *p = this;
|
519
|
+
const PredictionContext *p = this;
|
551
520
|
size_t stateNumber = currentState;
|
552
521
|
|
553
522
|
std::stringstream ss;
|
@@ -608,55 +577,3 @@ std::vector<std::string> PredictionContext::toStrings(Recognizer *recognizer, co
|
|
608
577
|
|
609
578
|
return result;
|
610
579
|
}
|
611
|
-
|
612
|
-
//----------------- PredictionContextMergeCache ------------------------------------------------------------------------
|
613
|
-
|
614
|
-
Ref<PredictionContext> PredictionContextMergeCache::put(Ref<PredictionContext> const& key1, Ref<PredictionContext> const& key2,
|
615
|
-
Ref<PredictionContext> const& value) {
|
616
|
-
Ref<PredictionContext> previous;
|
617
|
-
|
618
|
-
auto iterator = _data.find(key1);
|
619
|
-
if (iterator == _data.end())
|
620
|
-
_data[key1][key2] = value;
|
621
|
-
else {
|
622
|
-
auto iterator2 = iterator->second.find(key2);
|
623
|
-
if (iterator2 != iterator->second.end())
|
624
|
-
previous = iterator2->second;
|
625
|
-
iterator->second[key2] = value;
|
626
|
-
}
|
627
|
-
|
628
|
-
return previous;
|
629
|
-
}
|
630
|
-
|
631
|
-
Ref<PredictionContext> PredictionContextMergeCache::get(Ref<PredictionContext> const& key1, Ref<PredictionContext> const& key2) {
|
632
|
-
auto iterator = _data.find(key1);
|
633
|
-
if (iterator == _data.end())
|
634
|
-
return nullptr;
|
635
|
-
|
636
|
-
auto iterator2 = iterator->second.find(key2);
|
637
|
-
if (iterator2 == iterator->second.end())
|
638
|
-
return nullptr;
|
639
|
-
|
640
|
-
return iterator2->second;
|
641
|
-
}
|
642
|
-
|
643
|
-
void PredictionContextMergeCache::clear() {
|
644
|
-
_data.clear();
|
645
|
-
}
|
646
|
-
|
647
|
-
std::string PredictionContextMergeCache::toString() const {
|
648
|
-
std::string result;
|
649
|
-
for (auto pair : _data)
|
650
|
-
for (auto pair2 : pair.second)
|
651
|
-
result += pair2.second->toString() + "\n";
|
652
|
-
|
653
|
-
return result;
|
654
|
-
}
|
655
|
-
|
656
|
-
size_t PredictionContextMergeCache::count() const {
|
657
|
-
size_t result = 0;
|
658
|
-
for (auto entry : _data)
|
659
|
-
result += entry.second.size();
|
660
|
-
return result;
|
661
|
-
}
|
662
|
-
|