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.
Files changed (328) hide show
  1. checksums.yaml +4 -4
  2. data/.cross_rubies +0 -6
  3. data/.github/workflows/rake.yml +223 -31
  4. data/.gitignore +7 -1
  5. data/.gitmodules +3 -0
  6. data/.rubocop.yml +13 -4
  7. data/README.adoc +8 -0
  8. data/Rakefile +4 -1
  9. data/bin/console +0 -1
  10. data/bin/rspec +3 -3
  11. data/exe/expressir +4 -2
  12. data/exe/format +1 -1
  13. data/exe/format-test +25 -25
  14. data/exe/generate-parser +16 -13
  15. data/expressir.gemspec +11 -9
  16. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/CMakeLists.txt +44 -9
  17. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj +11 -5
  18. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj.filters +0 -3
  19. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj +11 -4
  20. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj.filters +0 -3
  21. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj +11 -4
  22. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj.filters +0 -3
  23. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj +19 -4
  24. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj.filters +0 -3
  25. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/project.pbxproj +51 -35
  26. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/xcshareddata/xcschemes/antlr4.xcscheme +1 -1
  27. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/xcshareddata/xcschemes/antlr4_ios.xcscheme +1 -5
  28. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/xcshareddata/xcschemes/antlr4_static.xcscheme +1 -5
  29. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRFileStream.cpp +1 -12
  30. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRFileStream.h +9 -6
  31. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.cpp +43 -18
  32. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.h +16 -6
  33. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonToken.cpp +2 -4
  34. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonTokenFactory.cpp +1 -1
  35. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonTokenFactory.h +1 -1
  36. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/DefaultErrorStrategy.cpp +16 -13
  37. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.cpp +2 -2
  38. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.h +2 -2
  39. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.cpp +5 -4
  40. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.h +1 -1
  41. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/IntStream.h +1 -1
  42. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.cpp +2 -3
  43. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.h +9 -9
  44. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.cpp +0 -15
  45. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.h +1 -7
  46. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ListTokenSource.cpp +2 -2
  47. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ListTokenSource.h +2 -2
  48. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.cpp +51 -31
  49. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.h +1 -7
  50. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.cpp +27 -39
  51. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.h +1 -7
  52. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.cpp +20 -23
  53. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.h +21 -21
  54. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ProxyErrorListener.cpp +4 -4
  55. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RecognitionException.cpp +0 -1
  56. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.cpp +16 -27
  57. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.h +12 -17
  58. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.cpp +4 -3
  59. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.h +5 -1
  60. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuntimeMetaData.cpp +2 -1
  61. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Token.h +7 -7
  62. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenSource.h +1 -1
  63. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.cpp +6 -6
  64. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.h +4 -2
  65. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.cpp +15 -18
  66. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.h +12 -18
  67. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Version.h +42 -0
  68. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.cpp +13 -53
  69. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.h +11 -27
  70. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-common.h +19 -58
  71. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-runtime.h +7 -5
  72. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.cpp +6 -57
  73. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.h +35 -15
  74. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.cpp +29 -36
  75. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.h +36 -27
  76. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.cpp +58 -54
  77. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.h +77 -31
  78. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.cpp +22 -32
  79. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.h +22 -24
  80. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp +335 -464
  81. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.h +9 -62
  82. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.cpp +9 -39
  83. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.h +6 -22
  84. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.cpp +10 -26
  85. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.h +42 -36
  86. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.cpp +33 -0
  87. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.h +36 -0
  88. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.cpp +2 -6
  89. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.h +4 -2
  90. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.cpp +49 -22
  91. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.h +20 -12
  92. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.cpp +1 -5
  93. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.h +5 -2
  94. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.h +4 -2
  95. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.h +4 -2
  96. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.h +5 -3
  97. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.h +10 -1
  98. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionInfo.h +1 -1
  99. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.cpp +0 -5
  100. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.h +12 -8
  101. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.cpp +2 -6
  102. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.h +6 -3
  103. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.cpp +139 -108
  104. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.h +10 -43
  105. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.cpp +16 -33
  106. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.h +12 -12
  107. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.cpp +69 -82
  108. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.h +17 -28
  109. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.cpp +12 -6
  110. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.h +45 -11
  111. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.cpp +48 -44
  112. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.h +31 -18
  113. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionType.h +3 -1
  114. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.cpp +14 -26
  115. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.h +12 -16
  116. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.cpp +15 -32
  117. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.h +12 -24
  118. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.cpp +23 -29
  119. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.h +13 -19
  120. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.cpp +13 -26
  121. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.h +12 -16
  122. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.cpp +6 -17
  123. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.h +12 -16
  124. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.cpp +6 -17
  125. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.h +12 -16
  126. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.cpp +13 -26
  127. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.h +12 -16
  128. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.cpp +6 -17
  129. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.h +11 -15
  130. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.cpp +13 -26
  131. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.h +13 -17
  132. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.h +5 -1
  133. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.cpp +1 -6
  134. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.h +4 -2
  135. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.cpp +6 -2
  136. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.h +8 -3
  137. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp +169 -152
  138. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.h +26 -19
  139. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulatorOptions.h +50 -0
  140. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.h +5 -1
  141. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.h +5 -2
  142. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.cpp +2 -11
  143. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.h +15 -9
  144. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.cpp +2 -2
  145. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.h +2 -2
  146. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.cpp +4 -14
  147. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.h +22 -11
  148. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.cpp +255 -338
  149. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.h +87 -116
  150. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.cpp +56 -0
  151. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.h +64 -0
  152. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.cpp +167 -0
  153. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.h +101 -0
  154. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCacheOptions.h +71 -0
  155. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextType.h +21 -0
  156. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.cpp +18 -17
  157. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.h +1 -1
  158. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.cpp +2 -2
  159. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.h +2 -2
  160. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.cpp +1 -5
  161. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.h +4 -2
  162. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.h +4 -3
  163. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.h +4 -2
  164. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.cpp +1 -5
  165. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.h +5 -3
  166. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.cpp +197 -156
  167. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.h +92 -81
  168. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContextType.h +23 -0
  169. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SerializedATNView.h +101 -0
  170. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.cpp +2 -6
  171. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.h +11 -3
  172. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.cpp +39 -34
  173. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.h +17 -10
  174. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.h +5 -2
  175. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.h +4 -2
  176. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.cpp +6 -6
  177. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.h +6 -2
  178. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.h +5 -2
  179. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.cpp +1 -9
  180. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.h +11 -22
  181. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.cpp +27 -0
  182. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.h +33 -0
  183. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.cpp +1 -5
  184. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.h +4 -2
  185. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.cpp +11 -23
  186. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.h +20 -15
  187. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.cpp +2 -9
  188. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.h +4 -4
  189. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.cpp +9 -50
  190. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.h +57 -48
  191. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.cpp +1 -4
  192. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.h +3 -4
  193. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.cpp +2 -2
  194. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.h +3 -1
  195. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.cpp +1 -29
  196. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.h +10 -10
  197. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.cpp +15 -28
  198. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.h +1 -9
  199. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.cpp +54 -68
  200. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.h +35 -9
  201. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.cpp +0 -5
  202. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.h +1 -155
  203. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Arrays.cpp +2 -2
  204. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Arrays.h +39 -0
  205. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/BitSet.h +1 -1
  206. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.cpp +13 -54
  207. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.h +16 -29
  208. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Casts.h +34 -0
  209. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Declarations.h +0 -2
  210. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.cpp +25 -23
  211. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.h +2 -40
  212. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Unicode.h +28 -0
  213. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.cpp +242 -0
  214. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.h +54 -0
  215. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/AbstractParseTreeVisitor.h +13 -12
  216. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.h +7 -2
  217. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.cpp +36 -5
  218. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.h +14 -4
  219. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/IterativeParseTreeWalker.cpp +14 -19
  220. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.cpp +0 -3
  221. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.h +14 -5
  222. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeType.h +22 -0
  223. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeVisitor.h +4 -4
  224. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.cpp +8 -9
  225. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.h +30 -6
  226. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.h +10 -2
  227. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.cpp +2 -5
  228. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.h +4 -5
  229. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/Trees.cpp +1 -1
  230. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/pattern/ParseTreePattern.cpp +1 -1
  231. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/pattern/ParseTreePatternMatcher.cpp +1 -2
  232. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPath.cpp +1 -1
  233. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.cpp +128 -119
  234. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.h +18 -27
  235. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathRuleElement.cpp +1 -1
  236. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathTokenElement.cpp +1 -1
  237. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/tests/Utf8Test.cpp +110 -0
  238. data/ext/express-parser/antlrgen/Express.interp +1 -1
  239. data/ext/express-parser/antlrgen/ExpressBaseListener.cpp +1 -1
  240. data/ext/express-parser/antlrgen/ExpressBaseListener.h +1 -1
  241. data/ext/express-parser/antlrgen/ExpressBaseVisitor.cpp +1 -1
  242. data/ext/express-parser/antlrgen/ExpressBaseVisitor.h +200 -200
  243. data/ext/express-parser/antlrgen/ExpressLexer.cpp +645 -1129
  244. data/ext/express-parser/antlrgen/ExpressLexer.h +20 -27
  245. data/ext/express-parser/antlrgen/ExpressLexer.interp +1 -1
  246. data/ext/express-parser/antlrgen/ExpressListener.cpp +1 -1
  247. data/ext/express-parser/antlrgen/ExpressListener.h +1 -1
  248. data/ext/express-parser/antlrgen/ExpressParser.cpp +1754 -1447
  249. data/ext/express-parser/antlrgen/ExpressParser.h +219 -223
  250. data/ext/express-parser/antlrgen/ExpressVisitor.cpp +1 -1
  251. data/ext/express-parser/antlrgen/ExpressVisitor.h +200 -200
  252. data/ext/express-parser/express_parser.cpp +165 -101
  253. data/ext/express-parser/extconf.rb +14 -14
  254. data/lib/expressir/config.rb +1 -1
  255. data/lib/expressir/express/parser.rb +17 -15
  256. data/lib/expressir/express/visitor.rb +7 -3
  257. data/lib/expressir/model.rb +78 -78
  258. data/lib/expressir/version.rb +1 -1
  259. data/rakelib/antlr4-native.rake +161 -0
  260. data/rakelib/cross-ruby.rake +213 -162
  261. data/spec/acceptance/version_spec.rb +17 -2
  262. data/spec/expressir/express/cache_spec.rb +23 -5
  263. data/spec/expressir/express/formatter_spec.rb +54 -8
  264. data/spec/expressir/express/parser_spec.rb +47 -11
  265. data/spec/expressir/model/model_element_spec.rb +198 -146
  266. data/spec/spec_helper.rb +7 -0
  267. metadata +79 -91
  268. data/demo.rb +0 -18
  269. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.cpp +0 -621
  270. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.h +0 -61
  271. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.cpp +0 -14
  272. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.h +0 -24
  273. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.cpp +0 -12
  274. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.cpp +0 -12
  275. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.cpp +0 -15
  276. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.cpp +0 -9
  277. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.cpp +0 -35
  278. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.h +0 -27
  279. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.cpp +0 -12
  280. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Makefile +0 -67
  281. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.cpp +0 -12
  282. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.cpp +0 -12
  283. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.cpp +0 -16
  284. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.cpp +0 -12
  285. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.cpp +0 -12
  286. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.cpp +0 -15
  287. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.cpp +0 -12
  288. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.cpp +0 -303
  289. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.h +0 -112
  290. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.cpp +0 -9
  291. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.cpp +0 -9
  292. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +0 -9589
  293. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +0 -36619
  294. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +0 -13294
  295. data/original/examples/employment/eclipse/.project +0 -17
  296. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  297. data/original/examples/employment/eclipse/Express/employment_schema.exp +0 -33
  298. data/original/examples/employment/eclipse/Express/employment_schema.xmi +0 -77
  299. data/original/examples/employment/eclipse/Express/employment_schema.xml +0 -93
  300. data/original/examples/employment/eclipse/Models/Employment.uml +0 -4
  301. data/original/examples/employment/eclipse/Models/Employment.umldi +0 -240
  302. data/original/examples/employment/eclipse/readme.txt +0 -7
  303. data/original/examples/employment/employment_schema.exp +0 -33
  304. data/original/examples/employment/employment_schema.rb +0 -232
  305. data/original/examples/employment/employment_schema.xml +0 -93
  306. data/original/examples/employment/employment_schema___module.rb +0 -46
  307. data/original/examples/employment/employment_schema___p28attr.rb +0 -126
  308. data/original/examples/employment/employment_schema___p28inst.rb +0 -26
  309. data/original/examples/employment/example_employment_data.xml +0 -1
  310. data/original/examples/employment/example_employment_data_copy.xml +0 -1
  311. data/original/examples/employment/example_employment_reader.rb +0 -30
  312. data/original/examples/employment/example_employment_writer.rb +0 -51
  313. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +0 -3710
  314. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +0 -35880
  315. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +0 -15357
  316. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +0 -9468
  317. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +0 -8404
  318. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +0 -43147
  319. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +0 -18341
  320. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +0 -11632
  321. data/original/exp2ruby.rb +0 -525
  322. data/original/expsm.rb +0 -34
  323. data/original/mapping_owl.rb +0 -1018
  324. data/original/mapping_sysml.rb +0 -2281
  325. data/original/mapping_uml2.rb +0 -599
  326. data/original/mapping_uml2_eclipse.rb +0 -433
  327. data/original/reeper.rb +0 -134
  328. 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/EmptyPredictionContext.h"
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
- size_t PredictionContext::globalNodeCount = 0;
24
- const Ref<PredictionContext> PredictionContext::EMPTY = std::make_shared<EmptyPredictionContext>();
25
+ namespace {
25
26
 
26
- //----------------- PredictionContext ----------------------------------------------------------------------------------
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::PredictionContext(size_t cachedHashCode) : id(globalNodeCount++), cachedHashCode(cachedHashCode) {
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::fromRuleContext(const ATN &atn, RuleContext *outerContext) {
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
- Ref<PredictionContext> parent = PredictionContext::fromRuleContext(atn, dynamic_cast<RuleContext *>(outerContext->parent));
47
-
48
- ATNState *state = atn.states.at(outerContext->invokingState);
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
- return cachedHashCode;
64
- }
65
-
66
- size_t PredictionContext::calculateEmptyHashCode() {
67
- size_t hash = MurmurHash::initialize(INITIAL_HASH);
68
- hash = MurmurHash::finish(hash, 0);
69
- return hash;
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> &a,
96
- const Ref<PredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
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
- if (is<SingletonPredictionContext>(a) && is<SingletonPredictionContext>(b)) {
105
- return mergeSingletons(std::dynamic_pointer_cast<SingletonPredictionContext>(a),
106
- std::dynamic_pointer_cast<SingletonPredictionContext>(b), rootIsWildcard, mergeCache);
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 (is<EmptyPredictionContext>(a)) {
189
+ if (a == PredictionContext::EMPTY) {
113
190
  return a;
114
191
  }
115
- if (is<EmptyPredictionContext>(b)) {
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 (is<SingletonPredictionContext>(a)) {
123
- left = std::make_shared<ArrayPredictionContext>(std::dynamic_pointer_cast<SingletonPredictionContext>(a));
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::dynamic_pointer_cast<ArrayPredictionContext>(a);
202
+ left = std::static_pointer_cast<const ArrayPredictionContext>(std::move(a));
126
203
  }
127
- Ref<ArrayPredictionContext> right;
128
- if (is<SingletonPredictionContext>(b)) {
129
- right = std::make_shared<ArrayPredictionContext>(std::dynamic_pointer_cast<SingletonPredictionContext>(b));
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::dynamic_pointer_cast<ArrayPredictionContext>(b);
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> &a,
137
- const Ref<SingletonPredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
213
+ Ref<const PredictionContext> PredictionContext::mergeSingletons(Ref<const SingletonPredictionContext> a, Ref<const SingletonPredictionContext> b,
214
+ bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
138
215
 
139
- if (mergeCache != nullptr) { // Can be null if not given to the ATNState from which this call originates.
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
- Ref<PredictionContext> rootMerge = mergeRoot(a, b, rootIsWildcard);
227
+ auto rootMerge = mergeRoot(a, b, rootIsWildcard);
151
228
  if (rootMerge) {
152
- if (mergeCache != nullptr) {
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
- Ref<PredictionContext> parentA = a->parent;
159
- Ref<PredictionContext> parentB = b->parent;
235
+ const auto& parentA = a->parent;
236
+ const auto& parentB = b->parent;
160
237
  if (a->returnState == b->returnState) { // a == b
161
- Ref<PredictionContext> parent = merge(parentA, parentB, rootIsWildcard, mergeCache);
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
- Ref<PredictionContext> a_ = SingletonPredictionContext::create(parent, a->returnState);
176
- if (mergeCache != nullptr) {
177
- mergeCache->put(a, b, a_);
178
- }
179
- return a_;
180
- } else {
181
- // a != b payloads differ
182
- // see if we can collapse parents due to $+x parents if local ctx
183
- Ref<PredictionContext> singleParent;
184
- if (a == b || (*parentA == *parentB)) { // ax + bx = [a,b]x
185
- singleParent = parentA;
186
- }
187
- if (singleParent) { // parents are same, sort payloads and use same parent
188
- std::vector<size_t> payloads = { a->returnState, b->returnState };
189
- if (a->returnState > b->returnState) {
190
- payloads[0] = b->returnState;
191
- payloads[1] = a->returnState;
192
- }
193
- std::vector<Ref<PredictionContext>> parents = { singleParent, singleParent };
194
- Ref<PredictionContext> a_ = std::make_shared<ArrayPredictionContext>(parents, payloads);
195
- if (mergeCache != nullptr) {
196
- mergeCache->put(a, b, a_);
197
- }
198
- return a_;
199
- }
200
-
201
- // parents differ and can't merge them. Just pack together
202
- // into array; can't merge.
203
- // ax + by = [ax,by]
204
- Ref<PredictionContext> a_;
205
- if (a->returnState > b->returnState) { // sort by payload
206
- std::vector<size_t> payloads = { b->returnState, a->returnState };
207
- std::vector<Ref<PredictionContext>> parents = { b->parent, a->parent };
208
- a_ = std::make_shared<ArrayPredictionContext>(parents, payloads);
209
- } else {
210
- std::vector<size_t> payloads = {a->returnState, b->returnState};
211
- std::vector<Ref<PredictionContext>> parents = { a->parent, b->parent };
212
- a_ = std::make_shared<ArrayPredictionContext>(parents, payloads);
213
- }
214
-
215
- if (mergeCache != nullptr) {
216
- mergeCache->put(a, b, a_);
217
- }
218
- return a_;
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> &a,
223
- const Ref<SingletonPredictionContext> &b, bool rootIsWildcard) {
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
- Ref<PredictionContext> joined = std::make_shared<ArrayPredictionContext>(parents, payloads);
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
- Ref<PredictionContext> joined = std::make_shared<ArrayPredictionContext>(parents, payloads);
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> &a,
252
- const Ref<ArrayPredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
326
+ Ref<const PredictionContext> PredictionContext::mergeArrays(Ref<const ArrayPredictionContext> a, Ref<const ArrayPredictionContext> b,
327
+ bool rootIsWildcard, PredictionContextMergeCache *mergeCache) {
253
328
 
254
- if (mergeCache != nullptr) {
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
- Ref<PredictionContext> a_parent = a->parents[i];
276
- Ref<PredictionContext> b_parent = b->parents[j];
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 && !a_parent && !b_parent;
282
- bool ax_ax = (a_parent && b_parent) && *a_parent == *b_parent; // ax+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] = a_parent; // choose left
359
+ mergedParents[k] = parentA; // choose left
285
360
  mergedReturnStates[k] = payload;
286
- }
287
- else { // ax+ay -> a'[x,y]
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] = a_parent;
368
+ mergedParents[k] = parentA;
296
369
  mergedReturnStates[k] = a->returnStates[i];
297
370
  i++;
298
- }
299
- else { // b > a, copy b[j] to M
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 (std::vector<int>::size_type p = i; p < a->returnStates.size(); p++) {
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 (std::vector<int>::size_type p = j; p < b->returnStates.size(); p++) {
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
- Ref<PredictionContext> a_ = SingletonPredictionContext::create(mergedParents[0], mergedReturnStates[0]);
326
- if (mergeCache != nullptr) {
327
- mergeCache->put(a, b, a_);
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 a_;
401
+ return c;
330
402
  }
331
403
  mergedParents.resize(k);
332
404
  mergedReturnStates.resize(k);
333
405
  }
334
406
 
335
- Ref<ArrayPredictionContext> M = std::make_shared<ArrayPredictionContext>(mergedParents, mergedReturnStates);
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 (*M == *a) {
340
- if (mergeCache != nullptr) {
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 (*M == *b) {
346
- if (mergeCache != nullptr) {
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
- // ml: this part differs from Java code. We have to recreate the context as the parents array is copied on creation.
353
- if (combineCommonParents(mergedParents)) {
354
- mergedReturnStates.resize(mergedParents.size());
355
- M = std::make_shared<ArrayPredictionContext>(mergedParents, mergedReturnStates);
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::sort(nodes.begin(), nodes.end(), [](const Ref<PredictionContext> &o1, const Ref<PredictionContext> &o2) {
391
- return o1->id - o2->id;
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 (is<SingletonPredictionContext>(current)) {
396
- std::string s = std::to_string(current->id);
444
+ for (const auto &current : 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 (is<EmptyPredictionContext>(current)) {
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->id << " [shape=box, label=\"" << "[";
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 &current : 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->id << "->" << "s" << current->getParent(i)->id;
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
- PredictionContextCache &contextCache, std::map<Ref<PredictionContext>, Ref<PredictionContext>> &visited) {
447
- if (context->isEmpty()) {
448
- return context;
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::set<PredictionContext *> visited;
510
- getAllContextNodes_(context, nodes, visited);
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
-