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.
- checksums.yaml +7 -0
- data/LICENSE +27 -0
- data/README.md +46 -0
- data/lib/antlr4.rb +262 -0
- data/lib/antlr4/BufferedTokenStream.rb +306 -0
- data/lib/antlr4/CommonTokenFactory.rb +53 -0
- data/lib/antlr4/CommonTokenStream.rb +56 -0
- data/lib/antlr4/FileStream.rb +14 -0
- data/lib/antlr4/InputStream.rb +82 -0
- data/lib/antlr4/IntervalSet.rb +341 -0
- data/lib/antlr4/LL1Analyzer.rb +177 -0
- data/lib/antlr4/Lexer.rb +335 -0
- data/lib/antlr4/ListTokenSource.rb +140 -0
- data/lib/antlr4/Parser.rb +562 -0
- data/lib/antlr4/ParserInterpreter.rb +149 -0
- data/lib/antlr4/ParserRuleContext.rb +162 -0
- data/lib/antlr4/PredictionContext.rb +690 -0
- data/lib/antlr4/Recognizer.rb +162 -0
- data/lib/antlr4/RuleContext.rb +226 -0
- data/lib/antlr4/Token.rb +124 -0
- data/lib/antlr4/TokenFactory.rb +3 -0
- data/lib/antlr4/TokenSource.rb +4 -0
- data/lib/antlr4/TokenStream.rb +3 -0
- data/lib/antlr4/TraceListener.rb +23 -0
- data/lib/antlr4/atn/ATN.rb +133 -0
- data/lib/antlr4/atn/ATNConfig.rb +146 -0
- data/lib/antlr4/atn/ATNConfigSet.rb +215 -0
- data/lib/antlr4/atn/ATNDeserializationOptions.rb +62 -0
- data/lib/antlr4/atn/ATNDeserializer.rb +604 -0
- data/lib/antlr4/atn/ATNSimulator.rb +43 -0
- data/lib/antlr4/atn/ATNState.rb +253 -0
- data/lib/antlr4/atn/ATNType.rb +22 -0
- data/lib/antlr4/atn/LexerATNSimulator.rb +612 -0
- data/lib/antlr4/atn/LexerAction.rb +311 -0
- data/lib/antlr4/atn/LexerActionExecutor.rb +134 -0
- data/lib/antlr4/atn/ParserATNSimulator.rb +1622 -0
- data/lib/antlr4/atn/PredictionMode.rb +525 -0
- data/lib/antlr4/atn/SemanticContext.rb +355 -0
- data/lib/antlr4/atn/Transition.rb +297 -0
- data/lib/antlr4/base.rb +60 -0
- data/lib/antlr4/dfa/DFA.rb +128 -0
- data/lib/antlr4/dfa/DFASerializer.rb +77 -0
- data/lib/antlr4/dfa/DFAState.rb +133 -0
- data/lib/antlr4/error.rb +151 -0
- data/lib/antlr4/error/DiagnosticErrorListener.rb +136 -0
- data/lib/antlr4/error/ErrorListener.rb +109 -0
- data/lib/antlr4/error/ErrorStrategy.rb +742 -0
- data/lib/antlr4/tree/Chunk.rb +31 -0
- data/lib/antlr4/tree/ParseTreeMatch.rb +105 -0
- data/lib/antlr4/tree/ParseTreePattern.rb +70 -0
- data/lib/antlr4/tree/ParseTreePatternMatcher.rb +334 -0
- data/lib/antlr4/tree/RuleTagToken.rb +39 -0
- data/lib/antlr4/tree/TokenTagToken.rb +38 -0
- data/lib/antlr4/tree/Tree.rb +204 -0
- data/lib/antlr4/tree/Trees.rb +111 -0
- data/lib/antlr4/version.rb +5 -0
- data/lib/antlr4/xpath/XPath.rb +354 -0
- data/lib/double_key_map.rb +78 -0
- data/lib/java_symbols.rb +24 -0
- data/lib/uuid.rb +87 -0
- data/test/test_intervalset.rb +664 -0
- data/test/test_tree.rb +140 -0
- data/test/test_uuid.rb +122 -0
- 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
|
data/lib/java_symbols.rb
ADDED
@@ -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
|
data/lib/uuid.rb
ADDED
@@ -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
|
+
}
|