expressir 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (310) hide show
  1. checksums.yaml +4 -4
  2. data/.cross_rubies +0 -6
  3. data/.github/workflows/rake.yml +200 -9
  4. data/.gitignore +7 -2
  5. data/.gitmodules +3 -0
  6. data/.rubocop.yml +13 -4
  7. data/Rakefile +4 -1
  8. data/bin/console +0 -1
  9. data/bin/rspec +3 -3
  10. data/exe/expressir +4 -2
  11. data/exe/format +1 -1
  12. data/exe/format-test +25 -25
  13. data/exe/generate-parser +16 -13
  14. data/expressir.gemspec +11 -9
  15. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/CMakeLists.txt +44 -34
  16. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj +11 -5
  17. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2013.vcxproj.filters +0 -3
  18. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj +11 -4
  19. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2015.vcxproj.filters +0 -3
  20. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj +11 -4
  21. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2017.vcxproj.filters +0 -3
  22. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj +11 -4
  23. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlr4cpp-vs2019.vcxproj.filters +0 -3
  24. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/antlrcpp.xcodeproj/project.pbxproj +20 -20
  25. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRFileStream.cpp +0 -6
  26. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.cpp +30 -19
  27. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ANTLRInputStream.h +13 -10
  28. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/CommonToken.cpp +2 -4
  29. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/DefaultErrorStrategy.cpp +16 -13
  30. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.cpp +2 -2
  31. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Exceptions.h +2 -2
  32. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.cpp +5 -4
  33. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/FailedPredicateException.h +1 -1
  34. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/IntStream.h +0 -6
  35. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.cpp +0 -1
  36. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Lexer.h +0 -13
  37. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.cpp +0 -15
  38. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/LexerInterpreter.h +1 -7
  39. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.cpp +47 -27
  40. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Parser.h +0 -6
  41. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.cpp +27 -39
  42. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserInterpreter.h +1 -7
  43. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.cpp +19 -22
  44. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/ParserRuleContext.h +20 -20
  45. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RecognitionException.cpp +0 -1
  46. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.cpp +16 -27
  47. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Recognizer.h +10 -21
  48. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.cpp +4 -3
  49. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuleContext.h +5 -1
  50. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/RuntimeMetaData.cpp +2 -1
  51. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Token.h +0 -32
  52. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.cpp +1 -1
  53. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/TokenStreamRewriter.h +2 -7
  54. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.cpp +15 -18
  55. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/UnbufferedCharStream.h +12 -18
  56. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Version.h +42 -0
  57. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.cpp +13 -45
  58. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/Vocabulary.h +11 -26
  59. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-common.h +19 -61
  60. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/antlr4-runtime.h +7 -5
  61. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.cpp +4 -55
  62. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATN.h +34 -20
  63. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.cpp +30 -35
  64. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfig.h +35 -32
  65. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.cpp +58 -54
  66. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNConfigSet.h +77 -31
  67. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.cpp +22 -32
  68. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializationOptions.h +22 -24
  69. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.cpp +335 -462
  70. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNDeserializer.h +9 -68
  71. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.cpp +9 -39
  72. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSimulator.h +6 -22
  73. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.cpp +10 -26
  74. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNState.h +41 -42
  75. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.cpp +33 -0
  76. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNStateType.h +36 -0
  77. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.cpp +2 -6
  78. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ActionTransition.h +4 -2
  79. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.cpp +49 -22
  80. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ArrayPredictionContext.h +20 -12
  81. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.cpp +1 -5
  82. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AtomTransition.h +5 -2
  83. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.h +4 -2
  84. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.h +4 -2
  85. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.h +5 -3
  86. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.h +10 -1
  87. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionInfo.h +1 -1
  88. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.cpp +0 -5
  89. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/DecisionState.h +12 -8
  90. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.cpp +2 -6
  91. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EpsilonTransition.h +6 -3
  92. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.cpp +139 -106
  93. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LL1Analyzer.h +9 -48
  94. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.cpp +16 -33
  95. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNConfig.h +12 -12
  96. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.cpp +69 -82
  97. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerATNSimulator.h +15 -33
  98. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.cpp +12 -6
  99. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerAction.h +45 -11
  100. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.cpp +48 -44
  101. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionExecutor.h +31 -18
  102. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerActionType.h +3 -1
  103. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.cpp +14 -26
  104. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerChannelAction.h +12 -16
  105. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.cpp +15 -32
  106. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerCustomAction.h +12 -24
  107. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.cpp +23 -29
  108. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerIndexedCustomAction.h +13 -19
  109. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.cpp +13 -26
  110. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerModeAction.h +12 -16
  111. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.cpp +6 -17
  112. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerMoreAction.h +12 -16
  113. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.cpp +6 -17
  114. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPopModeAction.h +12 -16
  115. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.cpp +13 -26
  116. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerPushModeAction.h +12 -16
  117. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.cpp +6 -17
  118. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerSkipAction.h +11 -15
  119. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.cpp +13 -26
  120. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LexerTypeAction.h +13 -17
  121. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.h +5 -1
  122. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.cpp +1 -6
  123. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/NotSetTransition.h +4 -2
  124. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.cpp +6 -2
  125. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/OrderedATNConfigSet.h +8 -3
  126. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.cpp +164 -151
  127. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulator.h +26 -19
  128. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ParserATNSimulatorOptions.h +50 -0
  129. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.h +5 -1
  130. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.h +5 -2
  131. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.cpp +2 -11
  132. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PrecedencePredicateTransition.h +15 -9
  133. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.cpp +2 -2
  134. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateEvalInfo.h +2 -2
  135. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.cpp +4 -14
  136. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredicateTransition.h +22 -11
  137. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.cpp +255 -338
  138. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContext.h +86 -127
  139. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.cpp +56 -0
  140. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextCache.h +64 -0
  141. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.cpp +167 -0
  142. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCache.h +101 -0
  143. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextMergeCacheOptions.h +71 -0
  144. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionContextType.h +21 -0
  145. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.cpp +18 -17
  146. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PredictionMode.h +1 -1
  147. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.cpp +2 -2
  148. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ProfilingATNSimulator.h +2 -2
  149. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.cpp +1 -5
  150. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RangeTransition.h +4 -2
  151. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.h +4 -3
  152. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.h +4 -2
  153. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.cpp +1 -5
  154. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleTransition.h +5 -3
  155. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.cpp +197 -156
  156. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContext.h +92 -81
  157. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SemanticContextType.h +23 -0
  158. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SerializedATNView.h +101 -0
  159. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.cpp +2 -6
  160. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SetTransition.h +11 -3
  161. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.cpp +39 -34
  162. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/SingletonPredictionContext.h +17 -10
  163. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.h +5 -2
  164. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.h +4 -2
  165. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.cpp +6 -6
  166. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopbackState.h +6 -2
  167. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.h +5 -2
  168. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.cpp +1 -9
  169. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Transition.h +11 -22
  170. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.cpp +27 -0
  171. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TransitionType.h +33 -0
  172. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.cpp +1 -5
  173. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/WildcardTransition.h +4 -2
  174. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.cpp +9 -21
  175. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFA.h +20 -15
  176. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.cpp +1 -8
  177. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFASerializer.h +4 -4
  178. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.cpp +9 -50
  179. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/DFAState.h +57 -48
  180. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.cpp +1 -4
  181. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/dfa/LexerDFASerializer.h +3 -4
  182. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.cpp +2 -2
  183. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/InterpreterDataReader.h +3 -1
  184. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.cpp +1 -29
  185. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/Interval.h +10 -10
  186. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.cpp +7 -20
  187. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/IntervalSet.h +1 -9
  188. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.cpp +54 -68
  189. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/misc/MurmurHash.h +34 -14
  190. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.cpp +0 -5
  191. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Any.h +1 -155
  192. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Arrays.h +39 -0
  193. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/BitSet.h +1 -1
  194. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.cpp +12 -53
  195. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/CPPUtils.h +16 -29
  196. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Casts.h +34 -0
  197. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Declarations.h +0 -2
  198. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.cpp +25 -33
  199. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/StringUtils.h +2 -62
  200. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Unicode.h +28 -0
  201. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.cpp +242 -0
  202. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/Utf8.h +54 -0
  203. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/AbstractParseTreeVisitor.h +13 -12
  204. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.h +7 -2
  205. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.cpp +36 -5
  206. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNodeImpl.h +14 -4
  207. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/IterativeParseTreeWalker.cpp +14 -19
  208. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.cpp +0 -3
  209. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTree.h +13 -4
  210. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeType.h +22 -0
  211. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeVisitor.h +4 -4
  212. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.cpp +8 -9
  213. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ParseTreeWalker.h +4 -4
  214. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.h +10 -2
  215. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.cpp +2 -5
  216. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNodeImpl.h +4 -5
  217. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/pattern/ParseTreePatternMatcher.cpp +1 -2
  218. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.cpp +128 -119
  219. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/xpath/XPathLexer.h +18 -27
  220. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/tests/Utf8Test.cpp +110 -0
  221. data/ext/express-parser/antlrgen/Express.interp +1 -1
  222. data/ext/express-parser/antlrgen/ExpressBaseListener.cpp +1 -1
  223. data/ext/express-parser/antlrgen/ExpressBaseListener.h +1 -1
  224. data/ext/express-parser/antlrgen/ExpressBaseVisitor.cpp +1 -1
  225. data/ext/express-parser/antlrgen/ExpressBaseVisitor.h +200 -200
  226. data/ext/express-parser/antlrgen/ExpressLexer.cpp +645 -1129
  227. data/ext/express-parser/antlrgen/ExpressLexer.h +20 -27
  228. data/ext/express-parser/antlrgen/ExpressLexer.interp +1 -1
  229. data/ext/express-parser/antlrgen/ExpressListener.cpp +1 -1
  230. data/ext/express-parser/antlrgen/ExpressListener.h +1 -1
  231. data/ext/express-parser/antlrgen/ExpressParser.cpp +1754 -1447
  232. data/ext/express-parser/antlrgen/ExpressParser.h +219 -223
  233. data/ext/express-parser/antlrgen/ExpressVisitor.cpp +1 -1
  234. data/ext/express-parser/antlrgen/ExpressVisitor.h +200 -200
  235. data/ext/express-parser/express_parser.cpp +207 -75
  236. data/ext/express-parser/extconf.rb +10 -9
  237. data/lib/expressir/config.rb +1 -1
  238. data/lib/expressir/express/parser.rb +2 -2
  239. data/lib/expressir/express/visitor.rb +7 -5
  240. data/lib/expressir/model.rb +78 -78
  241. data/lib/expressir/version.rb +1 -1
  242. data/rakelib/antlr4-native.rake +63 -0
  243. data/rakelib/cross-ruby.rake +213 -162
  244. data/spec/acceptance/version_spec.rb +7 -2
  245. data/spec/expressir/express/cache_spec.rb +8 -5
  246. data/spec/expressir/express/formatter_spec.rb +16 -8
  247. data/spec/expressir/express/parser_spec.rb +17 -11
  248. data/spec/expressir/model/model_element_spec.rb +154 -146
  249. metadata +79 -91
  250. data/demo.rb +0 -18
  251. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.cpp +0 -621
  252. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/ATNSerializer.h +0 -61
  253. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.cpp +0 -14
  254. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/AbstractPredicateTransition.h +0 -24
  255. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicBlockStartState.cpp +0 -12
  256. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BasicState.cpp +0 -12
  257. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockEndState.cpp +0 -15
  258. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/BlockStartState.cpp +0 -9
  259. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.cpp +0 -35
  260. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/EmptyPredictionContext.h +0 -27
  261. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/LoopEndState.cpp +0 -12
  262. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/Makefile +0 -67
  263. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusBlockStartState.cpp +0 -12
  264. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/PlusLoopbackState.cpp +0 -12
  265. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStartState.cpp +0 -16
  266. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/RuleStopState.cpp +0 -12
  267. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarBlockStartState.cpp +0 -12
  268. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/StarLoopEntryState.cpp +0 -15
  269. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/atn/TokensStartState.cpp +0 -12
  270. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.cpp +0 -303
  271. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/support/guid.h +0 -112
  272. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/ErrorNode.cpp +0 -9
  273. data/ext/express-parser/antlr4-upstream/runtime/Cpp/runtime/src/tree/TerminalNode.cpp +0 -9
  274. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +0 -9589
  275. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +0 -36619
  276. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +0 -13294
  277. data/original/examples/employment/eclipse/.project +0 -17
  278. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  279. data/original/examples/employment/eclipse/Express/employment_schema.exp +0 -33
  280. data/original/examples/employment/eclipse/Express/employment_schema.xmi +0 -77
  281. data/original/examples/employment/eclipse/Express/employment_schema.xml +0 -93
  282. data/original/examples/employment/eclipse/Models/Employment.uml +0 -4
  283. data/original/examples/employment/eclipse/Models/Employment.umldi +0 -240
  284. data/original/examples/employment/eclipse/readme.txt +0 -7
  285. data/original/examples/employment/employment_schema.exp +0 -33
  286. data/original/examples/employment/employment_schema.rb +0 -232
  287. data/original/examples/employment/employment_schema.xml +0 -93
  288. data/original/examples/employment/employment_schema___module.rb +0 -46
  289. data/original/examples/employment/employment_schema___p28attr.rb +0 -126
  290. data/original/examples/employment/employment_schema___p28inst.rb +0 -26
  291. data/original/examples/employment/example_employment_data.xml +0 -1
  292. data/original/examples/employment/example_employment_data_copy.xml +0 -1
  293. data/original/examples/employment/example_employment_reader.rb +0 -30
  294. data/original/examples/employment/example_employment_writer.rb +0 -51
  295. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +0 -3710
  296. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +0 -35880
  297. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +0 -15357
  298. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +0 -9468
  299. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +0 -8404
  300. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +0 -43147
  301. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +0 -18341
  302. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +0 -11632
  303. data/original/exp2ruby.rb +0 -525
  304. data/original/expsm.rb +0 -34
  305. data/original/mapping_owl.rb +0 -1018
  306. data/original/mapping_sysml.rb +0 -2281
  307. data/original/mapping_uml2.rb +0 -599
  308. data/original/mapping_uml2_eclipse.rb +0 -433
  309. data/original/reeper.rb +0 -134
  310. data/spec/expressr_spec.rb +0 -5
@@ -5,24 +5,30 @@
5
5
 
6
6
  #pragma once
7
7
 
8
+ #include <atomic>
9
+
8
10
  #include "Recognizer.h"
9
11
  #include "atn/ATN.h"
10
12
  #include "atn/ATNState.h"
13
+ #include "atn/PredictionContextType.h"
11
14
 
12
15
  namespace antlr4 {
16
+
17
+ class RuleContext;
18
+
13
19
  namespace atn {
14
20
 
15
- struct PredictionContextHasher;
16
- struct PredictionContextComparer;
21
+ class ATN;
22
+ class ArrayPredictionContext;
23
+ class SingletonPredictionContext;
24
+ class PredictionContextCache;
17
25
  class PredictionContextMergeCache;
18
26
 
19
- typedef std::unordered_set<Ref<PredictionContext>, PredictionContextHasher, PredictionContextComparer> PredictionContextCache;
20
-
21
27
  class ANTLR4CPP_PUBLIC PredictionContext {
22
28
  public:
23
29
  /// Represents $ in local context prediction, which means wildcard.
24
30
  /// *+x = *.
25
- static const Ref<PredictionContext> EMPTY;
31
+ static const Ref<const PredictionContext> EMPTY;
26
32
 
27
33
  /// Represents $ in an array in full context mode, when $
28
34
  /// doesn't mean wildcard: $ + x = [$,x]. Here,
@@ -30,80 +36,13 @@ namespace atn {
30
36
  // ml: originally Integer.MAX_VALUE, which would be -1 for us, but this is already used in places where
31
37
  // -1 is converted to unsigned, so we use a different value here. Any value does the job provided it doesn't
32
38
  // conflict with real return states.
33
- #if __cplusplus >= 201703L
34
39
  static constexpr size_t EMPTY_RETURN_STATE = std::numeric_limits<size_t>::max() - 9;
35
- #else
36
- enum : size_t {
37
- EMPTY_RETURN_STATE = static_cast<size_t>(-10), // std::numeric_limits<size_t>::max() - 9; doesn't work in VS 2013
38
- };
39
- #endif
40
-
41
- private:
42
- #if __cplusplus >= 201703L
43
- static constexpr size_t INITIAL_HASH = 1;
44
- #else
45
- enum : size_t {
46
- INITIAL_HASH = 1,
47
- };
48
- #endif
49
-
50
- public:
51
- static size_t globalNodeCount;
52
- const size_t id;
53
-
54
- /// <summary>
55
- /// Stores the computed hash code of this <seealso cref="PredictionContext"/>. The hash
56
- /// code is computed in parts to match the following reference algorithm.
57
- ///
58
- /// <pre>
59
- /// private int referenceHashCode() {
60
- /// int hash = <seealso cref="MurmurHash#initialize"/>(<seealso cref="#INITIAL_HASH"/>);
61
- ///
62
- /// for (int i = 0; i < <seealso cref="#size()"/>; i++) {
63
- /// hash = <seealso cref="MurmurHash#update"/>(hash, <seealso cref="#getParent"/>(i));
64
- /// }
65
- ///
66
- /// for (int i = 0; i < <seealso cref="#size()"/>; i++) {
67
- /// hash = <seealso cref="MurmurHash#update"/>(hash, <seealso cref="#getReturnState"/>(i));
68
- /// }
69
- ///
70
- /// hash = <seealso cref="MurmurHash#finish"/>(hash, 2 * <seealso cref="#size()"/>);
71
- /// return hash;
72
- /// }
73
- /// </pre>
74
- /// </summary>
75
- const size_t cachedHashCode;
76
40
 
77
- protected:
78
- PredictionContext(size_t cachedHashCode);
79
- ~PredictionContext();
80
-
81
- public:
82
- /// Convert a RuleContext tree to a PredictionContext graph.
83
- /// Return EMPTY if outerContext is empty.
84
- static Ref<PredictionContext> fromRuleContext(const ATN &atn, RuleContext *outerContext);
85
-
86
- virtual size_t size() const = 0;
87
- virtual Ref<PredictionContext> getParent(size_t index) const = 0;
88
- virtual size_t getReturnState(size_t index) const = 0;
89
-
90
- virtual bool operator == (const PredictionContext &o) const = 0;
91
-
92
- /// This means only the EMPTY (wildcard? not sure) context is in set.
93
- virtual bool isEmpty() const;
94
- virtual bool hasEmptyPath() const;
95
- virtual size_t hashCode() const;
96
-
97
- protected:
98
- static size_t calculateEmptyHashCode();
99
- static size_t calculateHashCode(Ref<PredictionContext> parent, size_t returnState);
100
- static size_t calculateHashCode(const std::vector<Ref<PredictionContext>> &parents,
101
- const std::vector<size_t> &returnStates);
102
-
103
- public:
104
41
  // dispatch
105
- static Ref<PredictionContext> merge(const Ref<PredictionContext> &a, const Ref<PredictionContext> &b,
106
- bool rootIsWildcard, PredictionContextMergeCache *mergeCache);
42
+ static Ref<const PredictionContext> merge(Ref<const PredictionContext> a,
43
+ Ref<const PredictionContext> b,
44
+ bool rootIsWildcard,
45
+ PredictionContextMergeCache *mergeCache);
107
46
 
108
47
  /// <summary>
109
48
  /// Merge two <seealso cref="SingletonPredictionContext"/> instances.
@@ -139,8 +78,10 @@ namespace atn {
139
78
  /// <param name="rootIsWildcard"> {@code true} if this is a local-context merge,
140
79
  /// otherwise false to indicate a full-context merge </param>
141
80
  /// <param name="mergeCache"> </param>
142
- static Ref<PredictionContext> mergeSingletons(const Ref<SingletonPredictionContext> &a,
143
- const Ref<SingletonPredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache);
81
+ static Ref<const PredictionContext> mergeSingletons(Ref<const SingletonPredictionContext> a,
82
+ Ref<const SingletonPredictionContext> b,
83
+ bool rootIsWildcard,
84
+ PredictionContextMergeCache *mergeCache);
144
85
 
145
86
  /**
146
87
  * Handle case where at least one of {@code a} or {@code b} is
@@ -180,8 +121,9 @@ namespace atn {
180
121
  * @param rootIsWildcard {@code true} if this is a local-context merge,
181
122
  * otherwise false to indicate a full-context merge
182
123
  */
183
- static Ref<PredictionContext> mergeRoot(const Ref<SingletonPredictionContext> &a,
184
- const Ref<SingletonPredictionContext> &b, bool rootIsWildcard);
124
+ static Ref<const PredictionContext> mergeRoot(Ref<const SingletonPredictionContext> a,
125
+ Ref<const SingletonPredictionContext> b,
126
+ bool rootIsWildcard);
185
127
 
186
128
  /**
187
129
  * Merge two {@link ArrayPredictionContext} instances.
@@ -202,65 +144,82 @@ namespace atn {
202
144
  * {@link SingletonPredictionContext}.<br>
203
145
  * <embed src="images/ArrayMerge_EqualTop.svg" type="image/svg+xml"/></p>
204
146
  */
205
- static Ref<PredictionContext> mergeArrays(const Ref<ArrayPredictionContext> &a,
206
- const Ref<ArrayPredictionContext> &b, bool rootIsWildcard, PredictionContextMergeCache *mergeCache);
147
+ static Ref<const PredictionContext> mergeArrays(Ref<const ArrayPredictionContext> a,
148
+ Ref<const ArrayPredictionContext> b,
149
+ bool rootIsWildcard,
150
+ PredictionContextMergeCache *mergeCache);
207
151
 
208
- protected:
209
- /// Make pass over all M parents; merge any equal() ones.
210
- /// @returns true if the list has been changed (i.e. duplicates where found).
211
- static bool combineCommonParents(std::vector<Ref<PredictionContext>> &parents);
152
+ static std::string toDOTString(const Ref<const PredictionContext> &context);
212
153
 
213
- public:
214
- static std::string toDOTString(const Ref<PredictionContext> &context);
154
+ static Ref<const PredictionContext> getCachedContext(const Ref<const PredictionContext> &context,
155
+ PredictionContextCache &contextCache);
215
156
 
216
- static Ref<PredictionContext> getCachedContext(const Ref<PredictionContext> &context,
217
- PredictionContextCache &contextCache,
218
- std::map<Ref<PredictionContext>, Ref<PredictionContext>> &visited);
157
+ static std::vector<Ref<const PredictionContext>> getAllContextNodes(const Ref<const PredictionContext> &context);
219
158
 
220
- // ter's recursive version of Sam's getAllNodes()
221
- static std::vector<Ref<PredictionContext>> getAllContextNodes(const Ref<PredictionContext> &context);
222
- static void getAllContextNodes_(const Ref<PredictionContext> &context,
223
- std::vector<Ref<PredictionContext>> &nodes, std::set<PredictionContext *> &visited);
159
+ /// Convert a RuleContext tree to a PredictionContext graph.
160
+ /// Return EMPTY if outerContext is empty.
161
+ static Ref<const PredictionContext> fromRuleContext(const ATN &atn, RuleContext *outerContext);
224
162
 
225
- virtual std::string toString() const;
226
- virtual std::string toString(Recognizer *recog) const;
163
+ PredictionContext(const PredictionContext&) = delete;
227
164
 
228
- std::vector<std::string> toStrings(Recognizer *recognizer, int currentState);
229
- std::vector<std::string> toStrings(Recognizer *recognizer, const Ref<PredictionContext> &stop, int currentState);
230
- };
165
+ virtual ~PredictionContext() = default;
231
166
 
232
- struct PredictionContextHasher {
233
- size_t operator () (const Ref<PredictionContext> &k) const {
234
- return k->hashCode();
235
- }
236
- };
167
+ PredictionContext& operator=(const PredictionContext&) = delete;
168
+ PredictionContext& operator=(PredictionContext&&) = delete;
237
169
 
238
- struct PredictionContextComparer {
239
- bool operator () (const Ref<PredictionContext> &lhs, const Ref<PredictionContext> &rhs) const
240
- {
241
- if (lhs == rhs) // Object identity.
242
- return true;
243
- return (lhs->hashCode() == rhs->hashCode()) && (*lhs == *rhs);
244
- }
245
- };
170
+ PredictionContextType getContextType() const { return _contextType; }
246
171
 
247
- class PredictionContextMergeCache {
248
- public:
249
- Ref<PredictionContext> put(Ref<PredictionContext> const& key1, Ref<PredictionContext> const& key2,
250
- Ref<PredictionContext> const& value);
251
- Ref<PredictionContext> get(Ref<PredictionContext> const& key1, Ref<PredictionContext> const& key2);
172
+ virtual size_t size() const = 0;
173
+ virtual const Ref<const PredictionContext>& getParent(size_t index) const = 0;
174
+ virtual size_t getReturnState(size_t index) const = 0;
252
175
 
253
- void clear();
254
- std::string toString() const;
255
- size_t count() const;
176
+ /// This means only the EMPTY (wildcard? not sure) context is in set.
177
+ virtual bool isEmpty() const = 0;
178
+ bool hasEmptyPath() const;
256
179
 
257
- private:
258
- std::unordered_map<Ref<PredictionContext>,
259
- std::unordered_map<Ref<PredictionContext>, Ref<PredictionContext>, PredictionContextHasher, PredictionContextComparer>,
260
- PredictionContextHasher, PredictionContextComparer> _data;
180
+ size_t hashCode() const;
181
+
182
+ virtual bool equals(const PredictionContext &other) const = 0;
261
183
 
184
+ virtual std::string toString() const = 0;
185
+
186
+ std::vector<std::string> toStrings(Recognizer *recognizer, int currentState) const;
187
+ std::vector<std::string> toStrings(Recognizer *recognizer,
188
+ const Ref<const PredictionContext> &stop,
189
+ int currentState) const;
190
+
191
+ protected:
192
+ explicit PredictionContext(PredictionContextType contextType);
193
+
194
+ PredictionContext(PredictionContext&& other);
195
+
196
+ virtual size_t hashCodeImpl() const = 0;
197
+
198
+ size_t cachedHashCode() const { return _hashCode.load(std::memory_order_relaxed); }
199
+
200
+ private:
201
+ const PredictionContextType _contextType;
202
+ mutable std::atomic<size_t> _hashCode;
262
203
  };
263
204
 
264
- } // namespace atn
265
- } // namespace antlr4
205
+ inline bool operator==(const PredictionContext &lhs, const PredictionContext &rhs) {
206
+ return lhs.equals(rhs);
207
+ }
208
+
209
+ inline bool operator!=(const PredictionContext &lhs, const PredictionContext &rhs) {
210
+ return !operator==(lhs, rhs);
211
+ }
212
+
213
+ } // namespace atn
214
+ } // namespace antlr4
215
+
216
+ namespace std {
217
+
218
+ template <>
219
+ struct hash<::antlr4::atn::PredictionContext> {
220
+ size_t operator()(const ::antlr4::atn::PredictionContext &predictionContext) const {
221
+ return predictionContext.hashCode();
222
+ }
223
+ };
266
224
 
225
+ } // namespace std
@@ -0,0 +1,56 @@
1
+ // Copyright 2012-2022 The ANTLR Project
2
+ //
3
+ // Redistribution and use in source and binary forms, with or without modification, are permitted
4
+ // provided that the following conditions are met:
5
+ //
6
+ // 1. Redistributions of source code must retain the above copyright notice, this list of conditions
7
+ // and the following disclaimer.
8
+ //
9
+ // 2. Redistributions in binary form must reproduce the above copyright notice, this list of
10
+ // conditions and the following disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ //
13
+ // 3. Neither the name of the copyright holder nor the names of its contributors may be used to
14
+ // endorse or promote products derived from this software without specific prior written
15
+ // permission.
16
+ //
17
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
18
+ // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19
+ // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20
+ // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23
+ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
24
+ // WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
26
+ #include "atn/PredictionContextCache.h"
27
+
28
+ using namespace antlr4::atn;
29
+
30
+ void PredictionContextCache::put(const Ref<const PredictionContext> &value) {
31
+ assert(value);
32
+
33
+ _data.insert(value);
34
+ }
35
+
36
+ Ref<const PredictionContext> PredictionContextCache::get(
37
+ const Ref<const PredictionContext> &value) const {
38
+ assert(value);
39
+
40
+ auto iterator = _data.find(value);
41
+ if (iterator == _data.end()) {
42
+ return nullptr;
43
+ }
44
+ return *iterator;
45
+ }
46
+
47
+ size_t PredictionContextCache::PredictionContextHasher::operator()(
48
+ const Ref<const PredictionContext> &predictionContext) const {
49
+ return predictionContext->hashCode();
50
+ }
51
+
52
+ bool PredictionContextCache::PredictionContextComparer::operator()(
53
+ const Ref<const PredictionContext> &lhs,
54
+ const Ref<const PredictionContext> &rhs) const {
55
+ return *lhs == *rhs;
56
+ }
@@ -0,0 +1,64 @@
1
+ // Copyright 2012-2022 The ANTLR Project
2
+ //
3
+ // Redistribution and use in source and binary forms, with or without modification, are permitted
4
+ // provided that the following conditions are met:
5
+ //
6
+ // 1. Redistributions of source code must retain the above copyright notice, this list of conditions
7
+ // and the following disclaimer.
8
+ //
9
+ // 2. Redistributions in binary form must reproduce the above copyright notice, this list of
10
+ // conditions and the following disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ //
13
+ // 3. Neither the name of the copyright holder nor the names of its contributors may be used to
14
+ // endorse or promote products derived from this software without specific prior written
15
+ // permission.
16
+ //
17
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
18
+ // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19
+ // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20
+ // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23
+ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
24
+ // WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
26
+ #pragma once
27
+
28
+ #include <unordered_set>
29
+
30
+ #include "atn/PredictionContext.h"
31
+
32
+ namespace antlr4 {
33
+ namespace atn {
34
+
35
+ class ANTLR4CPP_PUBLIC PredictionContextCache final {
36
+ public:
37
+ PredictionContextCache() = default;
38
+
39
+ PredictionContextCache(const PredictionContextCache&) = delete;
40
+ PredictionContextCache(PredictionContextCache&&) = delete;
41
+
42
+ PredictionContextCache& operator=(const PredictionContextCache&) = delete;
43
+ PredictionContextCache& operator=(PredictionContextCache&&) = delete;
44
+
45
+ void put(const Ref<const PredictionContext> &value);
46
+
47
+ Ref<const PredictionContext> get(const Ref<const PredictionContext> &value) const;
48
+
49
+ private:
50
+ struct ANTLR4CPP_PUBLIC PredictionContextHasher final {
51
+ size_t operator()(const Ref<const PredictionContext> &predictionContext) const;
52
+ };
53
+
54
+ struct ANTLR4CPP_PUBLIC PredictionContextComparer final {
55
+ bool operator()(const Ref<const PredictionContext> &lhs,
56
+ const Ref<const PredictionContext> &rhs) const;
57
+ };
58
+
59
+ std::unordered_set<Ref<const PredictionContext>,
60
+ PredictionContextHasher, PredictionContextComparer> _data;
61
+ };
62
+
63
+ } // namespace atn
64
+ } // namespace antlr4
@@ -0,0 +1,167 @@
1
+ // Copyright 2012-2022 The ANTLR Project
2
+ //
3
+ // Redistribution and use in source and binary forms, with or without modification, are permitted
4
+ // provided that the following conditions are met:
5
+ //
6
+ // 1. Redistributions of source code must retain the above copyright notice, this list of conditions
7
+ // and the following disclaimer.
8
+ //
9
+ // 2. Redistributions in binary form must reproduce the above copyright notice, this list of
10
+ // conditions and the following disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ //
13
+ // 3. Neither the name of the copyright holder nor the names of its contributors may be used to
14
+ // endorse or promote products derived from this software without specific prior written
15
+ // permission.
16
+ //
17
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
18
+ // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19
+ // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20
+ // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23
+ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
24
+ // WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
26
+ #include "atn/PredictionContextMergeCache.h"
27
+
28
+ #include "misc/MurmurHash.h"
29
+
30
+ using namespace antlr4::atn;
31
+ using namespace antlr4::misc;
32
+
33
+ PredictionContextMergeCache::PredictionContextMergeCache(
34
+ const PredictionContextMergeCacheOptions &options) : _options(options) {}
35
+
36
+ Ref<const PredictionContext> PredictionContextMergeCache::put(
37
+ const Ref<const PredictionContext> &key1,
38
+ const Ref<const PredictionContext> &key2,
39
+ Ref<const PredictionContext> value) {
40
+ assert(key1);
41
+ assert(key2);
42
+
43
+ if (getOptions().getMaxSize() == 0) {
44
+ // Cache is effectively disabled.
45
+ return value;
46
+ }
47
+
48
+ auto [existing, inserted] = _entries.try_emplace(std::make_pair(key1.get(), key2.get()));
49
+ if (inserted) {
50
+ try {
51
+ existing->second.reset(new Entry());
52
+ } catch (...) {
53
+ _entries.erase(existing);
54
+ throw;
55
+ }
56
+ existing->second->key = std::make_pair(key1, key2);
57
+ existing->second->value = std::move(value);
58
+ pushToFront(existing->second.get());
59
+ } else {
60
+ if (existing->second->value != value) {
61
+ existing->second->value = std::move(value);
62
+ }
63
+ moveToFront(existing->second.get());
64
+ }
65
+ compact(existing->second.get());
66
+ return existing->second->value;
67
+ }
68
+
69
+ Ref<const PredictionContext> PredictionContextMergeCache::get(
70
+ const Ref<const PredictionContext> &key1,
71
+ const Ref<const PredictionContext> &key2) const {
72
+ assert(key1);
73
+ assert(key2);
74
+
75
+ if (getOptions().getMaxSize() == 0) {
76
+ // Cache is effectively disabled.
77
+ return nullptr;
78
+ }
79
+
80
+ auto iterator = _entries.find(std::make_pair(key1.get(), key2.get()));
81
+ if (iterator == _entries.end()) {
82
+ return nullptr;
83
+ }
84
+ moveToFront(iterator->second.get());
85
+ return iterator->second->value;
86
+ }
87
+
88
+ void PredictionContextMergeCache::clear() {
89
+ Container().swap(_entries);
90
+ _head = _tail = nullptr;
91
+ _size = 0;
92
+ }
93
+
94
+ void PredictionContextMergeCache::moveToFront(Entry *entry) const {
95
+ if (entry->prev == nullptr) {
96
+ assert(entry == _head);
97
+ return;
98
+ }
99
+ entry->prev->next = entry->next;
100
+ if (entry->next != nullptr) {
101
+ entry->next->prev = entry->prev;
102
+ } else {
103
+ assert(entry == _tail);
104
+ _tail = entry->prev;
105
+ }
106
+ entry->prev = nullptr;
107
+ entry->next = _head;
108
+ _head->prev = entry;
109
+ _head = entry;
110
+ assert(entry->prev == nullptr);
111
+ }
112
+
113
+ void PredictionContextMergeCache::pushToFront(Entry *entry) {
114
+ ++_size;
115
+ entry->prev = nullptr;
116
+ entry->next = _head;
117
+ if (_head != nullptr) {
118
+ _head->prev = entry;
119
+ _head = entry;
120
+ } else {
121
+ assert(entry->next == nullptr);
122
+ _head = entry;
123
+ _tail = entry;
124
+ }
125
+ assert(entry->prev == nullptr);
126
+ }
127
+
128
+ void PredictionContextMergeCache::remove(Entry *entry) {
129
+ if (entry->prev != nullptr) {
130
+ entry->prev->next = entry->next;
131
+ } else {
132
+ assert(entry == _head);
133
+ _head = entry->next;
134
+ }
135
+ if (entry->next != nullptr) {
136
+ entry->next->prev = entry->prev;
137
+ } else {
138
+ assert(entry == _tail);
139
+ _tail = entry->prev;
140
+ }
141
+ --_size;
142
+ _entries.erase(std::make_pair(entry->key.first.get(), entry->key.second.get()));
143
+ }
144
+
145
+ void PredictionContextMergeCache::compact(const Entry *preserve) {
146
+ Entry *entry = _tail;
147
+ while (entry != nullptr && _size > getOptions().getMaxSize()) {
148
+ Entry *next = entry->prev;
149
+ if (entry != preserve) {
150
+ remove(entry);
151
+ }
152
+ entry = next;
153
+ }
154
+ }
155
+
156
+ size_t PredictionContextMergeCache::PredictionContextHasher::operator()(
157
+ const PredictionContextPair &value) const {
158
+ size_t hash = MurmurHash::initialize();
159
+ hash = MurmurHash::update(hash, value.first->hashCode());
160
+ hash = MurmurHash::update(hash, value.second->hashCode());
161
+ return MurmurHash::finish(hash, 2);
162
+ }
163
+
164
+ bool PredictionContextMergeCache::PredictionContextComparer::operator()(
165
+ const PredictionContextPair &lhs, const PredictionContextPair &rhs) const {
166
+ return *lhs.first == *rhs.first && *lhs.second == *rhs.second;
167
+ }
@@ -0,0 +1,101 @@
1
+ // Copyright 2012-2022 The ANTLR Project
2
+ //
3
+ // Redistribution and use in source and binary forms, with or without modification, are permitted
4
+ // provided that the following conditions are met:
5
+ //
6
+ // 1. Redistributions of source code must retain the above copyright notice, this list of conditions
7
+ // and the following disclaimer.
8
+ //
9
+ // 2. Redistributions in binary form must reproduce the above copyright notice, this list of
10
+ // conditions and the following disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ //
13
+ // 3. Neither the name of the copyright holder nor the names of its contributors may be used to
14
+ // endorse or promote products derived from this software without specific prior written
15
+ // permission.
16
+ //
17
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
18
+ // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19
+ // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20
+ // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23
+ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
24
+ // WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
26
+ #pragma once
27
+
28
+ #include <unordered_map>
29
+ #include <utility>
30
+
31
+ #include "atn/PredictionContext.h"
32
+ #include "atn/PredictionContextMergeCacheOptions.h"
33
+
34
+ namespace antlr4 {
35
+ namespace atn {
36
+
37
+ class ANTLR4CPP_PUBLIC PredictionContextMergeCache final {
38
+ public:
39
+ PredictionContextMergeCache()
40
+ : PredictionContextMergeCache(PredictionContextMergeCacheOptions()) {}
41
+
42
+ explicit PredictionContextMergeCache(const PredictionContextMergeCacheOptions &options);
43
+
44
+ PredictionContextMergeCache(const PredictionContextMergeCache&) = delete;
45
+ PredictionContextMergeCache(PredictionContextMergeCache&&) = delete;
46
+
47
+ PredictionContextMergeCache& operator=(const PredictionContextMergeCache&) = delete;
48
+ PredictionContextMergeCache& operator=(PredictionContextMergeCache&&) = delete;
49
+
50
+ Ref<const PredictionContext> put(const Ref<const PredictionContext> &key1,
51
+ const Ref<const PredictionContext> &key2,
52
+ Ref<const PredictionContext> value);
53
+
54
+ Ref<const PredictionContext> get(const Ref<const PredictionContext> &key1,
55
+ const Ref<const PredictionContext> &key2) const;
56
+
57
+ const PredictionContextMergeCacheOptions& getOptions() const { return _options; }
58
+
59
+ void clear();
60
+
61
+ private:
62
+ using PredictionContextPair = std::pair<const PredictionContext*, const PredictionContext*>;
63
+
64
+ struct ANTLR4CPP_PUBLIC PredictionContextHasher final {
65
+ size_t operator()(const PredictionContextPair &value) const;
66
+ };
67
+
68
+ struct ANTLR4CPP_PUBLIC PredictionContextComparer final {
69
+ bool operator()(const PredictionContextPair &lhs, const PredictionContextPair &rhs) const;
70
+ };
71
+
72
+ struct ANTLR4CPP_PUBLIC Entry final {
73
+ std::pair<Ref<const PredictionContext>, Ref<const PredictionContext>> key;
74
+ Ref<const PredictionContext> value;
75
+ Entry *prev = nullptr;
76
+ Entry *next = nullptr;
77
+ };
78
+
79
+ void moveToFront(Entry *entry) const;
80
+
81
+ void pushToFront(Entry *entry);
82
+
83
+ void remove(Entry *entry);
84
+
85
+ void compact(const Entry *preserve);
86
+
87
+ using Container = std::unordered_map<PredictionContextPair, std::unique_ptr<Entry>,
88
+ PredictionContextHasher, PredictionContextComparer>;
89
+
90
+ const PredictionContextMergeCacheOptions _options;
91
+
92
+ Container _entries;
93
+
94
+ mutable Entry *_head = nullptr;
95
+ mutable Entry *_tail = nullptr;
96
+
97
+ size_t _size = 0;
98
+ };
99
+
100
+ } // namespace atn
101
+ } // namespace antlr4