antlr4 0.9.2

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 (64) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +27 -0
  3. data/README.md +46 -0
  4. data/lib/antlr4.rb +262 -0
  5. data/lib/antlr4/BufferedTokenStream.rb +306 -0
  6. data/lib/antlr4/CommonTokenFactory.rb +53 -0
  7. data/lib/antlr4/CommonTokenStream.rb +56 -0
  8. data/lib/antlr4/FileStream.rb +14 -0
  9. data/lib/antlr4/InputStream.rb +82 -0
  10. data/lib/antlr4/IntervalSet.rb +341 -0
  11. data/lib/antlr4/LL1Analyzer.rb +177 -0
  12. data/lib/antlr4/Lexer.rb +335 -0
  13. data/lib/antlr4/ListTokenSource.rb +140 -0
  14. data/lib/antlr4/Parser.rb +562 -0
  15. data/lib/antlr4/ParserInterpreter.rb +149 -0
  16. data/lib/antlr4/ParserRuleContext.rb +162 -0
  17. data/lib/antlr4/PredictionContext.rb +690 -0
  18. data/lib/antlr4/Recognizer.rb +162 -0
  19. data/lib/antlr4/RuleContext.rb +226 -0
  20. data/lib/antlr4/Token.rb +124 -0
  21. data/lib/antlr4/TokenFactory.rb +3 -0
  22. data/lib/antlr4/TokenSource.rb +4 -0
  23. data/lib/antlr4/TokenStream.rb +3 -0
  24. data/lib/antlr4/TraceListener.rb +23 -0
  25. data/lib/antlr4/atn/ATN.rb +133 -0
  26. data/lib/antlr4/atn/ATNConfig.rb +146 -0
  27. data/lib/antlr4/atn/ATNConfigSet.rb +215 -0
  28. data/lib/antlr4/atn/ATNDeserializationOptions.rb +62 -0
  29. data/lib/antlr4/atn/ATNDeserializer.rb +604 -0
  30. data/lib/antlr4/atn/ATNSimulator.rb +43 -0
  31. data/lib/antlr4/atn/ATNState.rb +253 -0
  32. data/lib/antlr4/atn/ATNType.rb +22 -0
  33. data/lib/antlr4/atn/LexerATNSimulator.rb +612 -0
  34. data/lib/antlr4/atn/LexerAction.rb +311 -0
  35. data/lib/antlr4/atn/LexerActionExecutor.rb +134 -0
  36. data/lib/antlr4/atn/ParserATNSimulator.rb +1622 -0
  37. data/lib/antlr4/atn/PredictionMode.rb +525 -0
  38. data/lib/antlr4/atn/SemanticContext.rb +355 -0
  39. data/lib/antlr4/atn/Transition.rb +297 -0
  40. data/lib/antlr4/base.rb +60 -0
  41. data/lib/antlr4/dfa/DFA.rb +128 -0
  42. data/lib/antlr4/dfa/DFASerializer.rb +77 -0
  43. data/lib/antlr4/dfa/DFAState.rb +133 -0
  44. data/lib/antlr4/error.rb +151 -0
  45. data/lib/antlr4/error/DiagnosticErrorListener.rb +136 -0
  46. data/lib/antlr4/error/ErrorListener.rb +109 -0
  47. data/lib/antlr4/error/ErrorStrategy.rb +742 -0
  48. data/lib/antlr4/tree/Chunk.rb +31 -0
  49. data/lib/antlr4/tree/ParseTreeMatch.rb +105 -0
  50. data/lib/antlr4/tree/ParseTreePattern.rb +70 -0
  51. data/lib/antlr4/tree/ParseTreePatternMatcher.rb +334 -0
  52. data/lib/antlr4/tree/RuleTagToken.rb +39 -0
  53. data/lib/antlr4/tree/TokenTagToken.rb +38 -0
  54. data/lib/antlr4/tree/Tree.rb +204 -0
  55. data/lib/antlr4/tree/Trees.rb +111 -0
  56. data/lib/antlr4/version.rb +5 -0
  57. data/lib/antlr4/xpath/XPath.rb +354 -0
  58. data/lib/double_key_map.rb +78 -0
  59. data/lib/java_symbols.rb +24 -0
  60. data/lib/uuid.rb +87 -0
  61. data/test/test_intervalset.rb +664 -0
  62. data/test/test_tree.rb +140 -0
  63. data/test/test_uuid.rb +122 -0
  64. metadata +109 -0
@@ -0,0 +1,78 @@
1
+ # [The "BSD license"]
2
+ # Copyright (c) 2012 Terence Parr
3
+ # Copyright (c) 2012 Sam Harwell
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions
8
+ # are met:
9
+ #
10
+ # 1. Redistributions of source code must retain the above copyright
11
+ # notice, this list of conditions and the following disclaimer.
12
+ # 2. Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ # 3. The name of the author may not be used to endorse or promote products
16
+ # derived from this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
+ # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
+ # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
+ # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
+ # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ #
29
+
30
+ # Sometimes we need to map a key to a value but key is two pieces of data.
31
+ # This nested hash table saves creating a single key each time we access
32
+ # map; avoids mem creation.
33
+ class DoubleKeyMap
34
+
35
+ def initialize
36
+ # Map<Key1, Map<Key2, Value>> data = new LinkedHashMap<Key1, Map<Key2, Value>>();
37
+ @data = Hash.new
38
+ end
39
+
40
+ def put(k1, k2, v)
41
+ data2 = @data.get(k1)
42
+ prev = nil
43
+ if data2.nil? then
44
+ data2 = Hash.new
45
+ @data[k1] = data2
46
+ else
47
+ prev = data2[k2]
48
+ end
49
+ data2[k2] = v
50
+ return prev;
51
+ end
52
+
53
+ def get(k1, k2=nil)
54
+ data2 = @data[k1]
55
+ return nil if data2.nil?
56
+ if k2.nil? then
57
+ data2
58
+ else
59
+ data2[k2]
60
+ end
61
+ end
62
+
63
+ # /** Get all values associated with primary key */
64
+ def values(k1)
65
+ data2 = @data[k1]
66
+ return nil if data2.nil?
67
+ data2.values();
68
+ end
69
+
70
+ # /** get all secondary keys associated with a primary key */
71
+ def keySet(k1=nil)
72
+ # /** get all primary keys
73
+ return @data.keys if k1.nil?
74
+ data2 = @data[k1]
75
+ return nil if data2.nil?
76
+ data2.keys
77
+ end
78
+ end
@@ -0,0 +1,24 @@
1
+ module JavaSymbols
2
+ def self.included(klass)
3
+ klass.send(:extend, JavaSymbols::ClassMethods)
4
+ klass.send(:include, JavaSymbols::Methods)
5
+ end
6
+ module Methods
7
+ alias_method :old_method_missing, :method_missing
8
+ def method_missing(name, *args)
9
+ if self.class.const_defined?(name) then
10
+ return self.class.const_get(name)
11
+ end
12
+ old_method_missing(name, args)
13
+ end
14
+ end
15
+ module ClassMethods
16
+ alias_method :old_method_missing, :method_missing
17
+ def method_missing(name, *args)
18
+ if const_defined?(name) then
19
+ return const_get(name)
20
+ end
21
+ old_method_missing(name, args)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,87 @@
1
+
2
+ # from uuid import UUID
3
+
4
+ # BASE_SERIALIZED_UUID = UUID("AADB8D7E-AEEF-4415-AD2B-8204D6CF042E")
5
+
6
+ # Three inputs
7
+ # a UUID 'string' of hexdigits and - {}
8
+ # a URN prefixed UUID string
9
+ # a IO input of bytes as a string
10
+ # an array of bytes/numbers
11
+ # a single int
12
+
13
+ class UUID
14
+
15
+ attr_accessor :byte_array, :value
16
+ attr :uuid_fmt_32, :uuid_fmt_16
17
+ def initialize(uuid)
18
+ @uuid_fmt_32 = "#{'%x' * 8}#{'-%x%x%x%x'*3}-#{'%x'*12}"
19
+ @uuid_fmt_16 = "#{'%02x' * 4}#{'-%02x%02x'*3}-#{'%02x'*6}"
20
+ case uuid
21
+ when String
22
+ if uuid =~ /^urn:/ then
23
+ # assume urn input
24
+ @value = UUID.create_from_uuid_string(uuid.sub('urn:',''))
25
+ elsif uuid.length > 31 and uuid =~ /^[-0-9a-fA-F{}]+$/
26
+ # uuid input syntax
27
+ @value= UUID.create_from_uuid_string(uuid)
28
+ else
29
+ raise Exception.new("Fail to create uuid from string:#{uuid}")
30
+ end
31
+ when Bignum
32
+ @value = uuid
33
+ when Fixnum
34
+ @value = uuid
35
+ else
36
+ raise Exception.new("Fail to create uuid: #{uuid.class}:#{uuid}")
37
+ end
38
+ end
39
+ def self.create_from_uuid_string(uuid)
40
+ hexstring = uuid.tr('{}-','').downcase
41
+ hexstring.chars.map(&:hex).reduce(0) {|a,b|( (a << 4)|b ) }
42
+ end
43
+ def self.create_from_bytes(input)
44
+ case input
45
+ when String
46
+ byte_string = input.chars
47
+ when Bignum
48
+ hexstring = input
49
+ when Fixnum
50
+ hexstring = input
51
+ when Array
52
+ byte_string = input
53
+ end
54
+ unless byte_string.nil?
55
+ hexstring = byte_string.reduce(0) {|a,b| a << 8| b.ord }
56
+ end
57
+ new(hexstring)
58
+ end
59
+ def bytes
60
+ bytes_array.pack('C*')
61
+ end
62
+ def bytes_array(conversion=:self)
63
+ (0..127).step(8).map {|s|
64
+ if conversion == :self then
65
+ value_byte(s)
66
+ else
67
+ value_byte(s).send(conversion)
68
+ end
69
+ }.reverse
70
+ end
71
+ def value_byte(s,mask=0xff)
72
+ (@value >> s) & mask
73
+ end
74
+ def to_i
75
+ value
76
+ end
77
+ def to_s
78
+ uuid_fmt_16 % bytes_array()
79
+ end
80
+ def eql?(other)
81
+ self == other
82
+ end
83
+ def ==(other)
84
+ self.equal?(other) or (other.kind_of?(UUID) and self.value == other.value )
85
+ end
86
+ end
87
+
@@ -0,0 +1,664 @@
1
+
2
+ require 'test/unit'
3
+
4
+ # $: << 'lib'
5
+ require 'antlr4'
6
+ # require 'IntervalSet'
7
+
8
+ class IntervalSetTest < Test::Unit::TestCase
9
+
10
+ def setup()
11
+ end
12
+ def teardown
13
+ end
14
+
15
+ def test_create
16
+ n = IntervalSet.new
17
+ assert_not_nil n
18
+ assert_not_nil n.intervals
19
+ assert n.intervals.class == Array , "intervals is not an array "
20
+ assert n.intervals.empty? == true, "intervals is not empty #{n.intervals.inspect}"
21
+ assert n.readonly == false
22
+ assert_not_nil n._internal
23
+ assert n._internal.class == Set
24
+ end
25
+
26
+ def test_range_new
27
+ r = Range.new(100,200)
28
+ assert_not_nil r
29
+ assert r.first == r.start, "Range.start fail"
30
+ assert r.last == r.stop , "Range.stop fail"
31
+ assert r.size == r.length, "Ranage.length fail"
32
+ end
33
+ def test_intervals
34
+ # def_delegators :@intervals, :each, :map
35
+ assert true
36
+ end
37
+ # def []=(item)
38
+ # @_internal[item]
39
+ # end
40
+ def test_add
41
+ n = IntervalSet.new
42
+ assert n.addOne(2) ,"addOne Fail"
43
+ assert n.length == 1 , "addOne Fail length"
44
+
45
+ assert_nil n.addRange(Range.new(1,1)) , "addRange fail"
46
+ assert_equal 2, n.length, 'addRange fail length'
47
+ assert_nil n.addRange(Range.new(1,5)) , "addRange fail"
48
+ assert_equal (5-1+1), n.length, 'addRange fail length'
49
+ end
50
+ def test_addset
51
+ n1 = IntervalSet.new
52
+ assert_not_nil n1
53
+ assert n1.addOne(10)
54
+ n2 = IntervalSet.new
55
+ assert n2.addOne(20)
56
+ assert n1.length == n2.length, "inital lengths failed"
57
+ assert n2.addSet(n1)
58
+ assert n2.length == 2, "addSet failed to increase length"
59
+ end
60
+ def test_reduce
61
+ n = IntervalSet.new
62
+ assert_nil n.reduce(1), "reduce fail on empty"
63
+ n.addOne(1)
64
+ n.addOne(2)
65
+ assert_nil n.reduce(2), "reduce fail on non-empt"
66
+ end
67
+ def test_member
68
+ n = IntervalSet.new
69
+ assert n.member?(1) == false, "member? fast check fails does not exist"
70
+ n.addOne(1)
71
+ assert n.member?(1) , "member? does not exist"
72
+ assert_equal false, n.member?(2), "member? does exist"
73
+ end
74
+ def test_length
75
+ n = IntervalSet.new
76
+ assert n.length == 0, "not empty"
77
+ n.addOne(1)
78
+ assert n.length == 1, "not exactly 1"
79
+ n.addRange(Range.new(2,3))
80
+ assert n.length == 3, "not exactly 1"
81
+ end
82
+ def test_remove
83
+ n = IntervalSet.new
84
+ assert_equal nil, n.remove(1), "empty remove fail"
85
+ n.addOne(1)
86
+ assert_nil n.remove(1), "1 remove fail"
87
+ end
88
+ def test_toString
89
+ n = IntervalSet.new
90
+ assert_equal "{}", n.toString([]) , "empty toString fail"
91
+ token_names = ['zero','one','two']
92
+ n.addOne(1)
93
+ n.addOne(2)
94
+ assert_equal '{one, two}', n.toString(token_names)
95
+
96
+ end
97
+ def test_elementname
98
+ n = IntervalSet.new
99
+ assert n.elementName([],Token.EOF) == "<EOF>"
100
+ assert n.elementName([],Token.EPSILON) == "<EPSILON>"
101
+ a = Array.new
102
+ a[100] = "XXX"
103
+ assert n.elementName(a, 100) == "XXX"
104
+ end
105
+ def test_empty
106
+ n = IntervalSet.new
107
+ assert_equal false, n.member?(30)
108
+ assert n.intervals.empty?
109
+ end
110
+ def test_one
111
+ s = IntervalSet.new()
112
+ s.addOne(30)
113
+ assert s.member? 30
114
+ assert_equal false,s.member?(29)
115
+ assert_equal false,s.member?(31)
116
+ end
117
+ def test_two
118
+ s = IntervalSet.new
119
+ s.addOne(30)
120
+ s.addOne(40)
121
+ assert s.member? 30
122
+ assert s.member? 40
123
+ assert_equal false, s.member?(35)
124
+ end
125
+ def test_three
126
+ s = IntervalSet.new
127
+ s.addRange(Range.new(30,41))
128
+ assert s.member? 30
129
+ assert s.member? 40
130
+ assert s.member? 35
131
+ assert_equal false, s.member?(29)
132
+ assert_equal false, s.member?(42)
133
+ end
134
+
135
+ def test_distinct1
136
+ s = IntervalSet.new
137
+ r1 = Range.new(30,32)
138
+ r2 = Range.new(40,42)
139
+ s.addRange(r1)
140
+ s.addRange(r2)
141
+ assert_equal 2, s.intervals.length
142
+ assert_equal 6, s.length
143
+ r1.each{|val| assert s.member?(val), "r1,#{val}"}
144
+ r2.each{|val| assert s.member?(val), "r2,#{val}"}
145
+ [r1,r2].each do |r|
146
+ assert_equal false, s.member?(r.start-1)
147
+ assert_equal false, s.member?(r.stop+1)
148
+ end
149
+ end
150
+ def test_distinct2
151
+ s = IntervalSet.new
152
+ r1 = Range.new(30,32)
153
+ r2 = Range.new(40,42)
154
+ s.addRange(r2)
155
+ s.addRange(r1)
156
+ assert_equal 2, s.intervals.length
157
+ assert_equal 6, s.length
158
+ assert s.member? 30
159
+ assert s.member? 40
160
+ assert_equal false, s.member?(35)
161
+ r1.each{|val| assert s.member?(val) }
162
+ r2.each{|val| assert s.member?(val) }
163
+ [r1,r2].each do |r|
164
+ assert_equal false, s.member?(r.start-1)
165
+ assert_equal false, s.member?(r.stop+1)
166
+ end
167
+ end
168
+ def test_contiguous1
169
+ s = IntervalSet.new
170
+ r1 = Range.new(30,36)
171
+ r2 = Range.new(36,41)
172
+ s.addRange(r1)
173
+ s.addRange(r2)
174
+ assert_equal 1, s.intervals.length
175
+ assert_equal 12, s.length
176
+ r1.each{|val| assert s.member?(val), "test_contiguous:r1:#{val}" }
177
+ r2.each{|val| assert s.member?(val), "test_contiguous:r2:#{val}" }
178
+ assert_equal false, s.member?(r1.start-1)
179
+ assert_equal false, s.member?(r2.stop+1)
180
+ end
181
+ def test_contiguous2
182
+ s = IntervalSet.new
183
+ r1 = Range.new(30,36)
184
+ r2 = Range.new(36,41)
185
+ s.addRange(r2)
186
+ s.addRange(r1)
187
+ assert_equal 1, s.intervals.length, "not only 1 interval"
188
+ r1.each{|val| assert s.member?(val), "test_contiguous:r1:#{val}" }
189
+ r2.each{|val| assert s.member?(val), "test_contiguous:r2:#{val}" }
190
+ assert_equal false, s.member?(r1.start-1)
191
+ assert_equal false, s.member?(r2.stop+1)
192
+ end
193
+ def test_overlapping1
194
+ s = IntervalSet.new
195
+ r1 = Range.new(30,40)
196
+ r2 = Range.new(35,45)
197
+ s.addRange(r1)
198
+ s.addRange(r2)
199
+ assert_equal 1, s.intervals.length
200
+ assert s.member? 30
201
+ assert s.member? 44
202
+ r1.each{|val| assert s.member?(val), "test_overlapping:r1:#{val}" }
203
+ r2.each{|val| assert s.member?(val), "test_overlapping:r2:#{val}" }
204
+ assert_equal false, s.member?([r1.start,r2.start].min-1)
205
+ assert_equal false, s.member?([r1.stop,r2.stop].max+1)
206
+ end
207
+
208
+ def test_overlapping2
209
+ s = IntervalSet.new
210
+ r1 = Range.new(30,40)
211
+ r2 = Range.new(35,45)
212
+ s.addRange(r2)
213
+ s.addRange(r1)
214
+ assert_equal 1, s.intervals.length
215
+ assert s.member? 30
216
+ assert s.member? 44
217
+ r1.each{|val| assert s.member?(val), "test_overlapping:r1:#{val}" }
218
+ r2.each{|val| assert s.member?(val), "test_overlapping:r2:#{val}" }
219
+ assert_equal false, s.member?([r1.start,r2.start].min-1)
220
+ assert_equal false, s.member?([r1.stop,r2.stop].max+1)
221
+ end
222
+
223
+ def test_overlapping3
224
+ s = IntervalSet.new
225
+ r1 = Range.new(30,32)
226
+ r2 = Range.new(40,42)
227
+ r3 = Range.new(50,52)
228
+ r4 = Range.new(20,61)
229
+
230
+ s.addRange(r1)
231
+ s.addRange(r2)
232
+ s.addRange(r3)
233
+ s.addRange(r4)
234
+ assert_equal 1, s.intervals.length
235
+ assert s.member? 20
236
+ assert s.member? 60
237
+ allranges = [r1,r2,r3,r4]
238
+ allranges.zip([:r1,:r2,:r3,:r4]).each do |r,label|
239
+ r.each{|val| assert s.member?(val), "test_overlapping:#{label}:#{val}" }
240
+ end
241
+
242
+ lower= allranges.map{|r| r.start }.min
243
+ upper= allranges.map{|r| r.stop }.max
244
+ assert_equal false, s.member?(lower-1)
245
+ assert_equal false, s.member?(upper+1)
246
+
247
+ end
248
+ def test_complement
249
+ s = IntervalSet.new
250
+ assert_not_nil s
251
+ t = IntervalSet.new
252
+ assert_not_nil t
253
+ t.addRange(0..15)
254
+ assert s.complement(t), "complement failed"
255
+ end
256
+
257
+ def test_SingleElement
258
+ s = IntervalSet.of(99)
259
+ expecting = "99";
260
+ assert_equal s.toString, expecting
261
+ end
262
+
263
+ # def test_min
264
+ # assertEquals(0, IntervalSet.COMPLETE_CHAR_SET.getMinElement());
265
+ # assertEquals(Token.EPSILON, IntervalSet.COMPLETE_CHAR_SET.or(IntervalSet.of(Token.EPSILON)).getMinElement());
266
+ # assertEquals(Token.EOF, IntervalSet.COMPLETE_CHAR_SET.or(IntervalSet.of(Token.EOF)).getMinElement());
267
+ # end
268
+
269
+ def test_IsolatedElements
270
+ s = IntervalSet.new
271
+ s.addOne(1)
272
+ s.addOne('z')
273
+ s.addOne('\uFFF0')
274
+ expecting = "{1, 122, 65520}"
275
+ assert_equals s.toString, expecting
276
+ end
277
+
278
+ end # End of TestCase
279
+ __END__
280
+ @Test public void testMixedRangesAndElements() throws Exception {
281
+ IntervalSet s = new IntervalSet();
282
+ s.add(1);
283
+ s.add('a','z');
284
+ s.add('0','9');
285
+ String expecting = "{1, 48..57, 97..122}";
286
+ assertEquals(s.toString(), expecting);
287
+ end
288
+
289
+ @Test public void testSimpleAnd() throws Exception {
290
+ IntervalSet s = IntervalSet.of(10,20);
291
+ IntervalSet s2 = IntervalSet.of(13,15);
292
+ String expecting = "{13..15}";
293
+ String result = (s.and(s2)).toString();
294
+ assertEquals(expecting, result);
295
+ }
296
+
297
+ @Test public void testRangeAndIsolatedElement() throws Exception {
298
+ IntervalSet s = IntervalSet.of('a','z');
299
+ IntervalSet s2 = IntervalSet.of('d');
300
+ String expecting = "100";
301
+ String result = (s.and(s2)).toString();
302
+ assertEquals(expecting, result);
303
+ }
304
+
305
+ @Test public void testEmptyIntersection() throws Exception {
306
+ IntervalSet s = IntervalSet.of('a','z');
307
+ IntervalSet s2 = IntervalSet.of('0','9');
308
+ String expecting = "{}";
309
+ String result = (s.and(s2)).toString();
310
+ assertEquals(expecting, result);
311
+ }
312
+
313
+ @Test public void testEmptyIntersectionSingleElements() throws Exception {
314
+ IntervalSet s = IntervalSet.of('a');
315
+ IntervalSet s2 = IntervalSet.of('d');
316
+ String expecting = "{}";
317
+ String result = (s.and(s2)).toString();
318
+ assertEquals(expecting, result);
319
+ }
320
+
321
+ @Test public void testNotSingleElement() throws Exception {
322
+ IntervalSet vocabulary = IntervalSet.of(1,1000);
323
+ vocabulary.add(2000,3000);
324
+ IntervalSet s = IntervalSet.of(50,50);
325
+ String expecting = "{1..49, 51..1000, 2000..3000}";
326
+ String result = (s.complement(vocabulary)).toString();
327
+ assertEquals(expecting, result);
328
+ }
329
+
330
+ @Test public void testNotSet() throws Exception {
331
+ IntervalSet vocabulary = IntervalSet.of(1,1000);
332
+ IntervalSet s = IntervalSet.of(50,60);
333
+ s.add(5);
334
+ s.add(250,300);
335
+ String expecting = "{1..4, 6..49, 61..249, 301..1000}";
336
+ String result = (s.complement(vocabulary)).toString();
337
+ assertEquals(expecting, result);
338
+ }
339
+
340
+ @Test public void testNotEqualSet() throws Exception {
341
+ IntervalSet vocabulary = IntervalSet.of(1,1000);
342
+ IntervalSet s = IntervalSet.of(1,1000);
343
+ String expecting = "{}";
344
+ String result = (s.complement(vocabulary)).toString();
345
+ assertEquals(expecting, result);
346
+ }
347
+
348
+ @Test public void testNotSetEdgeElement() throws Exception {
349
+ IntervalSet vocabulary = IntervalSet.of(1,2);
350
+ IntervalSet s = IntervalSet.of(1);
351
+ String expecting = "2";
352
+ String result = (s.complement(vocabulary)).toString();
353
+ assertEquals(expecting, result);
354
+ }
355
+
356
+ @Test public void testNotSetFragmentedVocabulary() throws Exception {
357
+ IntervalSet vocabulary = IntervalSet.of(1,255);
358
+ vocabulary.add(1000,2000);
359
+ vocabulary.add(9999);
360
+ IntervalSet s = IntervalSet.of(50, 60);
361
+ s.add(3);
362
+ s.add(250,300);
363
+ s.add(10000); // this is outside range of vocab and should be ignored
364
+ String expecting = "{1..2, 4..49, 61..249, 1000..2000, 9999}";
365
+ String result = (s.complement(vocabulary)).toString();
366
+ assertEquals(expecting, result);
367
+ }
368
+
369
+ @Test public void testSubtractOfCompletelyContainedRange() throws Exception {
370
+ IntervalSet s = IntervalSet.of(10,20);
371
+ IntervalSet s2 = IntervalSet.of(12,15);
372
+ String expecting = "{10..11, 16..20}";
373
+ String result = (s.subtract(s2)).toString();
374
+ assertEquals(expecting, result);
375
+ }
376
+
377
+ @Test public void testSubtractFromSetWithEOF() throws Exception {
378
+ IntervalSet s = IntervalSet.of(10,20);
379
+ s.add(Token.EOF);
380
+ IntervalSet s2 = IntervalSet.of(12,15);
381
+ String expecting = "{<EOF>, 10..11, 16..20}";
382
+ String result = (s.subtract(s2)).toString();
383
+ assertEquals(expecting, result);
384
+ }
385
+
386
+ @Test public void testSubtractOfOverlappingRangeFromLeft() throws Exception {
387
+ IntervalSet s = IntervalSet.of(10,20);
388
+ IntervalSet s2 = IntervalSet.of(5,11);
389
+ String expecting = "{12..20}";
390
+ String result = (s.subtract(s2)).toString();
391
+ assertEquals(expecting, result);
392
+
393
+ IntervalSet s3 = IntervalSet.of(5,10);
394
+ expecting = "{11..20}";
395
+ result = (s.subtract(s3)).toString();
396
+ assertEquals(expecting, result);
397
+ }
398
+
399
+ @Test public void testSubtractOfOverlappingRangeFromRight() throws Exception {
400
+ IntervalSet s = IntervalSet.of(10,20);
401
+ IntervalSet s2 = IntervalSet.of(15,25);
402
+ String expecting = "{10..14}";
403
+ String result = (s.subtract(s2)).toString();
404
+ assertEquals(expecting, result);
405
+
406
+ IntervalSet s3 = IntervalSet.of(20,25);
407
+ expecting = "{10..19}";
408
+ result = (s.subtract(s3)).toString();
409
+ assertEquals(expecting, result);
410
+ }
411
+
412
+ @Test public void testSubtractOfCompletelyCoveredRange() throws Exception {
413
+ IntervalSet s = IntervalSet.of(10,20);
414
+ IntervalSet s2 = IntervalSet.of(1,25);
415
+ String expecting = "{}";
416
+ String result = (s.subtract(s2)).toString();
417
+ assertEquals(expecting, result);
418
+ }
419
+
420
+ @Test public void testSubtractOfRangeSpanningMultipleRanges() throws Exception {
421
+ IntervalSet s = IntervalSet.of(10,20);
422
+ s.add(30,40);
423
+ s.add(50,60); // s has 3 ranges now: 10..20, 30..40, 50..60
424
+ IntervalSet s2 = IntervalSet.of(5,55); // covers one and touches 2nd range
425
+ String expecting = "{56..60}";
426
+ String result = (s.subtract(s2)).toString();
427
+ assertEquals(expecting, result);
428
+
429
+ IntervalSet s3 = IntervalSet.of(15,55); // touches both
430
+ expecting = "{10..14, 56..60}";
431
+ result = (s.subtract(s3)).toString();
432
+ assertEquals(expecting, result);
433
+ }
434
+
435
+ /** The following was broken:
436
+ {0..113, 115..65534}-{0..115, 117..65534}=116..65534
437
+ */
438
+ @Test public void testSubtractOfWackyRange() throws Exception {
439
+ IntervalSet s = IntervalSet.of(0,113);
440
+ s.add(115,200);
441
+ IntervalSet s2 = IntervalSet.of(0,115);
442
+ s2.add(117,200);
443
+ String expecting = "116";
444
+ String result = (s.subtract(s2)).toString();
445
+ assertEquals(expecting, result);
446
+ }
447
+
448
+ @Test public void testSimpleEquals() throws Exception {
449
+ IntervalSet s = IntervalSet.of(10,20);
450
+ IntervalSet s2 = IntervalSet.of(10,20);
451
+ assertEquals(s, s2);
452
+
453
+ IntervalSet s3 = IntervalSet.of(15,55);
454
+ assertFalse(s.equals(s3));
455
+ }
456
+
457
+ @Test public void testEquals() throws Exception {
458
+ IntervalSet s = IntervalSet.of(10,20);
459
+ s.add(2);
460
+ s.add(499,501);
461
+ IntervalSet s2 = IntervalSet.of(10,20);
462
+ s2.add(2);
463
+ s2.add(499,501);
464
+ assertEquals(s, s2);
465
+
466
+ IntervalSet s3 = IntervalSet.of(10,20);
467
+ s3.add(2);
468
+ assertFalse(s.equals(s3));
469
+ }
470
+
471
+ @Test public void testSingleElementMinusDisjointSet() throws Exception {
472
+ IntervalSet s = IntervalSet.of(15,15);
473
+ IntervalSet s2 = IntervalSet.of(1,5);
474
+ s2.add(10,20);
475
+ String expecting = "{}"; // 15 - {1..5, 10..20} = {}
476
+ String result = s.subtract(s2).toString();
477
+ assertEquals(expecting, result);
478
+ }
479
+
480
+ @Test public void testMembership() throws Exception {
481
+ IntervalSet s = IntervalSet.of(15,15);
482
+ s.add(50,60);
483
+ assertTrue(!s.contains(0));
484
+ assertTrue(!s.contains(20));
485
+ assertTrue(!s.contains(100));
486
+ assertTrue(s.contains(15));
487
+ assertTrue(s.contains(55));
488
+ assertTrue(s.contains(50));
489
+ assertTrue(s.contains(60));
490
+ }
491
+
492
+ // {2,15,18} & 10..20
493
+ @Test public void testIntersectionWithTwoContainedElements() throws Exception {
494
+ IntervalSet s = IntervalSet.of(10,20);
495
+ IntervalSet s2 = IntervalSet.of(2,2);
496
+ s2.add(15);
497
+ s2.add(18);
498
+ String expecting = "{15, 18}";
499
+ String result = (s.and(s2)).toString();
500
+ assertEquals(expecting, result);
501
+ }
502
+
503
+ @Test public void testIntersectionWithTwoContainedElementsReversed() throws Exception {
504
+ IntervalSet s = IntervalSet.of(10,20);
505
+ IntervalSet s2 = IntervalSet.of(2,2);
506
+ s2.add(15);
507
+ s2.add(18);
508
+ String expecting = "{15, 18}";
509
+ String result = (s2.and(s)).toString();
510
+ assertEquals(expecting, result);
511
+ }
512
+
513
+ @Test public void testComplement() throws Exception {
514
+ IntervalSet s = IntervalSet.of(100,100);
515
+ s.add(101,101);
516
+ IntervalSet s2 = IntervalSet.of(100,102);
517
+ String expecting = "102";
518
+ String result = (s.complement(s2)).toString();
519
+ assertEquals(expecting, result);
520
+ }
521
+
522
+ @Test public void testComplement2() throws Exception {
523
+ IntervalSet s = IntervalSet.of(100,101);
524
+ IntervalSet s2 = IntervalSet.of(100,102);
525
+ String expecting = "102";
526
+ String result = (s.complement(s2)).toString();
527
+ assertEquals(expecting, result);
528
+ }
529
+
530
+ @Test public void testComplement3() throws Exception {
531
+ IntervalSet s = IntervalSet.of(1,96);
532
+ s.add(99, Lexer.MAX_CHAR_VALUE);
533
+ String expecting = "{97..98}";
534
+ String result = (s.complement(1, Lexer.MAX_CHAR_VALUE)).toString();
535
+ assertEquals(expecting, result);
536
+ }
537
+
538
+ @Test public void testMergeOfRangesAndSingleValues() throws Exception {
539
+ // {0..41, 42, 43..65534}
540
+ IntervalSet s = IntervalSet.of(0,41);
541
+ s.add(42);
542
+ s.add(43,65534);
543
+ String expecting = "{0..65534}";
544
+ String result = s.toString();
545
+ assertEquals(expecting, result);
546
+ }
547
+
548
+ @Test public void testMergeOfRangesAndSingleValuesReverse() throws Exception {
549
+ IntervalSet s = IntervalSet.of(43,65534);
550
+ s.add(42);
551
+ s.add(0,41);
552
+ String expecting = "{0..65534}";
553
+ String result = s.toString();
554
+ assertEquals(expecting, result);
555
+ }
556
+
557
+ @Test public void testMergeWhereAdditionMergesTwoExistingIntervals() throws Exception {
558
+ // 42, 10, {0..9, 11..41, 43..65534}
559
+ IntervalSet s = IntervalSet.of(42);
560
+ s.add(10);
561
+ s.add(0,9);
562
+ s.add(43,65534);
563
+ s.add(11,41);
564
+ String expecting = "{0..65534}";
565
+ String result = s.toString();
566
+ assertEquals(expecting, result);
567
+ }
568
+
569
+ /**
570
+ * This case is responsible for antlr/antlr4#153.
571
+ * https://github.com/antlr/antlr4/issues/153
572
+ */
573
+ @Test public void testMergeWhereAdditionMergesThreeExistingIntervals() throws Exception {
574
+ IntervalSet s = new IntervalSet();
575
+ s.add(0);
576
+ s.add(3);
577
+ s.add(5);
578
+ s.add(0, 7);
579
+ String expecting = "{0..7}";
580
+ String result = s.toString();
581
+ assertEquals(expecting, result);
582
+ }
583
+
584
+ @Test public void testMergeWithDoubleOverlap() throws Exception {
585
+ IntervalSet s = IntervalSet.of(1,10);
586
+ s.add(20,30);
587
+ s.add(5,25); // overlaps two!
588
+ String expecting = "{1..30}";
589
+ String result = s.toString();
590
+ assertEquals(expecting, result);
591
+ }
592
+
593
+ @Test public void testSize() throws Exception {
594
+ IntervalSet s = IntervalSet.of(20,30);
595
+ s.add(50,55);
596
+ s.add(5,19);
597
+ String expecting = "32";
598
+ String result = String.valueOf(s.size());
599
+ assertEquals(expecting, result);
600
+ }
601
+
602
+ @Test public void testToList() throws Exception {
603
+ IntervalSet s = IntervalSet.of(20,25);
604
+ s.add(50,55);
605
+ s.add(5,5);
606
+ String expecting = "[5, 20, 21, 22, 23, 24, 25, 50, 51, 52, 53, 54, 55]";
607
+ String result = String.valueOf(s.toList());
608
+ assertEquals(expecting, result);
609
+ }
610
+
611
+ /** The following was broken:
612
+ {'\u0000'..'s', 'u'..'\uFFFE'} & {'\u0000'..'q', 's'..'\uFFFE'}=
613
+ {'\u0000'..'q', 's'}!!!! broken...
614
+ 'q' is 113 ascii
615
+ 'u' is 117
616
+ */
617
+ @Test public void testNotRIntersectionNotT() throws Exception {
618
+ IntervalSet s = IntervalSet.of(0,'s');
619
+ s.add('u',200);
620
+ IntervalSet s2 = IntervalSet.of(0,'q');
621
+ s2.add('s',200);
622
+ String expecting = "{0..113, 115, 117..200}";
623
+ String result = (s.and(s2)).toString();
624
+ assertEquals(expecting, result);
625
+ }
626
+
627
+ @Test public void testRmSingleElement() throws Exception {
628
+ IntervalSet s = IntervalSet.of(1,10);
629
+ s.add(-3,-3);
630
+ s.remove(-3);
631
+ String expecting = "{1..10}";
632
+ String result = s.toString();
633
+ assertEquals(expecting, result);
634
+ }
635
+
636
+ @Test public void testRmLeftSide() throws Exception {
637
+ IntervalSet s = IntervalSet.of(1,10);
638
+ s.add(-3,-3);
639
+ s.remove(1);
640
+ String expecting = "{-3, 2..10}";
641
+ String result = s.toString();
642
+ assertEquals(expecting, result);
643
+ }
644
+
645
+ @Test public void testRmRightSide() throws Exception {
646
+ IntervalSet s = IntervalSet.of(1,10);
647
+ s.add(-3,-3);
648
+ s.remove(10);
649
+ String expecting = "{-3, 1..9}";
650
+ String result = s.toString();
651
+ assertEquals(expecting, result);
652
+ }
653
+
654
+ @Test public void testRmMiddleRange() throws Exception {
655
+ IntervalSet s = IntervalSet.of(1,10);
656
+ s.add(-3,-3);
657
+ s.remove(5);
658
+ String expecting = "{-3, 1..4, 6..10}";
659
+ String result = s.toString();
660
+ assertEquals(expecting, result);
661
+ }
662
+
663
+
664
+ }