antlr3 1.6.0 → 1.6.3
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.
- data/History.txt +8 -0
- data/Manifest.txt +94 -0
- data/README.txt +1 -1
- data/Rakefile +58 -0
- data/bin/antlr4ruby +101 -7
- data/java/antlr-full-3.2.1.jar +0 -0
- data/lib/antlr3.rb +38 -10
- data/lib/antlr3/constants.rb +13 -5
- data/lib/antlr3/debug.rb +57 -57
- data/lib/antlr3/dfa.rb +138 -68
- data/lib/antlr3/dot.rb +32 -32
- data/lib/antlr3/error.rb +85 -78
- data/lib/antlr3/main.rb +191 -187
- data/lib/antlr3/profile.rb +71 -70
- data/lib/antlr3/recognizers.rb +261 -226
- data/lib/antlr3/streams.rb +85 -84
- data/lib/antlr3/streams/interactive.rb +20 -27
- data/lib/antlr3/streams/rewrite.rb +89 -89
- data/lib/antlr3/task.rb +42 -33
- data/lib/antlr3/template.rb +2 -2
- data/lib/antlr3/template/group-lexer.rb +1 -1
- data/lib/antlr3/token.rb +76 -68
- data/lib/antlr3/tree.rb +125 -121
- data/lib/antlr3/tree/visitor.rb +1 -1
- data/lib/antlr3/tree/wizard.rb +1 -1
- data/lib/antlr3/util.rb +32 -33
- data/lib/antlr3/version.rb +3 -3
- data/templates/Ruby.stg +1 -1
- data/test/unit/test-streams.rb +11 -10
- data/test/unit/test-template.rb +206 -204
- metadata +4 -2
@@ -11,61 +11,54 @@ uses Readline (if available) or standard IO#gets to fetch data on demand.
|
|
11
11
|
=end
|
12
12
|
|
13
13
|
class InteractiveStringStream < StringStream
|
14
|
-
def initialize(options = {}, &block)
|
14
|
+
def initialize( options = {}, &block )
|
15
15
|
@data = ''
|
16
|
-
@
|
16
|
+
@position = @column = @mark_depth = 0
|
17
17
|
@line = 1
|
18
18
|
@markers = []
|
19
|
+
mark
|
19
20
|
@initialized = @eof = false
|
20
|
-
@
|
21
|
-
@
|
22
|
-
@name = options.fetch(:name, '(interactive)')
|
23
|
-
end
|
24
|
-
|
25
|
-
def <<(data)
|
26
|
-
tail = data.to_s
|
27
|
-
@size += tail.length
|
28
|
-
@data << tail
|
21
|
+
@readline = block or raise( ArgumentError, "no line-reading block was provided" )
|
22
|
+
@name = options.fetch( :name, '(interactive)' )
|
29
23
|
end
|
30
24
|
|
31
25
|
def consume
|
32
|
-
@position < @size and return(super)
|
26
|
+
@position < @data.size and return( super )
|
33
27
|
unless @eof
|
34
28
|
readline
|
35
29
|
consume
|
36
30
|
end
|
37
31
|
end
|
38
32
|
|
39
|
-
def peek(i = 1)
|
33
|
+
def peek( i = 1 )
|
40
34
|
i.zero? and return 0
|
41
35
|
i += 1 if i < 0
|
42
36
|
index = @position + i - 1
|
43
37
|
index < 0 and return 0
|
44
38
|
|
45
|
-
if index < @size
|
46
|
-
char = @data[index]
|
39
|
+
if index < @data.size
|
40
|
+
char = @data[ index ]
|
47
41
|
elsif readline
|
48
|
-
peek(i)
|
42
|
+
peek( i )
|
49
43
|
else EOF
|
50
44
|
end
|
51
45
|
end
|
52
46
|
|
53
|
-
def look(i = 1)
|
54
|
-
peek(i).chr rescue EOF
|
47
|
+
def look( i = 1 )
|
48
|
+
peek( i ).chr rescue EOF
|
55
49
|
end
|
56
50
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
fill_through(stop)
|
61
|
-
@data[start..stop]
|
51
|
+
def substring( start, stop )
|
52
|
+
fill_through( stop )
|
53
|
+
@data[ start..stop ]
|
62
54
|
end
|
63
55
|
|
64
|
-
|
65
|
-
|
56
|
+
private
|
57
|
+
|
58
|
+
def fill_through( position )
|
66
59
|
@eof and return
|
67
60
|
if position < 0 then fill_out
|
68
|
-
else readline until (@size > position or @eof)
|
61
|
+
else readline until ( @data.size > position or @eof )
|
69
62
|
end
|
70
63
|
end
|
71
64
|
|
@@ -73,7 +66,7 @@ class InteractiveStringStream < StringStream
|
|
73
66
|
@initialized = true
|
74
67
|
unless @eof
|
75
68
|
if line = @readline.call
|
76
|
-
|
69
|
+
@data << line.to_s
|
77
70
|
return true
|
78
71
|
else
|
79
72
|
@eof = true
|
@@ -4,7 +4,7 @@
|
|
4
4
|
=begin LICENSE
|
5
5
|
|
6
6
|
[The "BSD licence"]
|
7
|
-
Copyright (c) 2009 Kyle Yetter
|
7
|
+
Copyright (c) 2009-2010 Kyle Yetter
|
8
8
|
All rights reserved.
|
9
9
|
|
10
10
|
Redistribution and use in source and binary forms, with or without
|
@@ -59,8 +59,8 @@ define specific implementations of stream edits.
|
|
59
59
|
|
60
60
|
=end
|
61
61
|
|
62
|
-
unless defined?(RewriteOperation)
|
63
|
-
RewriteOperation = Struct.new(:stream, :location, :text)
|
62
|
+
unless defined?( RewriteOperation )
|
63
|
+
RewriteOperation = Struct.new( :stream, :location, :text )
|
64
64
|
end
|
65
65
|
|
66
66
|
class RewriteOperation
|
@@ -79,7 +79,7 @@ class RewriteOperation
|
|
79
79
|
|
80
80
|
# TODO: document
|
81
81
|
def inspect
|
82
|
-
return "(%s @ %p : %p)" % [name, location, text]
|
82
|
+
return "(%s @ %p : %p)" % [ name, location, text ]
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
@@ -98,9 +98,9 @@ class InsertBefore < RewriteOperation
|
|
98
98
|
alias index location
|
99
99
|
alias index= location=
|
100
100
|
|
101
|
-
def execute(buffer)
|
101
|
+
def execute( buffer )
|
102
102
|
buffer << text.to_s
|
103
|
-
token = stream[location]
|
103
|
+
token = stream[ location ]
|
104
104
|
buffer << token.text.to_s if token
|
105
105
|
return location + 1
|
106
106
|
end
|
@@ -117,23 +117,23 @@ indexed within the range <tt>op.index .. op.last_index</tt>
|
|
117
117
|
|
118
118
|
class Replace < RewriteOperation
|
119
119
|
@operation_name = 'replace'.freeze
|
120
|
-
def initialize(stream, location, text)
|
121
|
-
super(stream, nil, text)
|
120
|
+
def initialize( stream, location, text )
|
121
|
+
super( stream, nil, text )
|
122
122
|
self.location = location
|
123
123
|
end
|
124
124
|
|
125
|
-
def location=(val)
|
125
|
+
def location=( val )
|
126
126
|
case val
|
127
|
-
when Range then super(val)
|
127
|
+
when Range then super( val )
|
128
128
|
else
|
129
129
|
val = val.to_i
|
130
|
-
super(val..val)
|
130
|
+
super( val..val )
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
def execute(buffer)
|
134
|
+
def execute( buffer )
|
135
135
|
buffer << text.to_s unless text.nil?
|
136
|
-
return(location.end + 1)
|
136
|
+
return( location.end + 1 )
|
137
137
|
end
|
138
138
|
|
139
139
|
def index
|
@@ -153,45 +153,45 @@ and do not add any text to the rewrite buffer
|
|
153
153
|
|
154
154
|
class Delete < Replace
|
155
155
|
@operation_name = 'delete'.freeze
|
156
|
-
def initialize(stream, location)
|
157
|
-
super(stream, location, nil)
|
156
|
+
def initialize( stream, location )
|
157
|
+
super( stream, location, nil )
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
161
|
class RewriteProgram
|
162
|
-
def initialize(stream, name = nil)
|
162
|
+
def initialize( stream, name = nil )
|
163
163
|
@stream = stream
|
164
164
|
@name = name
|
165
165
|
@operations = []
|
166
166
|
end
|
167
167
|
|
168
|
-
def replace(*range_arguments)
|
169
|
-
range, text = cast_range(range_arguments, 1)
|
168
|
+
def replace( *range_arguments )
|
169
|
+
range, text = cast_range( range_arguments, 1 )
|
170
170
|
|
171
|
-
op = Replace.new(@stream, range, text)
|
171
|
+
op = Replace.new( @stream, range, text )
|
172
172
|
@operations << op
|
173
173
|
return op
|
174
174
|
end
|
175
175
|
|
176
|
-
def insert_before(index, text)
|
176
|
+
def insert_before( index, text )
|
177
177
|
index = index.to_i
|
178
178
|
index < 0 and index += @stream.length
|
179
|
-
op = InsertBefore.new(@stream, index, text)
|
179
|
+
op = InsertBefore.new( @stream, index, text )
|
180
180
|
@operations << op
|
181
181
|
return op
|
182
182
|
end
|
183
183
|
|
184
|
-
def insert_after(index, text)
|
184
|
+
def insert_after( index, text )
|
185
185
|
index = index.to_i
|
186
186
|
index < 0 and index += @stream.length
|
187
|
-
op = InsertBefore.new(@stream, index + 1, text)
|
187
|
+
op = InsertBefore.new( @stream, index + 1, text )
|
188
188
|
@operations << op
|
189
189
|
return op
|
190
190
|
end
|
191
191
|
|
192
|
-
def delete(*range_arguments)
|
193
|
-
range, = cast_range(range_arguments)
|
194
|
-
op = Delete.new(@stream, range)
|
192
|
+
def delete( *range_arguments )
|
193
|
+
range, = cast_range( range_arguments )
|
194
|
+
op = Delete.new( @stream, range )
|
195
195
|
@operations << op
|
196
196
|
return op
|
197
197
|
end
|
@@ -211,12 +211,12 @@ class RewriteProgram
|
|
211
211
|
|
212
212
|
case prior_operation
|
213
213
|
when InsertBefore
|
214
|
-
location.include?(prior_location)
|
214
|
+
location.include?( prior_location )
|
215
215
|
when Replace
|
216
|
-
if location.covers?(prior_location)
|
216
|
+
if location.covers?( prior_location )
|
217
217
|
true
|
218
|
-
elsif location.overlaps?(prior_location)
|
219
|
-
conflict!(operation, prior_operation)
|
218
|
+
elsif location.overlaps?( prior_location )
|
219
|
+
conflict!( operation, prior_operation )
|
220
220
|
end
|
221
221
|
end
|
222
222
|
end
|
@@ -234,35 +234,35 @@ class RewriteProgram
|
|
234
234
|
if location == prior_location.first
|
235
235
|
prior_operation.text = operation.text << prior_operation.text.to_s
|
236
236
|
operation = nil
|
237
|
-
break(false)
|
238
|
-
elsif prior_location.include?(location)
|
239
|
-
conflict!(operation, prior_operation)
|
237
|
+
break( false )
|
238
|
+
elsif prior_location.include?( location )
|
239
|
+
conflict!( operation, prior_operation )
|
240
240
|
end
|
241
241
|
end
|
242
242
|
end
|
243
243
|
end
|
244
244
|
|
245
|
-
reduced.unshift(operation) if operation
|
245
|
+
reduced.unshift( operation ) if operation
|
246
246
|
end
|
247
247
|
|
248
|
-
@operations.replace(reduced)
|
248
|
+
@operations.replace( reduced )
|
249
249
|
|
250
|
-
@operations.inject({}) do |map, operation|
|
251
|
-
other_operaiton = map[operation.index] and
|
252
|
-
ANTLR3.bug!( Util.tidy(<<-END) % [self.class, operation, other_operaiton] )
|
250
|
+
@operations.inject( {} ) do |map, operation|
|
251
|
+
other_operaiton = map[ operation.index ] and
|
252
|
+
ANTLR3.bug!( Util.tidy( <<-END ) % [ self.class, operation, other_operaiton ] )
|
253
253
|
| %s#reduce! should have left only one operation per index,
|
254
254
|
| but %p conflicts with %p
|
255
255
|
END
|
256
|
-
map[operation.index] = operation
|
256
|
+
map[ operation.index ] = operation
|
257
257
|
map
|
258
258
|
end
|
259
259
|
end
|
260
260
|
|
261
|
-
def execute(*range_arguments)
|
261
|
+
def execute( *range_arguments )
|
262
262
|
if range_arguments.empty?
|
263
263
|
range = 0 ... @stream.length
|
264
264
|
else
|
265
|
-
range, = cast_range(range_arguments)
|
265
|
+
range, = cast_range( range_arguments )
|
266
266
|
end
|
267
267
|
|
268
268
|
output = ''
|
@@ -272,19 +272,19 @@ class RewriteProgram
|
|
272
272
|
operations = reduce
|
273
273
|
|
274
274
|
cursor = range.first
|
275
|
-
while range.include?(cursor)
|
276
|
-
if operation = operations.delete(cursor)
|
277
|
-
cursor = operation.execute(output)
|
275
|
+
while range.include?( cursor )
|
276
|
+
if operation = operations.delete( cursor )
|
277
|
+
cursor = operation.execute( output )
|
278
278
|
else
|
279
|
-
token = tokens[cursor]
|
279
|
+
token = tokens[ cursor ]
|
280
280
|
output << token.text if token
|
281
281
|
cursor += 1
|
282
282
|
end
|
283
283
|
end
|
284
|
-
if operation = operations.delete(cursor) and
|
285
|
-
operation.is_a?(InsertBefore)
|
284
|
+
if operation = operations.delete( cursor ) and
|
285
|
+
operation.is_a?( InsertBefore )
|
286
286
|
# catch edge 'insert-after' operations
|
287
|
-
operation.execute(output)
|
287
|
+
operation.execute( output )
|
288
288
|
end
|
289
289
|
|
290
290
|
return output
|
@@ -294,51 +294,51 @@ class RewriteProgram
|
|
294
294
|
@operations.clear
|
295
295
|
end
|
296
296
|
|
297
|
-
def undo(number_of_operations = 1)
|
298
|
-
@operations.pop(number_of_operations)
|
297
|
+
def undo( number_of_operations = 1 )
|
298
|
+
@operations.pop( number_of_operations )
|
299
299
|
end
|
300
300
|
|
301
|
-
def conflict!(current, previous)
|
302
|
-
message = 'operation %p overlaps with previous operation %p' % [current, previous]
|
303
|
-
raise(RangeError, message, caller)
|
301
|
+
def conflict!( current, previous )
|
302
|
+
message = 'operation %p overlaps with previous operation %p' % [ current, previous ]
|
303
|
+
raise( RangeError, message, caller )
|
304
304
|
end
|
305
305
|
|
306
|
-
def cast_range(args, extra = 0)
|
306
|
+
def cast_range( args, extra = 0 )
|
307
307
|
single, pair = extra + 1, extra + 2
|
308
|
-
case check_arguments(args, single, pair)
|
308
|
+
case check_arguments( args, single, pair )
|
309
309
|
when single
|
310
310
|
loc = args.shift
|
311
311
|
|
312
|
-
if loc.is_a?(Range)
|
312
|
+
if loc.is_a?( Range )
|
313
313
|
first, last = loc.first.to_i, loc.last.to_i
|
314
314
|
loc.exlude_end? and last -= 1
|
315
|
-
return cast_range(args.unshift(first, last), extra)
|
315
|
+
return cast_range( args.unshift( first, last ), extra )
|
316
316
|
else
|
317
317
|
loc = loc.to_i
|
318
|
-
return cast_range(args.unshift(loc, loc), extra)
|
318
|
+
return cast_range( args.unshift( loc, loc ), extra )
|
319
319
|
end
|
320
320
|
when pair
|
321
|
-
first, last = args.shift(2).map! { |arg| arg.to_i }
|
321
|
+
first, last = args.shift( 2 ).map! { |arg| arg.to_i }
|
322
322
|
if first < 0 and last < 0
|
323
323
|
first += @stream.length
|
324
324
|
last += @stream.length
|
325
325
|
else
|
326
326
|
last < 0 and last += @stream.length
|
327
|
-
first = first.at_least(0)
|
327
|
+
first = first.at_least( 0 )
|
328
328
|
end
|
329
|
-
return(args.unshift(first .. last))
|
329
|
+
return( args.unshift( first .. last ) )
|
330
330
|
end
|
331
331
|
end
|
332
332
|
|
333
|
-
def check_arguments(args, min, max)
|
333
|
+
def check_arguments( args, min, max )
|
334
334
|
n = args.length
|
335
335
|
if n < min
|
336
336
|
raise ArgumentError,
|
337
|
-
"wrong number of arguments (#{args.length} for #{min})",
|
337
|
+
"wrong number of arguments (#{ args.length } for #{ min })",
|
338
338
|
caller
|
339
339
|
elsif n > max
|
340
340
|
raise ArgumentError,
|
341
|
-
"wrong number of arguments (#{args.length} for #{max})",
|
341
|
+
"wrong number of arguments (#{ args.length } for #{ max })",
|
342
342
|
caller
|
343
343
|
else return n
|
344
344
|
end
|
@@ -349,64 +349,64 @@ end
|
|
349
349
|
|
350
350
|
attr_reader :programs
|
351
351
|
|
352
|
-
def initialize(token_source, options = {})
|
353
|
-
super(token_source, options)
|
352
|
+
def initialize( token_source, options = {} )
|
353
|
+
super( token_source, options )
|
354
354
|
|
355
355
|
@programs = Hash.new do |programs, name|
|
356
|
-
if name.is_a?(String)
|
357
|
-
programs[name] = RewriteProgram.new(self, name)
|
358
|
-
else programs[name.to_s]
|
356
|
+
if name.is_a?( String )
|
357
|
+
programs[ name ] = RewriteProgram.new( self, name )
|
358
|
+
else programs[ name.to_s ]
|
359
359
|
end
|
360
360
|
end
|
361
361
|
|
362
362
|
@last_rewrite_token_indexes = {}
|
363
363
|
end
|
364
364
|
|
365
|
-
def rewrite(program_name = 'default', range = nil)
|
366
|
-
program = @programs[program_name]
|
365
|
+
def rewrite( program_name = 'default', range = nil )
|
366
|
+
program = @programs[ program_name ]
|
367
367
|
if block_given?
|
368
|
-
yield(program)
|
369
|
-
program.execute(range)
|
368
|
+
yield( program )
|
369
|
+
program.execute( range )
|
370
370
|
else program
|
371
371
|
end
|
372
372
|
end
|
373
373
|
|
374
|
-
def program(name = 'default')
|
375
|
-
return @programs[name]
|
374
|
+
def program( name = 'default' )
|
375
|
+
return @programs[ name ]
|
376
376
|
end
|
377
377
|
|
378
|
-
def delete_program(name = 'default')
|
379
|
-
@programs.delete(name)
|
378
|
+
def delete_program( name = 'default' )
|
379
|
+
@programs.delete( name )
|
380
380
|
end
|
381
381
|
|
382
|
-
def original_string(start = 0, finish = size - 1)
|
382
|
+
def original_string( start = 0, finish = size - 1 )
|
383
383
|
@position == -1 and fill_buffer
|
384
384
|
|
385
|
-
return(self[start..finish].map { |t| t.text }.join(''))
|
385
|
+
return( self[ start..finish ].map { |t| t.text }.join( '' ) )
|
386
386
|
end
|
387
387
|
|
388
|
-
def insert_before(*args)
|
389
|
-
@programs['default'].insert_before(*args)
|
388
|
+
def insert_before( *args )
|
389
|
+
@programs[ 'default' ].insert_before( *args )
|
390
390
|
end
|
391
391
|
|
392
|
-
def insert_after(*args)
|
393
|
-
@programs['default'].insert_after(*args)
|
392
|
+
def insert_after( *args )
|
393
|
+
@programs[ 'default' ].insert_after( *args )
|
394
394
|
end
|
395
395
|
|
396
|
-
def replace(*args)
|
397
|
-
@programs['default'].replace(*args)
|
396
|
+
def replace( *args )
|
397
|
+
@programs[ 'default' ].replace( *args )
|
398
398
|
end
|
399
399
|
|
400
|
-
def delete(*args)
|
401
|
-
@programs['default'].delete(*args)
|
400
|
+
def delete( *args )
|
401
|
+
@programs[ 'default' ].delete( *args )
|
402
402
|
end
|
403
403
|
|
404
|
-
def render(*arguments)
|
404
|
+
def render( *arguments )
|
405
405
|
case arguments.first
|
406
406
|
when String, Symbol then name = arguments.shift.to_s
|
407
407
|
else name = 'default'
|
408
408
|
end
|
409
|
-
@programs[name].execute(*arguments)
|
409
|
+
@programs[ name ].execute( *arguments )
|
410
410
|
end
|
411
411
|
end
|
412
412
|
end
|