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
         |