antlr4-runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +35 -0
- data/LICENSE.txt +21 -0
- data/README.md +65 -0
- data/Rakefile +6 -0
- data/antlr4-runtime.gemspec +30 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/rumourhash/Makefile +264 -0
- data/ext/rumourhash/extconf.rb +3 -0
- data/ext/rumourhash/rumourhash.c +59 -0
- data/lib/antlr4/runtime.rb +37 -0
- data/lib/antlr4/runtime/abstract_parse_tree_visitor.rb +43 -0
- data/lib/antlr4/runtime/abstract_predicate_transition.rb +11 -0
- data/lib/antlr4/runtime/action_transition.rb +29 -0
- data/lib/antlr4/runtime/ambiguity_info.rb +10 -0
- data/lib/antlr4/runtime/antlr_error_listener.rb +15 -0
- data/lib/antlr4/runtime/antlr_error_strategy.rb +24 -0
- data/lib/antlr4/runtime/antlr_file_stream.rb +17 -0
- data/lib/antlr4/runtime/antlr_input_stream.rb +6 -0
- data/lib/antlr4/runtime/array_2d_hash_set.rb +471 -0
- data/lib/antlr4/runtime/array_prediction_context.rb +76 -0
- data/lib/antlr4/runtime/atn.rb +100 -0
- data/lib/antlr4/runtime/atn_config.rb +140 -0
- data/lib/antlr4/runtime/atn_config_set.rb +150 -0
- data/lib/antlr4/runtime/atn_deserialization_options.rb +48 -0
- data/lib/antlr4/runtime/atn_deserializer.rb +737 -0
- data/lib/antlr4/runtime/atn_simulator.rb +69 -0
- data/lib/antlr4/runtime/atn_state.rb +118 -0
- data/lib/antlr4/runtime/atn_type.rb +8 -0
- data/lib/antlr4/runtime/atom_transition.rb +27 -0
- data/lib/antlr4/runtime/bail_error_strategy.rb +31 -0
- data/lib/antlr4/runtime/base_error_listener.rb +18 -0
- data/lib/antlr4/runtime/basic_block_start_state.rb +12 -0
- data/lib/antlr4/runtime/basic_state.rb +11 -0
- data/lib/antlr4/runtime/bit_set.rb +54 -0
- data/lib/antlr4/runtime/block_end_state.rb +15 -0
- data/lib/antlr4/runtime/block_start_state.rb +12 -0
- data/lib/antlr4/runtime/buffered_token_stream.rb +335 -0
- data/lib/antlr4/runtime/char_stream.rb +6 -0
- data/lib/antlr4/runtime/char_streams.rb +12 -0
- data/lib/antlr4/runtime/chunk.rb +4 -0
- data/lib/antlr4/runtime/code_point_char_stream.rb +83 -0
- data/lib/antlr4/runtime/common_token.rb +125 -0
- data/lib/antlr4/runtime/common_token_factory.rb +30 -0
- data/lib/antlr4/runtime/common_token_stream.rb +63 -0
- data/lib/antlr4/runtime/console_error_listener.rb +12 -0
- data/lib/antlr4/runtime/context_sensitivity_info.rb +7 -0
- data/lib/antlr4/runtime/decision_event_info.rb +19 -0
- data/lib/antlr4/runtime/decision_info.rb +36 -0
- data/lib/antlr4/runtime/decision_state.rb +15 -0
- data/lib/antlr4/runtime/default_error_strategy.rb +314 -0
- data/lib/antlr4/runtime/dfa.rb +97 -0
- data/lib/antlr4/runtime/dfa_serializer.rb +62 -0
- data/lib/antlr4/runtime/dfa_state.rb +109 -0
- data/lib/antlr4/runtime/diagnostic_error_listener.rb +58 -0
- data/lib/antlr4/runtime/double_key_map.rb +49 -0
- data/lib/antlr4/runtime/empty_prediction_context.rb +35 -0
- data/lib/antlr4/runtime/epsilon_transition.rb +27 -0
- data/lib/antlr4/runtime/equality_comparator.rb +4 -0
- data/lib/antlr4/runtime/error_info.rb +7 -0
- data/lib/antlr4/runtime/error_node.rb +5 -0
- data/lib/antlr4/runtime/error_node_impl.rb +12 -0
- data/lib/antlr4/runtime/failed_predicate_exception.rb +33 -0
- data/lib/antlr4/runtime/flexible_hash_map.rb +232 -0
- data/lib/antlr4/runtime/input_mismatch_exception.rb +20 -0
- data/lib/antlr4/runtime/int_stream.rb +31 -0
- data/lib/antlr4/runtime/integer.rb +14 -0
- data/lib/antlr4/runtime/interval.rb +111 -0
- data/lib/antlr4/runtime/interval_set.rb +540 -0
- data/lib/antlr4/runtime/lexer.rb +257 -0
- data/lib/antlr4/runtime/lexer_action.rb +12 -0
- data/lib/antlr4/runtime/lexer_action_executor.rb +75 -0
- data/lib/antlr4/runtime/lexer_action_type.rb +12 -0
- data/lib/antlr4/runtime/lexer_atn_config.rb +50 -0
- data/lib/antlr4/runtime/lexer_atn_simulator.rb +522 -0
- data/lib/antlr4/runtime/lexer_channel_action.rb +51 -0
- data/lib/antlr4/runtime/lexer_custom_action.rb +49 -0
- data/lib/antlr4/runtime/lexer_dfa_serializer.rb +12 -0
- data/lib/antlr4/runtime/lexer_indexed_custom_action.rb +49 -0
- data/lib/antlr4/runtime/lexer_mode_action.rb +51 -0
- data/lib/antlr4/runtime/lexer_more_action.rb +41 -0
- data/lib/antlr4/runtime/lexer_no_viable_alt_exception.rb +4 -0
- data/lib/antlr4/runtime/lexer_pop_mode_action.rb +41 -0
- data/lib/antlr4/runtime/lexer_push_mode_action.rb +51 -0
- data/lib/antlr4/runtime/lexer_skip_action.rb +43 -0
- data/lib/antlr4/runtime/lexer_type_action.rb +51 -0
- data/lib/antlr4/runtime/ll1_analyzer.rb +133 -0
- data/lib/antlr4/runtime/lookahead_event_info.rb +10 -0
- data/lib/antlr4/runtime/loop_end_state.rb +15 -0
- data/lib/antlr4/runtime/murmur_hash.rb +99 -0
- data/lib/antlr4/runtime/no_viable_alt_exception.rb +7 -0
- data/lib/antlr4/runtime/not_set_transition.rb +20 -0
- data/lib/antlr4/runtime/object_equality_comparator.rb +18 -0
- data/lib/antlr4/runtime/ordered_atn_config_set.rb +15 -0
- data/lib/antlr4/runtime/parse_cancellation_exception.rb +5 -0
- data/lib/antlr4/runtime/parse_tree.rb +7 -0
- data/lib/antlr4/runtime/parse_tree_listener.rb +4 -0
- data/lib/antlr4/runtime/parse_tree_visitor.rb +4 -0
- data/lib/antlr4/runtime/parser.rb +522 -0
- data/lib/antlr4/runtime/parser_atn_simulator.rb +1171 -0
- data/lib/antlr4/runtime/parser_rule_context.rb +186 -0
- data/lib/antlr4/runtime/plus_block_start_state.rb +11 -0
- data/lib/antlr4/runtime/plus_loopback_state.rb +12 -0
- data/lib/antlr4/runtime/precedence_predicate_transition.rb +31 -0
- data/lib/antlr4/runtime/predicate.rb +6 -0
- data/lib/antlr4/runtime/predicate_eval_info.rb +16 -0
- data/lib/antlr4/runtime/predicate_transition.rb +35 -0
- data/lib/antlr4/runtime/prediction_context.rb +103 -0
- data/lib/antlr4/runtime/prediction_context_cache.rb +28 -0
- data/lib/antlr4/runtime/prediction_context_utils.rb +407 -0
- data/lib/antlr4/runtime/prediction_mode.rb +213 -0
- data/lib/antlr4/runtime/profiling_atn_simulator.rb +149 -0
- data/lib/antlr4/runtime/proxy_error_listener.rb +33 -0
- data/lib/antlr4/runtime/range_transition.rb +29 -0
- data/lib/antlr4/runtime/recognition_exception.rb +17 -0
- data/lib/antlr4/runtime/recognizer.rb +136 -0
- data/lib/antlr4/runtime/rule_context.rb +131 -0
- data/lib/antlr4/runtime/rule_context_with_alt_num.rb +11 -0
- data/lib/antlr4/runtime/rule_node.rb +8 -0
- data/lib/antlr4/runtime/rule_start_state.rb +17 -0
- data/lib/antlr4/runtime/rule_stop_state.rb +12 -0
- data/lib/antlr4/runtime/rule_tag_token.rb +64 -0
- data/lib/antlr4/runtime/rule_transition.rb +29 -0
- data/lib/antlr4/runtime/semantic_context.rb +313 -0
- data/lib/antlr4/runtime/set_transition.rb +29 -0
- data/lib/antlr4/runtime/singleton_prediction_context.rb +56 -0
- data/lib/antlr4/runtime/star_block_start_state.rb +12 -0
- data/lib/antlr4/runtime/star_loop_entry_state.rb +17 -0
- data/lib/antlr4/runtime/star_loopback_state.rb +16 -0
- data/lib/antlr4/runtime/syntax_tree.rb +6 -0
- data/lib/antlr4/runtime/tag_chunk.rb +22 -0
- data/lib/antlr4/runtime/terminal_node.rb +5 -0
- data/lib/antlr4/runtime/terminal_node_impl.rb +50 -0
- data/lib/antlr4/runtime/text_chunk.rb +16 -0
- data/lib/antlr4/runtime/token.rb +13 -0
- data/lib/antlr4/runtime/token_stream.rb +13 -0
- data/lib/antlr4/runtime/token_tag_token.rb +22 -0
- data/lib/antlr4/runtime/tokens_start_state.rb +14 -0
- data/lib/antlr4/runtime/transition.rb +51 -0
- data/lib/antlr4/runtime/tree.rb +4 -0
- data/lib/antlr4/runtime/trees.rb +195 -0
- data/lib/antlr4/runtime/triple.rb +40 -0
- data/lib/antlr4/runtime/utils.rb +117 -0
- data/lib/antlr4/runtime/uuid.rb +46 -0
- data/lib/antlr4/runtime/version.rb +5 -0
- data/lib/antlr4/runtime/vocabulary.rb +12 -0
- data/lib/antlr4/runtime/vocabulary_impl.rb +82 -0
- data/lib/antlr4/runtime/wildcard_transition.rb +20 -0
- data/lib/antlr4/runtime/writable_token.rb +7 -0
- metadata +243 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
require 'antlr4/runtime/lexer'
|
|
2
|
+
|
|
3
|
+
module Antlr4::Runtime
|
|
4
|
+
|
|
5
|
+
class IntervalSet
|
|
6
|
+
attr_accessor :intervals
|
|
7
|
+
|
|
8
|
+
def initialize(a = nil, b = nil)
|
|
9
|
+
@readonly = false
|
|
10
|
+
@intervals = []
|
|
11
|
+
add(a, b) unless a.nil?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.of(a, b = nil)
|
|
15
|
+
if b.nil?
|
|
16
|
+
IntervalSet.new(a)
|
|
17
|
+
else
|
|
18
|
+
IntervalSet.new(a, b)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def clear
|
|
23
|
+
raise IllegalStateException, "can't alter readonly IntervalSet" if @readonly
|
|
24
|
+
|
|
25
|
+
@intervals.clear
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def add(el1, el2 = nil)
|
|
29
|
+
raise IllegalStateException, "can't alter readonly IntervalSet" if @readonly
|
|
30
|
+
|
|
31
|
+
if el1.is_a? Interval
|
|
32
|
+
add_interval(el1)
|
|
33
|
+
elsif el2.nil?
|
|
34
|
+
add_interval(Interval.of(el1, el1))
|
|
35
|
+
else
|
|
36
|
+
add_interval(Interval.of(el1, el2))
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def add_interval(addition)
|
|
41
|
+
raise IllegalStateException, "can't alter readonly IntervalSet" if @readonly
|
|
42
|
+
|
|
43
|
+
return if addition.b < addition.a
|
|
44
|
+
|
|
45
|
+
# Find where to insert the Interval and remember where it went
|
|
46
|
+
|
|
47
|
+
i = 0 # An index into @intervals
|
|
48
|
+
while i < @intervals.length
|
|
49
|
+
r = @intervals[i]
|
|
50
|
+
return if addition == r
|
|
51
|
+
|
|
52
|
+
if addition.adjacent(r) || !addition.disjoint(r)
|
|
53
|
+
bigger = addition.union(r)
|
|
54
|
+
@intervals[i] = bigger
|
|
55
|
+
|
|
56
|
+
while i < (@intervals.length - 1)
|
|
57
|
+
i += 1
|
|
58
|
+
next_interval = @intervals[i]
|
|
59
|
+
if !bigger.adjacent(next_interval) && bigger.disjoint(next_interval)
|
|
60
|
+
break
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
@intervals.delete_at i
|
|
64
|
+
i -= 1
|
|
65
|
+
@intervals[i] = bigger.union(next_interval)
|
|
66
|
+
end
|
|
67
|
+
return
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if addition.starts_before_disjoint r
|
|
71
|
+
@intervals.insert(i, addition)
|
|
72
|
+
return
|
|
73
|
+
end
|
|
74
|
+
i += 1
|
|
75
|
+
end
|
|
76
|
+
@intervals << addition
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def or_sets(sets)
|
|
80
|
+
r = IntervalSet.new
|
|
81
|
+
i = 0
|
|
82
|
+
while i < sets.length
|
|
83
|
+
r.add_all(sets[i])
|
|
84
|
+
i += 1
|
|
85
|
+
end
|
|
86
|
+
r
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def add_all(set)
|
|
90
|
+
return this if set.nil?
|
|
91
|
+
|
|
92
|
+
if set.is_a? IntervalSet
|
|
93
|
+
other = set
|
|
94
|
+
|
|
95
|
+
n = other.intervals.length
|
|
96
|
+
i = 0
|
|
97
|
+
while i < n
|
|
98
|
+
interval = other.intervals[i]
|
|
99
|
+
add(interval.a, interval.b)
|
|
100
|
+
i += 1
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
i = 0
|
|
104
|
+
list = set.to_list
|
|
105
|
+
while i < list.length
|
|
106
|
+
add(list[i])
|
|
107
|
+
i += 1
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
self
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def complement(min_element, max_element)
|
|
115
|
+
complement_interval_set(IntervalSet.of(min_element, max_element))
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def complement_interval_set(vocabulary)
|
|
119
|
+
if vocabulary.nil? || vocabulary.is_nil
|
|
120
|
+
return nil # nothing in common with nil set
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
vocabularyIS = nil
|
|
124
|
+
if vocabulary.is_a? IntervalSet
|
|
125
|
+
vocabularyIS = vocabulary
|
|
126
|
+
else
|
|
127
|
+
vocabularyIS = IntervalSet.new
|
|
128
|
+
vocabularyIS.add_all(vocabulary)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
vocabularyIS.subtract(self)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def subtract(a)
|
|
135
|
+
return IntervalSet.new self if a.nil? || a.is_nil
|
|
136
|
+
|
|
137
|
+
return subtract_interval_sets(self, a) if a.is_a? IntervalSet
|
|
138
|
+
|
|
139
|
+
other = IntervalSet.new
|
|
140
|
+
other.add_all(a)
|
|
141
|
+
subtract_interval_sets(self, other)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def subtract_interval_sets(left, right)
|
|
145
|
+
return new IntervalSet if left.nil? || left.is_nil
|
|
146
|
+
|
|
147
|
+
result = IntervalSet.new(left)
|
|
148
|
+
return result if right.nil? || right.is_nil
|
|
149
|
+
|
|
150
|
+
result_i = 0
|
|
151
|
+
right_i = 0
|
|
152
|
+
while result_i < result.intervals.length && right_i < right.intervals.length
|
|
153
|
+
result_interval = result.intervals[result_i]
|
|
154
|
+
right_interval = right.intervals[right_i]
|
|
155
|
+
|
|
156
|
+
if right_interval.b < result_interval.a
|
|
157
|
+
right_i += 1
|
|
158
|
+
next
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
if right_interval.a > result_interval.b
|
|
162
|
+
result_i += 1
|
|
163
|
+
next
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
before_current = nil
|
|
167
|
+
after_current = nil
|
|
168
|
+
if right_interval.a > result_interval.a
|
|
169
|
+
before_current = Interval.new(result_interval.a, right_interval.a - 1)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
if right_interval.b < result_interval.b
|
|
173
|
+
after_current = Interval.new(right_interval.b + 1, result_interval.b)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
if !before_current.nil?
|
|
177
|
+
if !after_current.nil?
|
|
178
|
+
# split the current interval into two
|
|
179
|
+
result.intervals.set(result_i, before_current)
|
|
180
|
+
result.intervals.add(result_i + 1, after_current)
|
|
181
|
+
result_i += 1
|
|
182
|
+
right_i += 1
|
|
183
|
+
next
|
|
184
|
+
else # replace the current interval
|
|
185
|
+
result.intervals.set(result_i, before_current)
|
|
186
|
+
result_i += 1
|
|
187
|
+
next
|
|
188
|
+
end
|
|
189
|
+
else
|
|
190
|
+
if !after_current.nil?
|
|
191
|
+
result.intervals.set(result_i, after_current)
|
|
192
|
+
right_i += 1
|
|
193
|
+
next
|
|
194
|
+
else
|
|
195
|
+
result.intervals.remove(result_i)
|
|
196
|
+
next
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
result
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def or_list(a)
|
|
205
|
+
o = IntervalSet.new
|
|
206
|
+
o.add_all(self)
|
|
207
|
+
o.add_all(a)
|
|
208
|
+
o
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def and(other)
|
|
212
|
+
if other.nil? # || !(other.is_a? IntervalSet) )
|
|
213
|
+
return nil # nothing in common with nil set
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
my_intervals = @intervals
|
|
217
|
+
their_intervals = other.intervals
|
|
218
|
+
intersection = nil
|
|
219
|
+
my_size = my_intervals.length
|
|
220
|
+
their_size = their_intervals.length
|
|
221
|
+
i = 0
|
|
222
|
+
j = 0
|
|
223
|
+
|
|
224
|
+
while i < my_size && j < their_size
|
|
225
|
+
mine = my_intervals[i]
|
|
226
|
+
theirs = their_intervals[j]
|
|
227
|
+
# System.out.println("mine="+mine+" and theirs="+theirs)
|
|
228
|
+
if mine.starts_before_disjoint(theirs)
|
|
229
|
+
# move this iterator looking for interval that might overlap
|
|
230
|
+
i += 1
|
|
231
|
+
elsif theirs.starts_before_disjoint(mine)
|
|
232
|
+
# move other iterator looking for interval that might overlap
|
|
233
|
+
j += 1
|
|
234
|
+
elsif mine.properlyContains(theirs)
|
|
235
|
+
# overlap, add intersection, get next theirs
|
|
236
|
+
intersection = IntervalSet.new if intersection.nil?
|
|
237
|
+
intersection.add(mine.intersection(theirs))
|
|
238
|
+
j += 1
|
|
239
|
+
elsif theirs.properlyContains(mine)
|
|
240
|
+
# overlap, add intersection, get next mine
|
|
241
|
+
intersection = IntervalSet.new if intersection.nil?
|
|
242
|
+
intersection.add(mine.intersection(theirs))
|
|
243
|
+
i += 1
|
|
244
|
+
elsif !mine.disjoint(theirs)
|
|
245
|
+
# overlap, add intersection
|
|
246
|
+
intersection = IntervalSet.new if intersection.nil?
|
|
247
|
+
intersection.add(mine.intersection(theirs))
|
|
248
|
+
# Move the iterator of lower range [a..b], but not
|
|
249
|
+
# the upper range as it may contain elements that will collide
|
|
250
|
+
# with the next iterator. So, if mine=[0..115] and
|
|
251
|
+
# theirs=[115..200], then intersection is 115 and move mine
|
|
252
|
+
# but not theirs as theirs may collide with the next range
|
|
253
|
+
# in thisIter.
|
|
254
|
+
# move both iterators to next ranges
|
|
255
|
+
if mine.startsAfterNonDisjoint(theirs)
|
|
256
|
+
j += 1
|
|
257
|
+
elsif theirs.startsAfterNonDisjoint(mine)
|
|
258
|
+
i += 1
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
return IntervalSet.new if intersection.nil?
|
|
263
|
+
|
|
264
|
+
intersection
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def contains(el)
|
|
268
|
+
n = @intervals.length
|
|
269
|
+
l = 0
|
|
270
|
+
r = n - 1
|
|
271
|
+
# Binary search for the element in the (sorted,
|
|
272
|
+
# disjoint) array of @intervals.
|
|
273
|
+
while l <= r
|
|
274
|
+
m = (l + r) / 2
|
|
275
|
+
interval = @intervals[m]
|
|
276
|
+
a = interval.a
|
|
277
|
+
b = interval.b
|
|
278
|
+
if b < el
|
|
279
|
+
l = m + 1
|
|
280
|
+
elsif a > el
|
|
281
|
+
r = m - 1
|
|
282
|
+
else # el >= a && el <= b
|
|
283
|
+
return true
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
false
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def is_nil
|
|
290
|
+
@intervals.nil? || @intervals.empty?
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def max_element
|
|
294
|
+
raise StandardEror, 'set is empty' if is_nil
|
|
295
|
+
|
|
296
|
+
last = @intervals[-1]
|
|
297
|
+
last.b
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def min_element
|
|
301
|
+
raise StandardEror, 'set is empty' if is_nil
|
|
302
|
+
|
|
303
|
+
@intervals[0].a
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def hash
|
|
307
|
+
ints = []
|
|
308
|
+
i = 0
|
|
309
|
+
while i < @intervals.length
|
|
310
|
+
interval = @intervals[i]
|
|
311
|
+
ints << interval.a
|
|
312
|
+
ints << interval.b
|
|
313
|
+
i += 1
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
hash_code = MurmurHash.hash_ints(ints)
|
|
317
|
+
|
|
318
|
+
if !@_hash.nil?
|
|
319
|
+
if hash_code == @_hash
|
|
320
|
+
puts 'Same hash_code for IntervalSet'
|
|
321
|
+
else
|
|
322
|
+
puts 'Different hash_code for IntervalSet'
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
@_hash = hash_code
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def ==(obj)
|
|
329
|
+
return false if obj.nil? || !(obj.is_a? IntervalSet)
|
|
330
|
+
|
|
331
|
+
other = obj
|
|
332
|
+
@intervals == other.intervals
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def to_string(elem_are_char = false)
|
|
336
|
+
buf = ''
|
|
337
|
+
return 'end' if @intervals.nil? || @intervals.empty?
|
|
338
|
+
|
|
339
|
+
buf << '' if size > 1
|
|
340
|
+
|
|
341
|
+
i = 0
|
|
342
|
+
while i < @intervals.length
|
|
343
|
+
interval = @intervals[i]
|
|
344
|
+
a = interval.a
|
|
345
|
+
b = interval.b
|
|
346
|
+
if a == b
|
|
347
|
+
if a == Token::EOF
|
|
348
|
+
buf << '<EOF>'
|
|
349
|
+
elsif elem_are_char
|
|
350
|
+
buf << "'" << a << "'"
|
|
351
|
+
else
|
|
352
|
+
buf << a
|
|
353
|
+
end
|
|
354
|
+
else
|
|
355
|
+
if elem_are_char
|
|
356
|
+
buf << "'" << a << "'..'" << b << "'"
|
|
357
|
+
else
|
|
358
|
+
buf << a << '..' << b
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
buf << ', ' if i < @intervals.length
|
|
362
|
+
i += 1
|
|
363
|
+
end
|
|
364
|
+
buf << 'end' if size > 1
|
|
365
|
+
buf
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
# def toString(tokenNames)
|
|
369
|
+
# return toString(VocabularyImpl.fromTokenNames(tokenNames))
|
|
370
|
+
# end
|
|
371
|
+
|
|
372
|
+
def to_string_from_vocabulary(vocabulary)
|
|
373
|
+
buf = ''
|
|
374
|
+
return 'end' if @intervals.nil? || @intervals.empty?
|
|
375
|
+
|
|
376
|
+
buf << '' if size > 1
|
|
377
|
+
i = 0
|
|
378
|
+
while i < @intervals.length
|
|
379
|
+
interval = @intervals[i]
|
|
380
|
+
a = interval.a
|
|
381
|
+
b = interval.b
|
|
382
|
+
if a == b
|
|
383
|
+
buf << element_name_in_vocabulary(vocabulary, a)
|
|
384
|
+
else
|
|
385
|
+
j = a
|
|
386
|
+
while j <= b
|
|
387
|
+
buf << ', ' if j > a
|
|
388
|
+
buf << element_name_in_vocabulary(vocabulary, j)
|
|
389
|
+
j += 1
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
buf << ', ' if i < @intervals.length
|
|
393
|
+
i += 1
|
|
394
|
+
end
|
|
395
|
+
buf << 'end' if size > 1
|
|
396
|
+
buf
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
def element_name_in_vocabulary(vocabulary, a)
|
|
400
|
+
if a == Token::EOF
|
|
401
|
+
'<EOF>'
|
|
402
|
+
elsif a == Token::EPSILON
|
|
403
|
+
'<EPSILON>'
|
|
404
|
+
else
|
|
405
|
+
vocabulary.display_name(a)
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
def size
|
|
410
|
+
n = 0
|
|
411
|
+
num_intervals = @intervals.length
|
|
412
|
+
if num_intervals == 1
|
|
413
|
+
first_interval = @intervals[0]
|
|
414
|
+
return first_interval.b - first_interval.a + 1
|
|
415
|
+
end
|
|
416
|
+
i = 0
|
|
417
|
+
while i < num_intervals
|
|
418
|
+
interval = @intervals[i]
|
|
419
|
+
n += (interval.b - interval.a + 1)
|
|
420
|
+
i += 1
|
|
421
|
+
end
|
|
422
|
+
n
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
def to_integer_list
|
|
426
|
+
values = IntegerList.new
|
|
427
|
+
n = @intervals.length
|
|
428
|
+
i = 0
|
|
429
|
+
while i < n
|
|
430
|
+
interval = @intervals[i]
|
|
431
|
+
a = interval.a
|
|
432
|
+
b = interval.b
|
|
433
|
+
v = a
|
|
434
|
+
while v <= b
|
|
435
|
+
values.add(v)
|
|
436
|
+
v += 1
|
|
437
|
+
end
|
|
438
|
+
i += 1
|
|
439
|
+
end
|
|
440
|
+
values
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
def to_list
|
|
444
|
+
to_integer_list
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
def to_set
|
|
448
|
+
s = Set.new
|
|
449
|
+
k = 0
|
|
450
|
+
while k < @intervals.length
|
|
451
|
+
i = @intervals[k]
|
|
452
|
+
a = i.a
|
|
453
|
+
b = i.b
|
|
454
|
+
v = a
|
|
455
|
+
while v <= b
|
|
456
|
+
s.add(v)
|
|
457
|
+
v += 1
|
|
458
|
+
end
|
|
459
|
+
k += 1
|
|
460
|
+
end
|
|
461
|
+
s
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
def get(i)
|
|
465
|
+
n = @intervals.length
|
|
466
|
+
index = 0
|
|
467
|
+
j = 0
|
|
468
|
+
while j < n
|
|
469
|
+
interval = @intervals[j]
|
|
470
|
+
a = interval.a
|
|
471
|
+
b = interval.b
|
|
472
|
+
v = a
|
|
473
|
+
while v <= b
|
|
474
|
+
return v if index == i
|
|
475
|
+
|
|
476
|
+
index += 1
|
|
477
|
+
v += 1
|
|
478
|
+
end
|
|
479
|
+
j += 1
|
|
480
|
+
end
|
|
481
|
+
-1
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
def to_a
|
|
485
|
+
to_integer_list
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
def remove(el)
|
|
489
|
+
raise IllegalStateException, "can't alter readonly IntervalSet" if @readonly
|
|
490
|
+
|
|
491
|
+
n = @intervals.length
|
|
492
|
+
i = 0
|
|
493
|
+
while i < n
|
|
494
|
+
interval = @intervals[i]
|
|
495
|
+
a = interval.a
|
|
496
|
+
b = interval.b
|
|
497
|
+
if el < a
|
|
498
|
+
break # list is sorted and el is before this interval not here
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
# if whole interval x..x, rm
|
|
502
|
+
if el == a && el == b
|
|
503
|
+
@intervals.delete_at(i)
|
|
504
|
+
break
|
|
505
|
+
end
|
|
506
|
+
# if on left edge x..b, adjust left
|
|
507
|
+
if el == a
|
|
508
|
+
interval.a += 1
|
|
509
|
+
break
|
|
510
|
+
end
|
|
511
|
+
# if on right edge a..x, adjust right
|
|
512
|
+
if el == b
|
|
513
|
+
interval.b -= 1
|
|
514
|
+
break
|
|
515
|
+
end
|
|
516
|
+
# if in middle a..x..b, split interval
|
|
517
|
+
if el > a && el < b # found in this interval
|
|
518
|
+
int oldb = interval.b
|
|
519
|
+
interval.b = el - 1 # [a..x-1]
|
|
520
|
+
add(el + 1, oldb) # add [x+1..b]
|
|
521
|
+
end
|
|
522
|
+
i += 1
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
def readonly(readonly)
|
|
527
|
+
if @readonly && !readonly
|
|
528
|
+
raise IllegalStateException, "can't alter readonly IntervalSet"
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
@readonly = readonly
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
@@complete_char_set = IntervalSet.of(Lexer::MIN_CHAR_VALUE, Lexer::MAX_CHAR_VALUE)
|
|
535
|
+
@@complete_char_set.readonly(true)
|
|
536
|
+
|
|
537
|
+
@@empty_set = IntervalSet.new
|
|
538
|
+
@@empty_set.readonly(true)
|
|
539
|
+
end
|
|
540
|
+
end
|