ruby_parser 2.3.1 → 3.0.0.a1
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.
Potentially problematic release.
This version of ruby_parser might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
 - data/.autotest +1 -1
 - data/History.txt +69 -0
 - data/Manifest.txt +5 -1
 - data/README.txt +5 -5
 - data/Rakefile +65 -1
 - data/bin/ruby_parse +9 -1
 - data/bin/ruby_parse_extract_error +75 -0
 - data/lib/ruby18_parser.rb +5737 -0
 - data/lib/{ruby_parser.y → ruby18_parser.y} +172 -110
 - data/lib/ruby19_parser.rb +6147 -0
 - data/lib/ruby19_parser.y +2014 -0
 - data/lib/ruby_lexer.rb +130 -37
 - data/lib/ruby_parser.rb +3 -5543
 - data/lib/ruby_parser_extras.rb +195 -48
 - data/test/test_ruby_lexer.rb +94 -15
 - data/test/test_ruby_parser.rb +134 -80
 - data/test/test_ruby_parser_extras.rb +3 -0
 - metadata +51 -27
 - metadata.gz.sig +3 -1
 
    
        data/lib/ruby_parser_extras.rb
    CHANGED
    
    | 
         @@ -3,10 +3,15 @@ require 'racc/parser' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require 'sexp'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'strscan'
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
      
 6 
     | 
    
         
            +
            def d o
         
     | 
| 
      
 7 
     | 
    
         
            +
              $stderr.puts o.inspect
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       6 
10 
     | 
    
         
             
            # WHY do I have to do this?!?
         
     | 
| 
       7 
11 
     | 
    
         
             
            class Regexp
         
     | 
| 
       8 
     | 
    
         
            -
              unless defined? ONCE  
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
              ONCE = 0 unless defined? ONCE # FIX: remove this - it makes no sense
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              unless defined? ENC_NONE then
         
     | 
| 
       10 
15 
     | 
    
         
             
                ENC_NONE = /x/n.options
         
     | 
| 
       11 
16 
     | 
    
         
             
                ENC_EUC  = /x/e.options
         
     | 
| 
       12 
17 
     | 
    
         
             
                ENC_SJIS = /x/s.options
         
     | 
| 
         @@ -47,11 +52,6 @@ class RPStringScanner < StringScanner 
     | 
|
| 
       47 
52 
     | 
    
         | 
| 
       48 
53 
     | 
    
         
             
              # TODO: once we get rid of these, we can make things like
         
     | 
| 
       49 
54 
     | 
    
         
             
              # TODO: current_line and lineno much more accurate and easy to do
         
     | 
| 
       50 
     | 
    
         
            -
              def unread c # TODO: remove this entirely - we should not need it
         
     | 
| 
       51 
     | 
    
         
            -
                return if c.nil? # UGH
         
     | 
| 
       52 
     | 
    
         
            -
                warn({:unread => caller[0]}.inspect) if ENV['TALLY']
         
     | 
| 
       53 
     | 
    
         
            -
                string[pos, 0] = c
         
     | 
| 
       54 
     | 
    
         
            -
              end
         
     | 
| 
       55 
55 
     | 
    
         | 
| 
       56 
56 
     | 
    
         
             
              def unread_many str # TODO: remove this entirely - we should not need it
         
     | 
| 
       57 
57 
     | 
    
         
             
                warn({:unread_many => caller[0]}.inspect) if ENV['TALLY']
         
     | 
| 
         @@ -59,14 +59,6 @@ class RPStringScanner < StringScanner 
     | 
|
| 
       59 
59 
     | 
    
         
             
                string[pos, 0] = str
         
     | 
| 
       60 
60 
     | 
    
         
             
              end
         
     | 
| 
       61 
61 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
              def begin_of_line?
         
     | 
| 
       63 
     | 
    
         
            -
                pos == 0 or string[pos-1] == ?\n
         
     | 
| 
       64 
     | 
    
         
            -
              end
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
              def was_begin_of_line # TODO: kill me
         
     | 
| 
       67 
     | 
    
         
            -
                pos <= 2 or string[pos-2] == ?\n
         
     | 
| 
       68 
     | 
    
         
            -
              end
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
62 
     | 
    
         
             
              if ENV['DEBUG'] then
         
     | 
| 
       71 
63 
     | 
    
         
             
                alias :old_getch :getch
         
     | 
| 
       72 
64 
     | 
    
         
             
                def getch
         
     | 
| 
         @@ -78,7 +70,7 @@ class RPStringScanner < StringScanner 
     | 
|
| 
       78 
70 
     | 
    
         
             
                alias :old_scan :scan
         
     | 
| 
       79 
71 
     | 
    
         
             
                def scan re
         
     | 
| 
       80 
72 
     | 
    
         
             
                  s = old_scan re
         
     | 
| 
       81 
     | 
    
         
            -
                   
     | 
| 
      
 73 
     | 
    
         
            +
                  d :scan => [s, caller.first] if s
         
     | 
| 
       82 
74 
     | 
    
         
             
                  s
         
     | 
| 
       83 
75 
     | 
    
         
             
                end
         
     | 
| 
       84 
76 
     | 
    
         
             
              end
         
     | 
| 
         @@ -122,8 +114,8 @@ class RPStringScanner < StringScanner 
     | 
|
| 
       122 
114 
     | 
    
         
             
              # end
         
     | 
| 
       123 
115 
     | 
    
         
             
            end
         
     | 
| 
       124 
116 
     | 
    
         | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
              VERSION = ' 
     | 
| 
      
 117 
     | 
    
         
            +
            module RubyParserStuff
         
     | 
| 
      
 118 
     | 
    
         
            +
              VERSION = '3.0.0.a1' unless constants.include? "VERSION" # SIGH
         
     | 
| 
       127 
119 
     | 
    
         | 
| 
       128 
120 
     | 
    
         
             
              attr_accessor :lexer, :in_def, :in_single, :file
         
     | 
| 
       129 
121 
     | 
    
         
             
              attr_reader :env, :comments
         
     | 
| 
         @@ -149,7 +141,32 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       149 
141 
     | 
    
         
             
                node1
         
     | 
| 
       150 
142 
     | 
    
         
             
              end
         
     | 
| 
       151 
143 
     | 
    
         | 
| 
       152 
     | 
    
         
            -
              def  
     | 
| 
      
 144 
     | 
    
         
            +
              def block_var ary, splat, block
         
     | 
| 
      
 145 
     | 
    
         
            +
                ary ||= s(:array)
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                if splat then
         
     | 
| 
      
 148 
     | 
    
         
            +
                  if splat == s(:splat) then
         
     | 
| 
      
 149 
     | 
    
         
            +
                    ary << splat
         
     | 
| 
      
 150 
     | 
    
         
            +
                  else
         
     | 
| 
      
 151 
     | 
    
         
            +
                    ary << s(:splat, splat)
         
     | 
| 
      
 152 
     | 
    
         
            +
                  end
         
     | 
| 
      
 153 
     | 
    
         
            +
                end
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
                if block then
         
     | 
| 
      
 156 
     | 
    
         
            +
                  block[-1] = :"&#{block[-1]}"
         
     | 
| 
      
 157 
     | 
    
         
            +
                  ary << block
         
     | 
| 
      
 158 
     | 
    
         
            +
                end
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
                result = if ary.length > 2 or ary.splat then
         
     | 
| 
      
 161 
     | 
    
         
            +
                           s(:masgn, ary)
         
     | 
| 
      
 162 
     | 
    
         
            +
                         else
         
     | 
| 
      
 163 
     | 
    
         
            +
                           ary.last
         
     | 
| 
      
 164 
     | 
    
         
            +
                         end
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
      
 166 
     | 
    
         
            +
                result
         
     | 
| 
      
 167 
     | 
    
         
            +
              end
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
              def args arg, optarg, rest_arg, block_arg, post_arg = nil
         
     | 
| 
       153 
170 
     | 
    
         
             
                arg ||= s(:args)
         
     | 
| 
       154 
171 
     | 
    
         | 
| 
       155 
172 
     | 
    
         
             
                result = arg
         
     | 
| 
         @@ -161,15 +178,53 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       161 
178 
     | 
    
         
             
                end
         
     | 
| 
       162 
179 
     | 
    
         | 
| 
       163 
180 
     | 
    
         
             
                result << rest_arg  if rest_arg
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
       164 
182 
     | 
    
         
             
                result << :"&#{block_arg.last}" if block_arg
         
     | 
| 
       165 
183 
     | 
    
         
             
                result << optarg    if optarg # TODO? huh - processed above as well
         
     | 
| 
      
 184 
     | 
    
         
            +
                post_arg[1..-1].each {|pa| result << pa } if post_arg
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
                result
         
     | 
| 
      
 187 
     | 
    
         
            +
              end
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
              def args19 vals # TODO: migrate to args once 1.8 tests pass as well
         
     | 
| 
      
 190 
     | 
    
         
            +
                result = s(:args)
         
     | 
| 
      
 191 
     | 
    
         
            +
                block  = nil
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
                vals.each do |val|
         
     | 
| 
      
 194 
     | 
    
         
            +
                  case val
         
     | 
| 
      
 195 
     | 
    
         
            +
                  when Sexp then
         
     | 
| 
      
 196 
     | 
    
         
            +
                    case val.first
         
     | 
| 
      
 197 
     | 
    
         
            +
                    when :args then
         
     | 
| 
      
 198 
     | 
    
         
            +
                      val[1..-1].each do |name|
         
     | 
| 
      
 199 
     | 
    
         
            +
                        result << name
         
     | 
| 
      
 200 
     | 
    
         
            +
                      end
         
     | 
| 
      
 201 
     | 
    
         
            +
                    when :block_arg then
         
     | 
| 
      
 202 
     | 
    
         
            +
                      result << :"&#{val.last}"
         
     | 
| 
      
 203 
     | 
    
         
            +
                    when :block then
         
     | 
| 
      
 204 
     | 
    
         
            +
                     block = val
         
     | 
| 
      
 205 
     | 
    
         
            +
                      val[1..-1].each do |lasgn| # FIX clean sexp iter
         
     | 
| 
      
 206 
     | 
    
         
            +
                        raise "wtf? #{val.inspect}" unless lasgn[0] == :lasgn
         
     | 
| 
      
 207 
     | 
    
         
            +
                        result << lasgn[1]
         
     | 
| 
      
 208 
     | 
    
         
            +
                      end
         
     | 
| 
      
 209 
     | 
    
         
            +
                    else
         
     | 
| 
      
 210 
     | 
    
         
            +
                      raise "unhandled sexp: #{val.inspect}"
         
     | 
| 
      
 211 
     | 
    
         
            +
                    end
         
     | 
| 
      
 212 
     | 
    
         
            +
                  when Symbol then
         
     | 
| 
      
 213 
     | 
    
         
            +
                    result << val
         
     | 
| 
      
 214 
     | 
    
         
            +
                  when ",", nil then
         
     | 
| 
      
 215 
     | 
    
         
            +
                    # ignore
         
     | 
| 
      
 216 
     | 
    
         
            +
                  else
         
     | 
| 
      
 217 
     | 
    
         
            +
                    raise "unhandled val: #{val.inspect} in #{vals.inspect}"
         
     | 
| 
      
 218 
     | 
    
         
            +
                  end
         
     | 
| 
      
 219 
     | 
    
         
            +
                end
         
     | 
| 
      
 220 
     | 
    
         
            +
             
     | 
| 
      
 221 
     | 
    
         
            +
                result << block if block
         
     | 
| 
       166 
222 
     | 
    
         | 
| 
       167 
223 
     | 
    
         
             
                result
         
     | 
| 
       168 
224 
     | 
    
         
             
              end
         
     | 
| 
       169 
225 
     | 
    
         | 
| 
       170 
226 
     | 
    
         
             
              def aryset receiver, index
         
     | 
| 
       171 
     | 
    
         
            -
                 
     | 
| 
       172 
     | 
    
         
            -
                s(:attrasgn, receiver, :"[]=", index)
         
     | 
| 
      
 227 
     | 
    
         
            +
                s(:attrasgn, receiver, :"[]=", *index[1..-1])
         
     | 
| 
       173 
228 
     | 
    
         
             
              end
         
     | 
| 
       174 
229 
     | 
    
         | 
| 
       175 
230 
     | 
    
         
             
              def assignable(lhs, value = nil)
         
     | 
| 
         @@ -288,7 +343,7 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       288 
343 
     | 
    
         
             
                  end
         
     | 
| 
       289 
344 
     | 
    
         
             
                end
         
     | 
| 
       290 
345 
     | 
    
         | 
| 
       291 
     | 
    
         
            -
                return  
     | 
| 
      
 346 
     | 
    
         
            +
                return new_call(lhs, :"=~", argl(rhs)).line(lhs.line)
         
     | 
| 
       292 
347 
     | 
    
         
             
              end
         
     | 
| 
       293 
348 
     | 
    
         | 
| 
       294 
349 
     | 
    
         
             
              def gettable(id)
         
     | 
| 
         @@ -307,10 +362,8 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       307 
362 
     | 
    
         
             
                           type = env[id]
         
     | 
| 
       308 
363 
     | 
    
         
             
                           if type then
         
     | 
| 
       309 
364 
     | 
    
         
             
                             s(type, id)
         
     | 
| 
       310 
     | 
    
         
            -
                           elsif env.dynamic? and :dvar == env[id] then
         
     | 
| 
       311 
     | 
    
         
            -
                             s(:lvar, id)
         
     | 
| 
       312 
365 
     | 
    
         
             
                           else
         
     | 
| 
       313 
     | 
    
         
            -
                              
     | 
| 
      
 366 
     | 
    
         
            +
                             new_call(nil, id)
         
     | 
| 
       314 
367 
     | 
    
         
             
                           end
         
     | 
| 
       315 
368 
     | 
    
         
             
                         end
         
     | 
| 
       316 
369 
     | 
    
         | 
| 
         @@ -332,7 +385,9 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       332 
385 
     | 
    
         | 
| 
       333 
386 
     | 
    
         
             
              def initialize(options = {})
         
     | 
| 
       334 
387 
     | 
    
         
             
                super()
         
     | 
| 
       335 
     | 
    
         
            -
             
     | 
| 
      
 388 
     | 
    
         
            +
             
     | 
| 
      
 389 
     | 
    
         
            +
                v = self.class.name[/1[89]/]
         
     | 
| 
      
 390 
     | 
    
         
            +
                self.lexer = RubyLexer.new v && v.to_i
         
     | 
| 
       336 
391 
     | 
    
         
             
                self.lexer.parser = self
         
     | 
| 
       337 
392 
     | 
    
         
             
                @env = Environment.new
         
     | 
| 
       338 
393 
     | 
    
         
             
                @comments = []
         
     | 
| 
         @@ -453,14 +508,37 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       453 
508 
     | 
    
         
             
                return result
         
     | 
| 
       454 
509 
     | 
    
         
             
              end
         
     | 
| 
       455 
510 
     | 
    
         | 
| 
      
 511 
     | 
    
         
            +
              def argl x
         
     | 
| 
      
 512 
     | 
    
         
            +
                x = s(:arglist, x) if x and x[0] != :arglist
         
     | 
| 
      
 513 
     | 
    
         
            +
                x
         
     | 
| 
      
 514 
     | 
    
         
            +
              end
         
     | 
| 
      
 515 
     | 
    
         
            +
             
     | 
| 
      
 516 
     | 
    
         
            +
              def backref_assign_error ref
         
     | 
| 
      
 517 
     | 
    
         
            +
                # TODO: need a test for this... obviously
         
     | 
| 
      
 518 
     | 
    
         
            +
                case ref.first
         
     | 
| 
      
 519 
     | 
    
         
            +
                when :nth_ref then
         
     | 
| 
      
 520 
     | 
    
         
            +
                  raise SyntaxError, "Can't set variable %p" % ref.last
         
     | 
| 
      
 521 
     | 
    
         
            +
                when :back_ref then
         
     | 
| 
      
 522 
     | 
    
         
            +
                  raise SyntaxError, "Can't set back reference %p" % ref.last
         
     | 
| 
      
 523 
     | 
    
         
            +
                else
         
     | 
| 
      
 524 
     | 
    
         
            +
                  raise "Unknown backref type: #{ref.inspect}"
         
     | 
| 
      
 525 
     | 
    
         
            +
                end
         
     | 
| 
      
 526 
     | 
    
         
            +
              end
         
     | 
| 
      
 527 
     | 
    
         
            +
             
     | 
| 
       456 
528 
     | 
    
         
             
              def new_call recv, meth, args = nil
         
     | 
| 
       457 
529 
     | 
    
         
             
                result = s(:call, recv, meth)
         
     | 
| 
       458 
530 
     | 
    
         
             
                result.line = recv.line if recv
         
     | 
| 
       459 
531 
     | 
    
         | 
| 
      
 532 
     | 
    
         
            +
                # TODO: need a test with f(&b) to produce block_pass
         
     | 
| 
      
 533 
     | 
    
         
            +
                # TODO: need a test with f(&b) { } to produce warning
         
     | 
| 
      
 534 
     | 
    
         
            +
             
     | 
| 
       460 
535 
     | 
    
         
             
                args ||= s(:arglist)
         
     | 
| 
       461 
536 
     | 
    
         
             
                args[0] = :arglist if args.first == :array
         
     | 
| 
       462 
537 
     | 
    
         
             
                args = s(:arglist, args) unless args.first == :arglist
         
     | 
| 
       463 
     | 
    
         
            -
             
     | 
| 
      
 538 
     | 
    
         
            +
             
     | 
| 
      
 539 
     | 
    
         
            +
                # HACK quick hack to make this work quickly... easy to clean up above
         
     | 
| 
      
 540 
     | 
    
         
            +
                result.concat args[1..-1]
         
     | 
| 
      
 541 
     | 
    
         
            +
             
     | 
| 
       464 
542 
     | 
    
         
             
                result
         
     | 
| 
       465 
543 
     | 
    
         
             
              end
         
     | 
| 
       466 
544 
     | 
    
         | 
| 
         @@ -473,6 +551,11 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       473 
551 
     | 
    
         
             
                  body = body.delete_at 3
         
     | 
| 
       474 
552 
     | 
    
         
             
                end
         
     | 
| 
       475 
553 
     | 
    
         | 
| 
      
 554 
     | 
    
         
            +
                result[2..-1].each do |node|
         
     | 
| 
      
 555 
     | 
    
         
            +
                  block = node.block(:delete)
         
     | 
| 
      
 556 
     | 
    
         
            +
                  node.concat block[1..-1] if block
         
     | 
| 
      
 557 
     | 
    
         
            +
                end
         
     | 
| 
      
 558 
     | 
    
         
            +
             
     | 
| 
       476 
559 
     | 
    
         
             
                # else
         
     | 
| 
       477 
560 
     | 
    
         
             
                body = nil if body == s(:block)
         
     | 
| 
       478 
561 
     | 
    
         
             
                result << body
         
     | 
| 
         @@ -483,8 +566,17 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       483 
566 
     | 
    
         | 
| 
       484 
567 
     | 
    
         
             
              def new_class val
         
     | 
| 
       485 
568 
     | 
    
         
             
                line, path, superclass, body = val[1], val[2], val[3], val[5]
         
     | 
| 
       486 
     | 
    
         
            -
             
     | 
| 
       487 
     | 
    
         
            -
                result = s(:class, path, superclass 
     | 
| 
      
 569 
     | 
    
         
            +
             
     | 
| 
      
 570 
     | 
    
         
            +
                result = s(:class, path, superclass)
         
     | 
| 
      
 571 
     | 
    
         
            +
             
     | 
| 
      
 572 
     | 
    
         
            +
                if body then
         
     | 
| 
      
 573 
     | 
    
         
            +
                  if body.first == :block then
         
     | 
| 
      
 574 
     | 
    
         
            +
                    result.push(*body[1..-1])
         
     | 
| 
      
 575 
     | 
    
         
            +
                  else
         
     | 
| 
      
 576 
     | 
    
         
            +
                    result.push body
         
     | 
| 
      
 577 
     | 
    
         
            +
                  end
         
     | 
| 
      
 578 
     | 
    
         
            +
                end
         
     | 
| 
      
 579 
     | 
    
         
            +
             
     | 
| 
       488 
580 
     | 
    
         
             
                result.line = line
         
     | 
| 
       489 
581 
     | 
    
         
             
                result.comments = self.comments.pop
         
     | 
| 
       490 
582 
     | 
    
         
             
                result
         
     | 
| 
         @@ -500,10 +592,16 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       500 
592 
     | 
    
         
             
                (_, line), name, args, body = val[0], val[1], val[3], val[4]
         
     | 
| 
       501 
593 
     | 
    
         
             
                body ||= s(:nil)
         
     | 
| 
       502 
594 
     | 
    
         | 
| 
       503 
     | 
    
         
            -
                 
     | 
| 
       504 
     | 
    
         
            -
             
     | 
| 
      
 595 
     | 
    
         
            +
                result = s(:defn, name.to_sym, args)
         
     | 
| 
      
 596 
     | 
    
         
            +
             
     | 
| 
      
 597 
     | 
    
         
            +
                if body then
         
     | 
| 
      
 598 
     | 
    
         
            +
                  if body.first == :block then
         
     | 
| 
      
 599 
     | 
    
         
            +
                    result.push(*body[1..-1])
         
     | 
| 
      
 600 
     | 
    
         
            +
                  else
         
     | 
| 
      
 601 
     | 
    
         
            +
                    result.push body
         
     | 
| 
      
 602 
     | 
    
         
            +
                  end
         
     | 
| 
      
 603 
     | 
    
         
            +
                end
         
     | 
| 
       505 
604 
     | 
    
         | 
| 
       506 
     | 
    
         
            -
                result = s(:defn, name.to_sym, args, s(:scope, body))
         
     | 
| 
       507 
605 
     | 
    
         
             
                result.line = line
         
     | 
| 
       508 
606 
     | 
    
         
             
                result.comments = self.comments.pop
         
     | 
| 
       509 
607 
     | 
    
         
             
                result
         
     | 
| 
         @@ -512,10 +610,16 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       512 
610 
     | 
    
         
             
              def new_defs val
         
     | 
| 
       513 
611 
     | 
    
         
             
                recv, name, args, body = val[1], val[4], val[6], val[7]
         
     | 
| 
       514 
612 
     | 
    
         | 
| 
       515 
     | 
    
         
            -
                 
     | 
| 
       516 
     | 
    
         
            -
             
     | 
| 
      
 613 
     | 
    
         
            +
                result = s(:defs, recv, name.to_sym, args)
         
     | 
| 
      
 614 
     | 
    
         
            +
             
     | 
| 
      
 615 
     | 
    
         
            +
                if body then
         
     | 
| 
      
 616 
     | 
    
         
            +
                  if body.first == :block then
         
     | 
| 
      
 617 
     | 
    
         
            +
                    result.push(*body[1..-1])
         
     | 
| 
      
 618 
     | 
    
         
            +
                  else
         
     | 
| 
      
 619 
     | 
    
         
            +
                    result.push body
         
     | 
| 
      
 620 
     | 
    
         
            +
                  end
         
     | 
| 
      
 621 
     | 
    
         
            +
                end
         
     | 
| 
       517 
622 
     | 
    
         | 
| 
       518 
     | 
    
         
            -
                result = s(:defs, recv, name.to_sym, args, s(:scope, body))
         
     | 
| 
       519 
623 
     | 
    
         
             
                result.line = recv.line
         
     | 
| 
       520 
624 
     | 
    
         
             
                result.comments = self.comments.pop
         
     | 
| 
       521 
625 
     | 
    
         
             
                result
         
     | 
| 
         @@ -555,7 +659,7 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       555 
659 
     | 
    
         
             
              def new_module val
         
     | 
| 
       556 
660 
     | 
    
         
             
                line, path, body = val[1], val[2], val[4]
         
     | 
| 
       557 
661 
     | 
    
         
             
                body = s(:scope, body).compact
         
     | 
| 
       558 
     | 
    
         
            -
                result = s(:module, path, body)
         
     | 
| 
      
 662 
     | 
    
         
            +
                result = s(:module, path, *body[1..-1])
         
     | 
| 
       559 
663 
     | 
    
         
             
                result.line = line
         
     | 
| 
       560 
664 
     | 
    
         
             
                result.comments = self.comments.pop
         
     | 
| 
       561 
665 
     | 
    
         
             
                result
         
     | 
| 
         @@ -574,8 +678,7 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       574 
678 
     | 
    
         
             
                           s(:op_asgn_and, self.gettable(name), lhs)
         
     | 
| 
       575 
679 
     | 
    
         
             
                         else
         
     | 
| 
       576 
680 
     | 
    
         
             
                           # TODO: why [2] ?
         
     | 
| 
       577 
     | 
    
         
            -
                           lhs[2] = new_call(self.gettable(name), asgn_op,
         
     | 
| 
       578 
     | 
    
         
            -
                                             s(:arglist, arg))
         
     | 
| 
      
 681 
     | 
    
         
            +
                           lhs[2] = new_call(self.gettable(name), asgn_op, argl(arg))
         
     | 
| 
       579 
682 
     | 
    
         
             
                           lhs
         
     | 
| 
       580 
683 
     | 
    
         
             
                         end
         
     | 
| 
       581 
684 
     | 
    
         
             
                result.line = lhs.line
         
     | 
| 
         @@ -627,10 +730,28 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       627 
730 
     | 
    
         
             
                node
         
     | 
| 
       628 
731 
     | 
    
         
             
              end
         
     | 
| 
       629 
732 
     | 
    
         | 
| 
      
 733 
     | 
    
         
            +
              def new_resbody cond, body
         
     | 
| 
      
 734 
     | 
    
         
            +
                if body && body.first == :block then
         
     | 
| 
      
 735 
     | 
    
         
            +
                  body.shift # remove block and splat it in directly
         
     | 
| 
      
 736 
     | 
    
         
            +
                else
         
     | 
| 
      
 737 
     | 
    
         
            +
                  body = [body]
         
     | 
| 
      
 738 
     | 
    
         
            +
                end
         
     | 
| 
      
 739 
     | 
    
         
            +
                s(:resbody, cond, *body)
         
     | 
| 
      
 740 
     | 
    
         
            +
              end
         
     | 
| 
      
 741 
     | 
    
         
            +
             
     | 
| 
       630 
742 
     | 
    
         
             
              def new_sclass val
         
     | 
| 
       631 
743 
     | 
    
         
             
                recv, in_def, in_single, body = val[3], val[4], val[6], val[7]
         
     | 
| 
       632 
     | 
    
         
            -
             
     | 
| 
       633 
     | 
    
         
            -
                result = s(:sclass, recv 
     | 
| 
      
 744 
     | 
    
         
            +
             
     | 
| 
      
 745 
     | 
    
         
            +
                result = s(:sclass, recv)
         
     | 
| 
      
 746 
     | 
    
         
            +
             
     | 
| 
      
 747 
     | 
    
         
            +
                if body then
         
     | 
| 
      
 748 
     | 
    
         
            +
                  if body.first == :block then
         
     | 
| 
      
 749 
     | 
    
         
            +
                    result.push(*body[1..-1])
         
     | 
| 
      
 750 
     | 
    
         
            +
                  else
         
     | 
| 
      
 751 
     | 
    
         
            +
                    result.push body
         
     | 
| 
      
 752 
     | 
    
         
            +
                  end
         
     | 
| 
      
 753 
     | 
    
         
            +
                end
         
     | 
| 
      
 754 
     | 
    
         
            +
             
     | 
| 
       634 
755 
     | 
    
         
             
                result.line = val[2]
         
     | 
| 
       635 
756 
     | 
    
         
             
                self.in_def = in_def
         
     | 
| 
       636 
757 
     | 
    
         
             
                self.in_single = in_single
         
     | 
| 
         @@ -654,6 +775,10 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       654 
775 
     | 
    
         
             
                end
         
     | 
| 
       655 
776 
     | 
    
         
             
              end
         
     | 
| 
       656 
777 
     | 
    
         | 
| 
      
 778 
     | 
    
         
            +
              def new_until block, expr, pre
         
     | 
| 
      
 779 
     | 
    
         
            +
                new_until_or_while :until, block, expr, pre
         
     | 
| 
      
 780 
     | 
    
         
            +
              end
         
     | 
| 
      
 781 
     | 
    
         
            +
             
     | 
| 
       657 
782 
     | 
    
         
             
              def new_until_or_while type, block, expr, pre
         
     | 
| 
       658 
783 
     | 
    
         
             
                other = type == :until ? :while : :until
         
     | 
| 
       659 
784 
     | 
    
         
             
                line = [block && block.line, expr.line].compact.min
         
     | 
| 
         @@ -671,8 +796,8 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       671 
796 
     | 
    
         
             
                result
         
     | 
| 
       672 
797 
     | 
    
         
             
              end
         
     | 
| 
       673 
798 
     | 
    
         | 
| 
       674 
     | 
    
         
            -
              def  
     | 
| 
       675 
     | 
    
         
            -
                 
     | 
| 
      
 799 
     | 
    
         
            +
              def new_when cond, body
         
     | 
| 
      
 800 
     | 
    
         
            +
                s(:when, cond, body)
         
     | 
| 
       676 
801 
     | 
    
         
             
              end
         
     | 
| 
       677 
802 
     | 
    
         | 
| 
       678 
803 
     | 
    
         
             
              def new_while block, expr, pre
         
     | 
| 
         @@ -723,12 +848,11 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       723 
848 
     | 
    
         
             
                rhs = value_expr rhs
         
     | 
| 
       724 
849 
     | 
    
         | 
| 
       725 
850 
     | 
    
         
             
                case lhs[0]
         
     | 
| 
       726 
     | 
    
         
            -
                when :gasgn, :iasgn, :lasgn, : 
     | 
| 
       727 
     | 
    
         
            -
                  :masgn, :cdecl, :cvdecl, :cvasgn then
         
     | 
| 
      
 851 
     | 
    
         
            +
                when :gasgn, :iasgn, :lasgn, :masgn, :cdecl, :cvdecl, :cvasgn then
         
     | 
| 
       728 
852 
     | 
    
         
             
                  lhs << rhs
         
     | 
| 
       729 
853 
     | 
    
         
             
                when :attrasgn, :call then
         
     | 
| 
       730 
854 
     | 
    
         
             
                  args = lhs.pop unless Symbol === lhs.last
         
     | 
| 
       731 
     | 
    
         
            -
                  lhs  
     | 
| 
      
 855 
     | 
    
         
            +
                  lhs.concat arg_add(args, rhs)[1..-1]
         
     | 
| 
       732 
856 
     | 
    
         
             
                when :const then
         
     | 
| 
       733 
857 
     | 
    
         
             
                  lhs[0] = :cdecl
         
     | 
| 
       734 
858 
     | 
    
         
             
                  lhs << rhs
         
     | 
| 
         @@ -743,7 +867,7 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       743 
867 
     | 
    
         
             
                raise "bad val: #{str.inspect}" unless String === str
         
     | 
| 
       744 
868 
     | 
    
         | 
| 
       745 
869 
     | 
    
         
             
                self.file = file
         
     | 
| 
       746 
     | 
    
         
            -
                self.lexer.src = str
         
     | 
| 
      
 870 
     | 
    
         
            +
                self.lexer.src = str.dup
         
     | 
| 
       747 
871 
     | 
    
         | 
| 
       748 
872 
     | 
    
         
             
                @yydebug = ENV.has_key? 'DEBUG'
         
     | 
| 
       749 
873 
     | 
    
         | 
| 
         @@ -809,10 +933,9 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       809 
933 
     | 
    
         
             
                # do nothing for now
         
     | 
| 
       810 
934 
     | 
    
         
             
              end
         
     | 
| 
       811 
935 
     | 
    
         | 
| 
       812 
     | 
    
         
            -
              alias :old_yyerror :yyerror
         
     | 
| 
       813 
936 
     | 
    
         
             
              def yyerror msg
         
     | 
| 
       814 
937 
     | 
    
         
             
                # for now do nothing with the msg
         
     | 
| 
       815 
     | 
    
         
            -
                 
     | 
| 
      
 938 
     | 
    
         
            +
                super
         
     | 
| 
       816 
939 
     | 
    
         
             
              end
         
     | 
| 
       817 
940 
     | 
    
         | 
| 
       818 
941 
     | 
    
         
             
              class Keyword
         
     | 
| 
         @@ -998,6 +1121,22 @@ class RubyParser < Racc::Parser 
     | 
|
| 
       998 
1121 
     | 
    
         
             
              end
         
     | 
| 
       999 
1122 
     | 
    
         
             
            end
         
     | 
| 
       1000 
1123 
     | 
    
         | 
| 
      
 1124 
     | 
    
         
            +
            class Ruby19Parser < Racc::Parser
         
     | 
| 
      
 1125 
     | 
    
         
            +
              include RubyParserStuff
         
     | 
| 
      
 1126 
     | 
    
         
            +
            end
         
     | 
| 
      
 1127 
     | 
    
         
            +
             
     | 
| 
      
 1128 
     | 
    
         
            +
            class Ruby18Parser < Racc::Parser
         
     | 
| 
      
 1129 
     | 
    
         
            +
              include RubyParserStuff
         
     | 
| 
      
 1130 
     | 
    
         
            +
            end
         
     | 
| 
      
 1131 
     | 
    
         
            +
             
     | 
| 
      
 1132 
     | 
    
         
            +
            class RubyParser < Ruby18Parser
         
     | 
| 
      
 1133 
     | 
    
         
            +
              def initialize
         
     | 
| 
      
 1134 
     | 
    
         
            +
                super
         
     | 
| 
      
 1135 
     | 
    
         
            +
                warn "WA\RNING: Deprecated: RubyParser. Use Ruby18Parser or Ruby19Parser"
         
     | 
| 
      
 1136 
     | 
    
         
            +
                warn "  from #{caller.first}"
         
     | 
| 
      
 1137 
     | 
    
         
            +
              end
         
     | 
| 
      
 1138 
     | 
    
         
            +
            end
         
     | 
| 
      
 1139 
     | 
    
         
            +
             
     | 
| 
       1001 
1140 
     | 
    
         
             
            ############################################################
         
     | 
| 
       1002 
1141 
     | 
    
         
             
            # HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK
         
     | 
| 
       1003 
1142 
     | 
    
         | 
| 
         @@ -1023,6 +1162,14 @@ class Sexp 
     | 
|
| 
       1023 
1162 
     | 
    
         
             
                self.value.to_sym
         
     | 
| 
       1024 
1163 
     | 
    
         
             
              end
         
     | 
| 
       1025 
1164 
     | 
    
         | 
| 
      
 1165 
     | 
    
         
            +
              def add x
         
     | 
| 
      
 1166 
     | 
    
         
            +
                raise "no" # TODO: need a test to trigger this
         
     | 
| 
      
 1167 
     | 
    
         
            +
              end
         
     | 
| 
      
 1168 
     | 
    
         
            +
             
     | 
| 
      
 1169 
     | 
    
         
            +
              def add_all x
         
     | 
| 
      
 1170 
     | 
    
         
            +
                raise "no" # TODO: need a test to trigger this
         
     | 
| 
      
 1171 
     | 
    
         
            +
              end
         
     | 
| 
      
 1172 
     | 
    
         
            +
             
     | 
| 
       1026 
1173 
     | 
    
         
             
              alias :node_type :sexp_type
         
     | 
| 
       1027 
1174 
     | 
    
         
             
              alias :values :sexp_body # TODO: retire
         
     | 
| 
       1028 
1175 
     | 
    
         
             
            end
         
     | 
    
        data/test/test_ruby_lexer.rb
    CHANGED
    
    | 
         @@ -1,15 +1,21 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #!/usr/local/bin/ruby
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
      
 4 
     | 
    
         
            +
            gem "minitest"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
       4 
6 
     | 
    
         
             
            require 'minitest/autorun'
         
     | 
| 
       5 
7 
     | 
    
         
             
            require 'ruby_lexer'
         
     | 
| 
       6 
     | 
    
         
            -
            require ' 
     | 
| 
      
 8 
     | 
    
         
            +
            require 'ruby18_parser'
         
     | 
| 
       7 
9 
     | 
    
         | 
| 
       8 
10 
     | 
    
         
             
            class TestRubyLexer < MiniTest::Unit::TestCase
         
     | 
| 
       9 
11 
     | 
    
         
             
              alias :deny :refute
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
              def setup
         
     | 
| 
       12 
     | 
    
         
            -
                 
     | 
| 
      
 14 
     | 
    
         
            +
                setup_lexer Ruby18Parser
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              def setup_lexer parser_class
         
     | 
| 
      
 18 
     | 
    
         
            +
                p = parser_class.new
         
     | 
| 
       13 
19 
     | 
    
         
             
                @lex = p.lexer
         
     | 
| 
       14 
20 
     | 
    
         
             
                @lex.src = "blah blah"
         
     | 
| 
       15 
21 
     | 
    
         
             
                @lex.lex_state = :expr_beg
         
     | 
| 
         @@ -125,6 +131,38 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       125 
131 
     | 
    
         
             
                util_lex_token "=>", :tASSOC, "=>"
         
     | 
| 
       126 
132 
     | 
    
         
             
              end
         
     | 
| 
       127 
133 
     | 
    
         | 
| 
      
 134 
     | 
    
         
            +
              def test_yylex_label__18
         
     | 
| 
      
 135 
     | 
    
         
            +
                util_lex_token("{a:",
         
     | 
| 
      
 136 
     | 
    
         
            +
                               :tLBRACE,     "{",
         
     | 
| 
      
 137 
     | 
    
         
            +
                               :tIDENTIFIER, "a",
         
     | 
| 
      
 138 
     | 
    
         
            +
                               :tSYMBEG,     ":")
         
     | 
| 
      
 139 
     | 
    
         
            +
              end
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
              def test_yylex_label_in_params__18
         
     | 
| 
      
 142 
     | 
    
         
            +
                util_lex_token("foo(a:",
         
     | 
| 
      
 143 
     | 
    
         
            +
                               :tIDENTIFIER, "foo",
         
     | 
| 
      
 144 
     | 
    
         
            +
                               :tLPAREN2,    "(",
         
     | 
| 
      
 145 
     | 
    
         
            +
                               :tIDENTIFIER, "a",
         
     | 
| 
      
 146 
     | 
    
         
            +
                               :tSYMBEG,     ":")
         
     | 
| 
      
 147 
     | 
    
         
            +
              end
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
              def test_yylex_label__19
         
     | 
| 
      
 150 
     | 
    
         
            +
                setup_lexer Ruby19Parser
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
                util_lex_token("{a:",
         
     | 
| 
      
 153 
     | 
    
         
            +
                               :tLBRACE, "{",
         
     | 
| 
      
 154 
     | 
    
         
            +
                               :tLABEL,  "a")
         
     | 
| 
      
 155 
     | 
    
         
            +
              end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
              def test_yylex_label_in_params__19
         
     | 
| 
      
 158 
     | 
    
         
            +
                setup_lexer Ruby19Parser
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
                util_lex_token("foo(a:",
         
     | 
| 
      
 161 
     | 
    
         
            +
                               :tIDENTIFIER, "foo",
         
     | 
| 
      
 162 
     | 
    
         
            +
                               :tLPAREN2,    "(",
         
     | 
| 
      
 163 
     | 
    
         
            +
                               :tLABEL,      "a")
         
     | 
| 
      
 164 
     | 
    
         
            +
              end
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
       128 
166 
     | 
    
         
             
              def test_yylex_back_ref
         
     | 
| 
       129 
167 
     | 
    
         
             
                util_lex_token("[$&, $`, $', $+]",
         
     | 
| 
       130 
168 
     | 
    
         
             
                               :tLBRACK,   "[",
         
     | 
| 
         @@ -610,7 +648,6 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       610 
648 
     | 
    
         
             
                               :tEQL,              "=",
         
     | 
| 
       611 
649 
     | 
    
         
             
                               :tSTRING_BEG,     "\"",
         
     | 
| 
       612 
650 
     | 
    
         
             
                               :tSTRING_CONTENT, "blah\nblah\n",
         
     | 
| 
       613 
     | 
    
         
            -
                               :tSTRING_CONTENT, "",
         
     | 
| 
       614 
651 
     | 
    
         
             
                               :tSTRING_END,     "EOF",
         
     | 
| 
       615 
652 
     | 
    
         
             
                               :tNL,             nil)
         
     | 
| 
       616 
653 
     | 
    
         
             
              end
         
     | 
| 
         @@ -628,7 +665,6 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       628 
665 
     | 
    
         
             
                               :tEQL,              "=",
         
     | 
| 
       629 
666 
     | 
    
         
             
                               :tSTRING_BEG,     "\"",
         
     | 
| 
       630 
667 
     | 
    
         
             
                               :tSTRING_CONTENT, "blah\nblah\n",
         
     | 
| 
       631 
     | 
    
         
            -
                               :tSTRING_CONTENT, "",
         
     | 
| 
       632 
668 
     | 
    
         
             
                               :tSTRING_END,     "EOF",
         
     | 
| 
       633 
669 
     | 
    
         
             
                               :tNL,             nil)
         
     | 
| 
       634 
670 
     | 
    
         
             
              end
         
     | 
| 
         @@ -805,14 +841,30 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       805 
841 
     | 
    
         
             
                util_bad_token "0d42__24"
         
     | 
| 
       806 
842 
     | 
    
         
             
              end
         
     | 
| 
       807 
843 
     | 
    
         | 
| 
       808 
     | 
    
         
            -
              def  
     | 
| 
       809 
     | 
    
         
            -
                 
     | 
| 
      
 844 
     | 
    
         
            +
              def test_yylex_question_eh_a__18
         
     | 
| 
      
 845 
     | 
    
         
            +
                @lex = RubyLexer.new 18
         
     | 
| 
      
 846 
     | 
    
         
            +
             
     | 
| 
      
 847 
     | 
    
         
            +
                util_lex_token "?a", :tINTEGER, 97
         
     | 
| 
      
 848 
     | 
    
         
            +
              end
         
     | 
| 
      
 849 
     | 
    
         
            +
             
     | 
| 
      
 850 
     | 
    
         
            +
              def test_yylex_question_eh_a__19
         
     | 
| 
      
 851 
     | 
    
         
            +
                @lex = RubyLexer.new 19
         
     | 
| 
      
 852 
     | 
    
         
            +
             
     | 
| 
      
 853 
     | 
    
         
            +
                util_lex_token '?a', :tSTRING, "a"
         
     | 
| 
       810 
854 
     | 
    
         
             
              end
         
     | 
| 
       811 
855 
     | 
    
         | 
| 
       812 
     | 
    
         
            -
              def  
     | 
| 
      
 856 
     | 
    
         
            +
              def test_yylex_question_eh_escape_M_escape_C__18
         
     | 
| 
      
 857 
     | 
    
         
            +
                @lex = RubyLexer.new 18
         
     | 
| 
      
 858 
     | 
    
         
            +
             
     | 
| 
       813 
859 
     | 
    
         
             
                util_lex_token '?\M-\C-a', :tINTEGER, 129
         
     | 
| 
       814 
860 
     | 
    
         
             
              end
         
     | 
| 
       815 
861 
     | 
    
         | 
| 
      
 862 
     | 
    
         
            +
              def test_yylex_question_eh_escape_M_escape_C__19
         
     | 
| 
      
 863 
     | 
    
         
            +
                @lex = RubyLexer.new 19
         
     | 
| 
      
 864 
     | 
    
         
            +
             
     | 
| 
      
 865 
     | 
    
         
            +
                util_lex_token '?\M-\C-a', :tSTRING, "\M-\C-a"
         
     | 
| 
      
 866 
     | 
    
         
            +
              end
         
     | 
| 
      
 867 
     | 
    
         
            +
             
     | 
| 
       816 
868 
     | 
    
         
             
              def test_yylex_integer_hex
         
     | 
| 
       817 
869 
     | 
    
         
             
                util_lex_token "0x2a", :tINTEGER, 42
         
     | 
| 
       818 
870 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1028,7 +1080,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1028 
1080 
     | 
    
         
             
              def test_yylex_open_square_bracket_meth
         
     | 
| 
       1029 
1081 
     | 
    
         
             
                util_lex_token("m[3]",
         
     | 
| 
       1030 
1082 
     | 
    
         
             
                               :tIDENTIFIER, "m",
         
     | 
| 
       1031 
     | 
    
         
            -
                                
     | 
| 
      
 1083 
     | 
    
         
            +
                               :tLBRACK2, "[",
         
     | 
| 
       1032 
1084 
     | 
    
         
             
                               :tINTEGER, 3,
         
     | 
| 
       1033 
1085 
     | 
    
         
             
                               :tRBRACK, "]")
         
     | 
| 
       1034 
1086 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1089,10 +1141,18 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1089 
1141 
     | 
    
         
             
                               :tINTEGER, 42)
         
     | 
| 
       1090 
1142 
     | 
    
         
             
              end
         
     | 
| 
       1091 
1143 
     | 
    
         | 
| 
       1092 
     | 
    
         
            -
              def  
     | 
| 
      
 1144 
     | 
    
         
            +
              def test_yylex_question__18
         
     | 
| 
      
 1145 
     | 
    
         
            +
                @lex = RubyLexer.new 18
         
     | 
| 
      
 1146 
     | 
    
         
            +
             
     | 
| 
       1093 
1147 
     | 
    
         
             
                util_lex_token "?*", :tINTEGER, 42
         
     | 
| 
       1094 
1148 
     | 
    
         
             
              end
         
     | 
| 
       1095 
1149 
     | 
    
         | 
| 
      
 1150 
     | 
    
         
            +
              def test_yylex_question__19
         
     | 
| 
      
 1151 
     | 
    
         
            +
                @lex = RubyLexer.new 19
         
     | 
| 
      
 1152 
     | 
    
         
            +
             
     | 
| 
      
 1153 
     | 
    
         
            +
                util_lex_token "?*", :tSTRING, "*"
         
     | 
| 
      
 1154 
     | 
    
         
            +
              end
         
     | 
| 
      
 1155 
     | 
    
         
            +
             
     | 
| 
       1096 
1156 
     | 
    
         
             
              def test_yylex_question_bad_eos
         
     | 
| 
       1097 
1157 
     | 
    
         
             
                util_bad_token "?"
         
     | 
| 
       1098 
1158 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1106,7 +1166,9 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1106 
1166 
     | 
    
         
             
                util_lex_token "?\f", :tEH, "?"
         
     | 
| 
       1107 
1167 
     | 
    
         
             
              end
         
     | 
| 
       1108 
1168 
     | 
    
         | 
| 
       1109 
     | 
    
         
            -
              def  
     | 
| 
      
 1169 
     | 
    
         
            +
              def test_yylex_question_ws_backslashed__18
         
     | 
| 
      
 1170 
     | 
    
         
            +
                @lex = RubyLexer.new 18
         
     | 
| 
      
 1171 
     | 
    
         
            +
             
     | 
| 
       1110 
1172 
     | 
    
         
             
                @lex.lex_state = :expr_beg
         
     | 
| 
       1111 
1173 
     | 
    
         
             
                util_lex_token "?\\ ", :tINTEGER, 32
         
     | 
| 
       1112 
1174 
     | 
    
         
             
                @lex.lex_state = :expr_beg
         
     | 
| 
         @@ -1121,6 +1183,23 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1121 
1183 
     | 
    
         
             
                util_lex_token "?\\f", :tINTEGER, 12
         
     | 
| 
       1122 
1184 
     | 
    
         
             
              end
         
     | 
| 
       1123 
1185 
     | 
    
         | 
| 
      
 1186 
     | 
    
         
            +
              def test_yylex_question_ws_backslashed__19
         
     | 
| 
      
 1187 
     | 
    
         
            +
                @lex = RubyLexer.new 19
         
     | 
| 
      
 1188 
     | 
    
         
            +
             
     | 
| 
      
 1189 
     | 
    
         
            +
                @lex.lex_state = :expr_beg
         
     | 
| 
      
 1190 
     | 
    
         
            +
                util_lex_token "?\\ ", :tSTRING, " "
         
     | 
| 
      
 1191 
     | 
    
         
            +
                @lex.lex_state = :expr_beg
         
     | 
| 
      
 1192 
     | 
    
         
            +
                util_lex_token "?\\n", :tSTRING, "\n"
         
     | 
| 
      
 1193 
     | 
    
         
            +
                @lex.lex_state = :expr_beg
         
     | 
| 
      
 1194 
     | 
    
         
            +
                util_lex_token "?\\t", :tSTRING, "\t"
         
     | 
| 
      
 1195 
     | 
    
         
            +
                @lex.lex_state = :expr_beg
         
     | 
| 
      
 1196 
     | 
    
         
            +
                util_lex_token "?\\v", :tSTRING, "\v"
         
     | 
| 
      
 1197 
     | 
    
         
            +
                @lex.lex_state = :expr_beg
         
     | 
| 
      
 1198 
     | 
    
         
            +
                util_lex_token "?\\r", :tSTRING, "\r"
         
     | 
| 
      
 1199 
     | 
    
         
            +
                @lex.lex_state = :expr_beg
         
     | 
| 
      
 1200 
     | 
    
         
            +
                util_lex_token "?\\f", :tSTRING, "\f"
         
     | 
| 
      
 1201 
     | 
    
         
            +
              end
         
     | 
| 
      
 1202 
     | 
    
         
            +
             
     | 
| 
       1124 
1203 
     | 
    
         
             
              def test_yylex_rbracket
         
     | 
| 
       1125 
1204 
     | 
    
         
             
                util_lex_token "]", :tRBRACK, "]"
         
     | 
| 
       1126 
1205 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1614,7 +1693,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1614 
1693 
     | 
    
         | 
| 
       1615 
1694 
     | 
    
         
             
              def test_yylex_string_pct_w
         
     | 
| 
       1616 
1695 
     | 
    
         
             
                util_bad_token("%w[s1 s2 ",
         
     | 
| 
       1617 
     | 
    
         
            -
                               : 
     | 
| 
      
 1696 
     | 
    
         
            +
                               :tQWORDS_BEG,     "%w[",
         
     | 
| 
       1618 
1697 
     | 
    
         
             
                               :tSTRING_CONTENT, "s1",
         
     | 
| 
       1619 
1698 
     | 
    
         
             
                               :tSPACE,              nil,
         
     | 
| 
       1620 
1699 
     | 
    
         
             
                               :tSTRING_CONTENT, "s2",
         
     | 
| 
         @@ -1623,7 +1702,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1623 
1702 
     | 
    
         | 
| 
       1624 
1703 
     | 
    
         
             
              def test_yylex_string_pct_w_bs_nl
         
     | 
| 
       1625 
1704 
     | 
    
         
             
                util_lex_token("%w[s1 \\\ns2]",
         
     | 
| 
       1626 
     | 
    
         
            -
                               : 
     | 
| 
      
 1705 
     | 
    
         
            +
                               :tQWORDS_BEG,     "%w[",
         
     | 
| 
       1627 
1706 
     | 
    
         
             
                               :tSTRING_CONTENT, "s1",
         
     | 
| 
       1628 
1707 
     | 
    
         
             
                               :tSPACE,              nil,
         
     | 
| 
       1629 
1708 
     | 
    
         
             
                               :tSTRING_CONTENT, "\ns2",
         
     | 
| 
         @@ -1633,7 +1712,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1633 
1712 
     | 
    
         | 
| 
       1634 
1713 
     | 
    
         
             
              def test_yylex_string_pct_w_bs_sp
         
     | 
| 
       1635 
1714 
     | 
    
         
             
                util_lex_token("%w[s\\ 1 s\\ 2]",
         
     | 
| 
       1636 
     | 
    
         
            -
                               : 
     | 
| 
      
 1715 
     | 
    
         
            +
                               :tQWORDS_BEG,     "%w[",
         
     | 
| 
       1637 
1716 
     | 
    
         
             
                               :tSTRING_CONTENT, "s 1",
         
     | 
| 
       1638 
1717 
     | 
    
         
             
                               :tSPACE,              nil,
         
     | 
| 
       1639 
1718 
     | 
    
         
             
                               :tSTRING_CONTENT, "s 2",
         
     | 
| 
         @@ -1643,7 +1722,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1643 
1722 
     | 
    
         | 
| 
       1644 
1723 
     | 
    
         
             
              def test_yylex_string_pct_w_tab
         
     | 
| 
       1645 
1724 
     | 
    
         
             
                util_lex_token("%w[abc\tdef]",
         
     | 
| 
       1646 
     | 
    
         
            -
                               : 
     | 
| 
      
 1725 
     | 
    
         
            +
                               :tQWORDS_BEG,      "%w[",
         
     | 
| 
       1647 
1726 
     | 
    
         
             
                               :tSTRING_CONTENT, "abc\tdef",
         
     | 
| 
       1648 
1727 
     | 
    
         
             
                               :tSPACE,              nil,
         
     | 
| 
       1649 
1728 
     | 
    
         
             
                               :tSTRING_END,     nil)
         
     | 
| 
         @@ -1820,7 +1899,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase 
     | 
|
| 
       1820 
1899 
     | 
    
         
             
                  token = args.shift
         
     | 
| 
       1821 
1900 
     | 
    
         
             
                  value = args.shift
         
     | 
| 
       1822 
1901 
     | 
    
         
             
                  assert @lex.advance, "no more tokens"
         
     | 
| 
       1823 
     | 
    
         
            -
                  assert_equal [token, value], [@lex.token, [@lex.yacc_value].flatten.first]
         
     | 
| 
      
 1902 
     | 
    
         
            +
                  assert_equal [token, value], [@lex.token, [@lex.yacc_value].flatten.first], input
         
     | 
| 
       1824 
1903 
     | 
    
         
             
                end
         
     | 
| 
       1825 
1904 
     | 
    
         | 
| 
       1826 
1905 
     | 
    
         
             
                deny @lex.advance, "must be empty, but had #{[@lex.token, @lex.yacc_value].inspect}"
         
     |