antlr3 1.4.0 → 1.6.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.
- data/History.txt +59 -66
- data/java/RubyTarget.java +10 -5
- data/java/antlr-full-3.2.1.jar +0 -0
- data/lib/antlr3/debug.rb +8 -14
- data/lib/antlr3/debug/socket.rb +29 -29
- data/lib/antlr3/recognizers.rb +13 -23
- data/lib/antlr3/streams.rb +17 -8
- data/lib/antlr3/template.rb +11 -0
- data/lib/antlr3/template/group-lexer.rb +48 -48
- data/lib/antlr3/template/group-parser.rb +133 -94
- data/lib/antlr3/test/core-extensions.rb +1 -1
- data/lib/antlr3/token.rb +4 -4
- data/lib/antlr3/tree.rb +39 -35
- data/lib/antlr3/tree/debug.rb +3 -2
- data/lib/antlr3/version.rb +1 -1
- data/templates/Ruby.stg +27 -33
- data/templates/ST.stg +0 -3
- data/test/functional/ast-output/construction.rb +1 -1
- data/test/unit/test-exceptions.rb +12 -0
- metadata +4 -3
@@ -176,7 +176,7 @@ end
|
|
176
176
|
|
177
177
|
class File
|
178
178
|
|
179
|
-
#
|
179
|
+
# given some target path string, and an optional reference path
|
180
180
|
# (Dir.pwd by default), this method returns a string containing
|
181
181
|
# the relative path of the target path from the reference path
|
182
182
|
#
|
data/lib/antlr3/token.rb
CHANGED
@@ -281,21 +281,21 @@ module TokenSource
|
|
281
281
|
|
282
282
|
def next
|
283
283
|
token = next_token()
|
284
|
-
raise StopIteration if token.nil?
|
284
|
+
raise StopIteration if token.nil? || token.type == EOF
|
285
285
|
return token
|
286
286
|
end
|
287
287
|
|
288
288
|
def to_stream(options = {})
|
289
289
|
if block_given?
|
290
|
-
CommonTokenStream.new(self, options) { |t| yield(t) }
|
290
|
+
CommonTokenStream.new( self, options ) { | t, stream | yield( t, stream ) }
|
291
291
|
else
|
292
|
-
CommonTokenStream.new(self, options)
|
292
|
+
CommonTokenStream.new( self, options )
|
293
293
|
end
|
294
294
|
end
|
295
295
|
|
296
296
|
def each
|
297
297
|
block_given? or return enum_for(:each)
|
298
|
-
loop { yield(self.next) }
|
298
|
+
loop { yield( self.next ) }
|
299
299
|
rescue StopIteration
|
300
300
|
return self
|
301
301
|
end
|
data/lib/antlr3/tree.rb
CHANGED
@@ -287,28 +287,8 @@ module Tree
|
|
287
287
|
# self.ancestors.each { |anc| yield(anc) }
|
288
288
|
#end
|
289
289
|
|
290
|
-
#def walk
|
291
|
-
# block_given? or return( enum_for( :walk ) )
|
292
|
-
# stack = []
|
293
|
-
# cursor = self
|
294
|
-
# loop do
|
295
|
-
# begin
|
296
|
-
# yield(cursor)
|
297
|
-
# stack.push(cursor.children.clone) unless cursor.leaf?
|
298
|
-
# rescue StopIteration
|
299
|
-
# # skips adding children to prune the node
|
300
|
-
# ensure
|
301
|
-
# break if stack.empty?
|
302
|
-
# cursor = stack.last.shift
|
303
|
-
# stack.pop if stack.last.empty?
|
304
|
-
# end
|
305
|
-
# end
|
306
|
-
# return self
|
307
|
-
#end
|
308
290
|
|
309
|
-
|
310
|
-
# raise StopIteration
|
311
|
-
#end
|
291
|
+
|
312
292
|
|
313
293
|
#alias :each :walk
|
314
294
|
#
|
@@ -319,7 +299,7 @@ module Tree
|
|
319
299
|
#def leaf?
|
320
300
|
# children.empty?
|
321
301
|
#end
|
322
|
-
|
302
|
+
|
323
303
|
#def ancestors
|
324
304
|
# a = []
|
325
305
|
# cursor = self
|
@@ -400,7 +380,7 @@ class BaseTree < ::Array
|
|
400
380
|
killed = delete_at( index ) and freshen( index )
|
401
381
|
return killed
|
402
382
|
end
|
403
|
-
|
383
|
+
|
404
384
|
def replace_children( start, stop, new_tree )
|
405
385
|
start >= length or stop >= length and
|
406
386
|
raise IndexError, (<<-END).gsub!(/^\s+\| /,'')
|
@@ -446,6 +426,29 @@ class BaseTree < ::Array
|
|
446
426
|
return( buffer )
|
447
427
|
end
|
448
428
|
|
429
|
+
def walk
|
430
|
+
block_given? or return( enum_for( :walk ) )
|
431
|
+
stack = []
|
432
|
+
cursor = self
|
433
|
+
while true
|
434
|
+
begin
|
435
|
+
yield( cursor )
|
436
|
+
stack.push( Array[ *cursor ] ) unless cursor.empty?
|
437
|
+
rescue StopIteration
|
438
|
+
# skips adding children to prune the node
|
439
|
+
ensure
|
440
|
+
break if stack.empty?
|
441
|
+
cursor = stack.last.shift
|
442
|
+
stack.pop if stack.last.empty?
|
443
|
+
end
|
444
|
+
end
|
445
|
+
return self
|
446
|
+
end
|
447
|
+
|
448
|
+
def prune
|
449
|
+
raise StopIteration
|
450
|
+
end
|
451
|
+
|
449
452
|
abstract :to_s
|
450
453
|
#protected :sanity_check, :freshen
|
451
454
|
end
|
@@ -498,7 +501,6 @@ class CommonTree < BaseTree
|
|
498
501
|
@parent = nil
|
499
502
|
end
|
500
503
|
|
501
|
-
|
502
504
|
def copy_node
|
503
505
|
return self.class.new( @token )
|
504
506
|
end
|
@@ -528,7 +530,6 @@ class CommonTree < BaseTree
|
|
528
530
|
end
|
529
531
|
return @token.column
|
530
532
|
end
|
531
|
-
|
532
533
|
|
533
534
|
def start_index
|
534
535
|
@start_index == -1 and @token and return @token.index
|
@@ -843,7 +844,7 @@ class CommonTreeAdaptor
|
|
843
844
|
end
|
844
845
|
|
845
846
|
def create_flat_list!
|
846
|
-
return
|
847
|
+
return create_with_payload!( nil )
|
847
848
|
end
|
848
849
|
|
849
850
|
def become_root( new_root, old_root )
|
@@ -884,6 +885,7 @@ class CommonTreeAdaptor
|
|
884
885
|
def create_with_payload!( payload )
|
885
886
|
return CommonTree.new( payload )
|
886
887
|
end
|
888
|
+
|
887
889
|
def create!( *args )
|
888
890
|
n = args.length
|
889
891
|
if n == 1 and args.first.is_a?( Token ) then create_with_payload!( args[0] )
|
@@ -911,7 +913,7 @@ class CommonTreeAdaptor
|
|
911
913
|
end
|
912
914
|
|
913
915
|
def each_child( tree )
|
914
|
-
block_given? or return enum_for(
|
916
|
+
block_given? or return enum_for( :each_child, tree )
|
915
917
|
tree.each do | child |
|
916
918
|
yield( child )
|
917
919
|
end
|
@@ -979,14 +981,14 @@ class CommonTreeNodeStream
|
|
979
981
|
attr_reader :adaptor, :position
|
980
982
|
|
981
983
|
def initialize(*args)
|
984
|
+
options = args.last.is_a?( ::Hash ) ? args.pop : {}
|
982
985
|
case n = args.length
|
983
986
|
when 1
|
984
|
-
@adaptor = CommonTreeAdaptor.new
|
985
987
|
@root = args.first
|
986
|
-
@nodes = @down = @up = @eof = nil
|
988
|
+
@token_stream = @adaptor = @nodes = @down = @up = @eof = nil
|
987
989
|
when 2
|
988
990
|
@adaptor, @root = args
|
989
|
-
@nodes = @down = @up = @eof = nil
|
991
|
+
@token_stream = @nodes = @down = @up = @eof = nil
|
990
992
|
when 3
|
991
993
|
parent, start, stop = *args
|
992
994
|
@adaptor = parent.adaptor
|
@@ -995,17 +997,19 @@ class CommonTreeNodeStream
|
|
995
997
|
@down = parent.down
|
996
998
|
@up = parent.up
|
997
999
|
@eof = parent.eof
|
1000
|
+
@token_stream = parent.token_stream
|
998
1001
|
when 0
|
999
1002
|
raise ArgumentError, "wrong number of arguments (0 for 1)"
|
1000
1003
|
else raise ArgumentError, "wrong number of arguments (#{ n } for 3)"
|
1001
1004
|
end
|
1002
|
-
@
|
1003
|
-
@
|
1004
|
-
@
|
1005
|
+
@adaptor ||= options.fetch( :adaptor ) { CommonTreeAdaptor.new }
|
1006
|
+
@token_stream ||= options[ :token_stream ]
|
1007
|
+
@down ||= options.fetch( :down ) { @adaptor.create_from_type!( DOWN, 'DOWN' ) }
|
1008
|
+
@up ||= options.fetch( :up ) { @adaptor.create_from_type!( UP, 'UP' ) }
|
1009
|
+
@eof ||= options.fetch( :eof ) { @adaptor.create_from_type!( EOF, 'EOF' ) }
|
1005
1010
|
@nodes ||= []
|
1006
|
-
@token_stream = nil
|
1007
1011
|
|
1008
|
-
@unique_navigation_nodes = false
|
1012
|
+
@unique_navigation_nodes = options.fetch( :unique_navigation_nodes, false )
|
1009
1013
|
@position = -1
|
1010
1014
|
@last_marker = nil
|
1011
1015
|
@calls = []
|
data/lib/antlr3/tree/debug.rb
CHANGED
@@ -9,10 +9,11 @@ Adds debugging event hooks to TreeAdaptor objects
|
|
9
9
|
|
10
10
|
=end
|
11
11
|
module TreeAdaptor
|
12
|
-
|
12
|
+
|
13
|
+
def self.wrap( adaptor, debug_listener = nil )
|
13
14
|
adaptor.extend(self)
|
14
15
|
adaptor.debug_listener = debug_listener
|
15
|
-
return(adaptor)
|
16
|
+
return( adaptor )
|
16
17
|
end
|
17
18
|
|
18
19
|
attr_accessor :debug_listener
|
data/lib/antlr3/version.rb
CHANGED
@@ -19,7 +19,7 @@ module ANTLR3
|
|
19
19
|
# The version data for the current state the library itself
|
20
20
|
#
|
21
21
|
MAJOR_VERSION = 1
|
22
|
-
MINOR_VERSION =
|
22
|
+
MINOR_VERSION = 6
|
23
23
|
PATCH_VERSION = 0
|
24
24
|
VERSION = [ MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION ]
|
25
25
|
VERSION_STRING = VERSION.join('.').freeze
|
data/templates/Ruby.stg
CHANGED
@@ -44,7 +44,7 @@ Current load path:
|
|
44
44
|
END
|
45
45
|
end
|
46
46
|
|
47
|
-
defined?(ANTLR3) or begin
|
47
|
+
defined?( ANTLR3 ) or begin
|
48
48
|
|
49
49
|
# 1: try to load the ruby antlr3 runtime library from the system path
|
50
50
|
require 'antlr3'
|
@@ -52,7 +52,7 @@ defined?(ANTLR3) or begin
|
|
52
52
|
rescue LoadError
|
53
53
|
|
54
54
|
# 2: try to load rubygems if it isn't already loaded
|
55
|
-
defined?(Gem) or begin
|
55
|
+
defined?( Gem ) or begin
|
56
56
|
require 'rubygems'
|
57
57
|
rescue LoadError
|
58
58
|
antlr_load_failed.call
|
@@ -60,7 +60,7 @@ rescue LoadError
|
|
60
60
|
|
61
61
|
# 3: try to activate the antlr3 gem
|
62
62
|
begin
|
63
|
-
Gem.activate( 'antlr3', '
|
63
|
+
Gem.activate( 'antlr3', '~> <runtimeLibraryVersion()>' )
|
64
64
|
rescue Gem::LoadError
|
65
65
|
antlr_load_failed.call
|
66
66
|
end
|
@@ -97,7 +97,7 @@ module TokenData
|
|
97
97
|
<if(tokens)>
|
98
98
|
|
99
99
|
# define the token constants
|
100
|
-
define_tokens(<tokens:{:<it.name> => <it.type>}; anchor, wrap="\n", separator=", ">)
|
100
|
+
define_tokens( <tokens:{:<it.name> => <it.type>}; anchor, wrap="\n", separator=", "> )
|
101
101
|
|
102
102
|
<endif>
|
103
103
|
<if(tokenNames)>
|
@@ -108,7 +108,7 @@ module TokenData
|
|
108
108
|
# this is necessary because anonymous tokens, which are
|
109
109
|
# created from literal values in the grammar, do not
|
110
110
|
# have descriptive names
|
111
|
-
register_names(<tokenNames:{<it>}; separator=", ", anchor, wrap="\n">)
|
111
|
+
register_names( <tokenNames:{<it>}; separator=", ", anchor, wrap="\n"> )
|
112
112
|
|
113
113
|
<endif>
|
114
114
|
|
@@ -189,7 +189,7 @@ parserBody(grammar, name, scopes, tokens, tokenNames, rules, numRules, bitsets,
|
|
189
189
|
<if(!grammar.grammarIsRoot)><autoloadDelegates()><\n><endif>
|
190
190
|
<@mixins()>
|
191
191
|
|
192
|
-
RULE_METHODS = [<rules:{r|:<r.ruleName>}; separator=", ", wrap="\n", anchor>].freeze
|
192
|
+
RULE_METHODS = [ <rules:{r|:<r.ruleName>}; separator=", ", wrap="\n", anchor> ].freeze
|
193
193
|
|
194
194
|
<scopes:{<if(it.isDynamicGlobalScope)><globalAttributeScopeClass(scope=it)><\n><endif>}>
|
195
195
|
<rules:{<ruleAttributeScopeClass(scope=it.ruleDescriptor.ruleScope)>}>
|
@@ -234,8 +234,8 @@ end
|
|
234
234
|
>>
|
235
235
|
|
236
236
|
parserConstructor() ::= <<
|
237
|
-
def initialize(<grammar.delegators:{g|<g:delegateName()>, }>input, options = {})
|
238
|
-
super(input, options)
|
237
|
+
def initialize( <grammar.delegators:{g|<g:delegateName()>, }>input, options = {} )
|
238
|
+
super( input, options )
|
239
239
|
<if(memoize)><if(grammar.grammarIsRoot)>
|
240
240
|
@state.rule_memory = {}
|
241
241
|
<endif><endif>
|
@@ -257,10 +257,15 @@ end
|
|
257
257
|
* need to be in a rule by themselves.
|
258
258
|
*/
|
259
259
|
synpredRule(ruleName, ruleDescriptor, block, description, nakedBlock) ::= <<
|
260
|
-
#
|
260
|
+
#
|
261
|
+
# syntactic predicate <ruleName; format="lexerRule">
|
261
262
|
#
|
262
263
|
# (in <fileName>)
|
263
264
|
# <description>
|
265
|
+
#
|
266
|
+
# This is an imaginary rule inserted by ANTLR to
|
267
|
+
# implement a syntactic predicate decision
|
268
|
+
#
|
264
269
|
def <ruleName; format="lexerRule"><if(ruleDescriptor.parameterScope)>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>)<endif>
|
265
270
|
<traceIn()><ruleLabelDefs()>
|
266
271
|
<block>
|
@@ -276,10 +281,12 @@ end
|
|
276
281
|
rule(ruleName, ruleDescriptor, block, emptyRule, description, exceptions, finally, memoize) ::= <<
|
277
282
|
<returnScope(scope=ruleDescriptor.returnScope)>
|
278
283
|
|
284
|
+
#
|
279
285
|
# parser rule <ruleName>
|
280
286
|
#
|
281
287
|
# (in <fileName>)
|
282
288
|
# <description>
|
289
|
+
#
|
283
290
|
def <ruleName><if(ruleDescriptor.parameterScope)>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>)<endif>
|
284
291
|
<traceIn()><ruleScopeSetUp()><ruleDeclarations()><ruleLabelDefs()><action(name="init", code=ruleDescriptor.actions.init)>
|
285
292
|
<@body><ruleBody()><@end>
|
@@ -292,7 +299,6 @@ end
|
|
292
299
|
<endif>
|
293
300
|
>>
|
294
301
|
|
295
|
-
|
296
302
|
delegateRule(ruleDescriptor) ::= <<
|
297
303
|
# delegated rule <ruleDescriptor.name>
|
298
304
|
def <ruleDescriptor.name>(<ruleDescriptor.parameterScope:parameterScope(scope=it)>)
|
@@ -333,7 +339,7 @@ rescue <e.decl>
|
|
333
339
|
>>
|
334
340
|
|
335
341
|
closureBlockLoop() ::= <<
|
336
|
-
|
342
|
+
while true # decision <decisionNumber>
|
337
343
|
alt_<decisionNumber> = <maxAlt>
|
338
344
|
<@decisionBody><decision><@end>
|
339
345
|
case alt_<decisionNumber>
|
@@ -356,12 +362,12 @@ element() ::= <<
|
|
356
362
|
execForcedAction(action) ::= "<action>"
|
357
363
|
|
358
364
|
globalAttributeScopeClass(scope) ::= <<
|
359
|
-
<if(scope.attributes)
|
365
|
+
<if(scope.attributes)>@@<scope.name> = Struct.new( <scope.attributes:{:<it.decl>}; separator=", "> )<\n><endif>
|
360
366
|
>>
|
361
367
|
|
362
368
|
|
363
369
|
globalAttributeScopeStack(scope) ::= <<
|
364
|
-
<if(scope.attributes)>@<scope.name>_stack = []
|
370
|
+
<if(scope.attributes)>@<scope.name>_stack = []<\n><endif>
|
365
371
|
>>
|
366
372
|
|
367
373
|
|
@@ -375,7 +381,7 @@ parameterScope(scope) ::= <<
|
|
375
381
|
|
376
382
|
positiveClosureBlockLoop() ::= <<
|
377
383
|
match_count_<decisionNumber> = 0
|
378
|
-
|
384
|
+
while true
|
379
385
|
alt_<decisionNumber> = <maxAlt>
|
380
386
|
<@decisionBody><decision><@end>
|
381
387
|
case alt_<decisionNumber>
|
@@ -390,6 +396,7 @@ loop do
|
|
390
396
|
match_count_<decisionNumber> += 1
|
391
397
|
end<\n>
|
392
398
|
>>
|
399
|
+
|
393
400
|
returnScope(scope) ::= <<
|
394
401
|
<if(ruleDescriptor.hasMultipleReturnValues)>
|
395
402
|
<ruleDescriptor:returnStructName(r=it)> = define_return_scope <scope.attributes:{:<it.decl>}; separator=", ">
|
@@ -398,21 +405,8 @@ returnScope(scope) ::= <<
|
|
398
405
|
|
399
406
|
|
400
407
|
returnStructName(r) ::= "<r.name; format=\"camelcase\">ReturnValue"
|
401
|
-
|
402
|
-
|
403
|
-
ruleAttributeScopeClass(scope) ::= <<
|
404
|
-
<if(scope.attributes)>
|
405
|
-
Scope<scope.name> = Struct.new(<scope.attributes:{:<it.decl>}; separator=", ">)<\n>
|
406
|
-
<endif>
|
407
|
-
>>
|
408
|
-
|
409
|
-
|
410
|
-
ruleAttributeScopeStack(scope) ::= <<
|
411
|
-
<if(scope.attributes)>
|
412
|
-
@<scope.name>_stack = []<\n>
|
413
|
-
<endif>
|
414
|
-
>>
|
415
|
-
|
408
|
+
ruleAttributeScopeClass ::= globalAttributeScopeClass
|
409
|
+
ruleAttributeScopeStack ::= globalAttributeScopeStack
|
416
410
|
|
417
411
|
ruleBacktrackFailure() ::= <<
|
418
412
|
<if(backtracking)>
|
@@ -420,7 +414,6 @@ ruleBacktrackFailure() ::= <<
|
|
420
414
|
<endif>
|
421
415
|
>>
|
422
416
|
|
423
|
-
|
424
417
|
ruleBody() ::= <<
|
425
418
|
<if(memoize)><if(backtracking)>
|
426
419
|
success = false # flag used for memoization<\n>
|
@@ -527,7 +520,7 @@ return_value.stop = @input.look(-1)<\n>
|
|
527
520
|
ruleMemoization(name) ::= <<
|
528
521
|
<if(memoize)>
|
529
522
|
# rule memoization
|
530
|
-
if @state.backtracking > 0 and already_parsed_rule?(__method__)
|
523
|
+
if @state.backtracking > 0 and already_parsed_rule?( __method__ )
|
531
524
|
success = true
|
532
525
|
return <ruleReturnValue()>
|
533
526
|
end<\n>
|
@@ -536,7 +529,7 @@ end<\n>
|
|
536
529
|
|
537
530
|
|
538
531
|
ruleScopeSetUp() ::= <<
|
539
|
-
<ruleDescriptor.useScopes:{@<it>_stack.push(
|
532
|
+
<ruleDescriptor.useScopes:{@<it>_stack.push(@@<it>.new)<\n>}><ruleDescriptor.ruleScope:{@<it.name>_stack.push(@@<it.name>.new)<\n>}>
|
540
533
|
>>
|
541
534
|
|
542
535
|
|
@@ -751,6 +744,7 @@ match(UP, nil)
|
|
751
744
|
*/
|
752
745
|
validateSemanticPredicate(pred,description) ::= <<
|
753
746
|
unless (<evalPredicate(...)>)
|
747
|
+
<ruleBacktrackFailure()>
|
754
748
|
raise FailedPredicate("<ruleName>", "<description>")
|
755
749
|
end
|
756
750
|
>>
|
@@ -1497,4 +1491,4 @@ placeAction(scope, name) ::= <<
|
|
1497
1491
|
<endif>
|
1498
1492
|
>>
|
1499
1493
|
|
1500
|
-
runtimeLibraryVersion() ::= "1.
|
1494
|
+
runtimeLibraryVersion() ::= "1.6.0"
|
data/templates/ST.stg
CHANGED
@@ -6,6 +6,18 @@ require 'test/unit'
|
|
6
6
|
require 'spec'
|
7
7
|
|
8
8
|
include ANTLR3::Error
|
9
|
+
|
10
|
+
describe( ANTLR3::Error ) do
|
11
|
+
|
12
|
+
example "raising an ANTLR bug exception" do
|
13
|
+
proc {
|
14
|
+
ANTLR3.bug!( 'whateva' )
|
15
|
+
}.should raise_error( ANTLR3::Bug )
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
end
|
20
|
+
|
9
21
|
#
|
10
22
|
#class TestRecognitionError < Test::Unit::TestCase
|
11
23
|
# def test_init_none
|