antlr3 1.4.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|