ruby_parser 3.15.1 → 3.18.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +107 -0
- data/Manifest.txt +5 -0
- data/README.rdoc +1 -0
- data/Rakefile +137 -29
- data/bin/ruby_parse_extract_error +1 -1
- data/compare/normalize.rb +8 -3
- data/debugging.md +133 -0
- data/gauntlet.md +106 -0
- data/lib/rp_extensions.rb +15 -36
- data/lib/rp_stringscanner.rb +20 -51
- data/lib/ruby20_parser.rb +3568 -3502
- data/lib/ruby20_parser.y +342 -251
- data/lib/ruby21_parser.rb +3659 -3617
- data/lib/ruby21_parser.y +337 -248
- data/lib/ruby22_parser.rb +3699 -3631
- data/lib/ruby22_parser.y +341 -250
- data/lib/ruby23_parser.rb +3638 -3576
- data/lib/ruby23_parser.y +341 -250
- data/lib/ruby24_parser.rb +3721 -3657
- data/lib/ruby24_parser.y +341 -250
- data/lib/ruby25_parser.rb +3721 -3657
- data/lib/ruby25_parser.y +341 -250
- data/lib/ruby26_parser.rb +3724 -3661
- data/lib/ruby26_parser.y +341 -249
- data/lib/ruby27_parser.rb +5018 -3725
- data/lib/ruby27_parser.y +937 -248
- data/lib/ruby30_parser.rb +8751 -0
- data/lib/ruby30_parser.y +3472 -0
- data/lib/ruby3_parser.yy +3476 -0
- data/lib/ruby_lexer.rb +273 -602
- data/lib/ruby_lexer.rex +28 -21
- data/lib/ruby_lexer.rex.rb +60 -24
- data/lib/ruby_lexer_strings.rb +638 -0
- data/lib/ruby_parser.rb +2 -0
- data/lib/ruby_parser.yy +978 -255
- data/lib/ruby_parser_extras.rb +297 -116
- data/test/test_ruby_lexer.rb +213 -129
- data/test/test_ruby_parser.rb +1479 -281
- data/tools/munge.rb +36 -8
- data/tools/ripper.rb +15 -10
- data.tar.gz.sig +0 -0
- metadata +36 -23
- metadata.gz.sig +0 -0
    
        data/lib/ruby20_parser.y
    CHANGED
    
    | @@ -18,7 +18,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS | |
| 18 18 | 
             
                  tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
         | 
| 19 19 | 
             
                  tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
         | 
| 20 20 | 
             
                  tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
         | 
| 21 | 
            -
                  tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND | 
| 21 | 
            +
                  tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND
         | 
| 22 22 |  | 
| 23 23 | 
             
            preclow
         | 
| 24 24 | 
             
              nonassoc tLOWEST
         | 
| @@ -30,7 +30,7 @@ preclow | |
| 30 30 | 
             
              right    tEQL tOP_ASGN
         | 
| 31 31 | 
             
              left     kRESCUE_MOD
         | 
| 32 32 | 
             
              right    tEH tCOLON
         | 
| 33 | 
            -
              nonassoc tDOT2 tDOT3
         | 
| 33 | 
            +
              nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3
         | 
| 34 34 | 
             
              left     tOROP
         | 
| 35 35 | 
             
              left     tANDOP
         | 
| 36 36 | 
             
              nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
         | 
| @@ -53,6 +53,9 @@ rule | |
| 53 53 | 
             
                                top_compstmt
         | 
| 54 54 | 
             
                                {
         | 
| 55 55 | 
             
                                  result = new_compstmt val
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                                  lexer.cond.pop # local_pop
         | 
| 58 | 
            +
                                  lexer.cmdarg.pop
         | 
| 56 59 | 
             
                                }
         | 
| 57 60 |  | 
| 58 61 | 
             
                top_compstmt: top_stmts opt_terms
         | 
| @@ -73,7 +76,7 @@ rule | |
| 73 76 | 
             
                            | klBEGIN
         | 
| 74 77 | 
             
                                {
         | 
| 75 78 | 
             
                                  if (self.in_def || self.in_single > 0) then
         | 
| 76 | 
            -
                                     | 
| 79 | 
            +
                                    debug 11
         | 
| 77 80 | 
             
                                    yyerror "BEGIN in method"
         | 
| 78 81 | 
             
                                  end
         | 
| 79 82 | 
             
                                  self.env.extend
         | 
| @@ -98,7 +101,9 @@ rule | |
| 98 101 | 
             
                    bodystmt: compstmt opt_rescue k_else
         | 
| 99 102 | 
             
                                {
         | 
| 100 103 | 
             
                                  res = _values[-2]
         | 
| 101 | 
            -
                                   | 
| 104 | 
            +
                                  # TODO: move down to main match so I can just use val
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                                  warn "else without rescue is useless" unless res
         | 
| 102 107 | 
             
                                }
         | 
| 103 108 | 
             
                                compstmt
         | 
| 104 109 | 
             
                                opt_ensure
         | 
| @@ -128,7 +133,7 @@ rule | |
| 128 133 | 
             
                            | error stmt
         | 
| 129 134 | 
             
                                {
         | 
| 130 135 | 
             
                                  result = val[1]
         | 
| 131 | 
            -
                                   | 
| 136 | 
            +
                                  debug 12
         | 
| 132 137 | 
             
                                }
         | 
| 133 138 |  | 
| 134 139 | 
             
               stmt_or_begin: stmt
         | 
| @@ -136,6 +141,10 @@ rule | |
| 136 141 | 
             
                                {
         | 
| 137 142 | 
             
                                  yyerror "BEGIN is permitted only at toplevel"
         | 
| 138 143 | 
             
                                }
         | 
| 144 | 
            +
                              begin_block
         | 
| 145 | 
            +
                                {
         | 
| 146 | 
            +
                                  result = val[2] # wtf?
         | 
| 147 | 
            +
                                }
         | 
| 139 148 |  | 
| 140 149 | 
             
                        stmt: kALIAS fitem
         | 
| 141 150 | 
             
                                {
         | 
| @@ -148,12 +157,12 @@ rule | |
| 148 157 | 
             
                                }
         | 
| 149 158 | 
             
                            | kALIAS tGVAR tGVAR
         | 
| 150 159 | 
             
                                {
         | 
| 151 | 
            -
                                  (_, line), lhs, rhs = val
         | 
| 160 | 
            +
                                  (_, line), (lhs, _), (rhs, _) = val
         | 
| 152 161 | 
             
                                  result = s(:valias, lhs.to_sym, rhs.to_sym).line line
         | 
| 153 162 | 
             
                                }
         | 
| 154 163 | 
             
                            | kALIAS tGVAR tBACK_REF
         | 
| 155 164 | 
             
                                {
         | 
| 156 | 
            -
                                  (_, line), lhs, rhs = val
         | 
| 165 | 
            +
                                  (_, line), (lhs, _), (rhs, _) = val
         | 
| 157 166 | 
             
                                  result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
         | 
| 158 167 | 
             
                                }
         | 
| 159 168 | 
             
                            | kALIAS tGVAR tNTH_REF
         | 
| @@ -196,7 +205,7 @@ rule | |
| 196 205 | 
             
                                  (_, line), _, stmt, _ = val
         | 
| 197 206 |  | 
| 198 207 | 
             
                                  if (self.in_def || self.in_single > 0) then
         | 
| 199 | 
            -
                                     | 
| 208 | 
            +
                                    debug 13
         | 
| 200 209 | 
             
                                    yyerror "END in method; use at_exit"
         | 
| 201 210 | 
             
                                  end
         | 
| 202 211 |  | 
| @@ -240,32 +249,31 @@ rule | |
| 240 249 | 
             
                                }
         | 
| 241 250 | 
             
                            | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
         | 
| 242 251 | 
             
                                {
         | 
| 243 | 
            -
                                  prim, _, id,  | 
| 244 | 
            -
             | 
| 245 | 
            -
                                   | 
| 246 | 
            -
             | 
| 247 | 
            -
                                   | 
| 248 | 
            -
                                  result.line = val[0].line
         | 
| 252 | 
            +
                                  prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
         | 
| 253 | 
            +
             | 
| 254 | 
            +
                                  result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
         | 
| 255 | 
            +
                                  result.sexp_type = :safe_op_asgn if call_op == '&.'
         | 
| 256 | 
            +
                                  result.line prim.line
         | 
| 249 257 | 
             
                                }
         | 
| 250 258 | 
             
                            | primary_value call_op tCONSTANT tOP_ASGN command_rhs
         | 
| 251 259 | 
             
                                {
         | 
| 252 | 
            -
                                   | 
| 253 | 
            -
             | 
| 254 | 
            -
             | 
| 255 | 
            -
                                   | 
| 256 | 
            -
                                  result.line  | 
| 260 | 
            +
                                  prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
         | 
| 261 | 
            +
             | 
| 262 | 
            +
                                  result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
         | 
| 263 | 
            +
                                  result.sexp_type = :safe_op_asgn if call_op == '&.'
         | 
| 264 | 
            +
                                  result.line prim.line
         | 
| 257 265 | 
             
                                }
         | 
| 258 266 | 
             
                            | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
         | 
| 259 267 | 
             
                                {
         | 
| 260 | 
            -
                                  lhs1, _, lhs2,  | 
| 268 | 
            +
                                  lhs1, _, (lhs2, line), (id, _), rhs = val
         | 
| 261 269 |  | 
| 262 | 
            -
                                  result = s(:op_asgn, lhs1, rhs, lhs2.to_sym,  | 
| 270 | 
            +
                                  result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
         | 
| 263 271 | 
             
                                }
         | 
| 264 272 | 
             
                            | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
         | 
| 265 273 | 
             
                                {
         | 
| 266 | 
            -
                                  lhs1, _, lhs2,  | 
| 274 | 
            +
                                  lhs1, _, (lhs2, line), (id, _), rhs = val
         | 
| 267 275 |  | 
| 268 | 
            -
                                  result = s(:op_asgn, lhs1, rhs, lhs2.to_sym,  | 
| 276 | 
            +
                                  result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
         | 
| 269 277 | 
             
                                }
         | 
| 270 278 | 
             
                            | backref tOP_ASGN command_rhs
         | 
| 271 279 | 
             
                                {
         | 
| @@ -303,7 +311,7 @@ rule | |
| 303 311 | 
             
                                  # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
         | 
| 304 312 | 
             
                                  # REFACTOR: call_uni_op -- see parse26.y
         | 
| 305 313 | 
             
                                }
         | 
| 306 | 
            -
                            | arg
         | 
| 314 | 
            +
                            | arg                                   =tLBRACE_ARG
         | 
| 307 315 |  | 
| 308 316 | 
             
                  expr_value: expr
         | 
| 309 317 | 
             
                                {
         | 
| @@ -328,7 +336,7 @@ rule | |
| 328 336 | 
             
               block_command: block_call
         | 
| 329 337 | 
             
                            | block_call call_op2 operation2 command_args
         | 
| 330 338 | 
             
                                {
         | 
| 331 | 
            -
                                  blk, _, msg, args = val
         | 
| 339 | 
            +
                                  blk, _, (msg, _line), args = val
         | 
| 332 340 | 
             
                                  result = new_call(blk, msg.to_sym, args).line blk.line
         | 
| 333 341 | 
             
                                }
         | 
| 334 342 |  | 
| @@ -342,15 +350,15 @@ rule | |
| 342 350 | 
             
                                  _, line, body, _ = val
         | 
| 343 351 |  | 
| 344 352 | 
             
                                  result = body
         | 
| 345 | 
            -
                                  result.line  | 
| 353 | 
            +
                                  result.line line
         | 
| 346 354 |  | 
| 347 355 | 
             
                                  # self.env.unextend
         | 
| 348 356 | 
             
                                }
         | 
| 349 357 |  | 
| 350 358 | 
             
                       fcall: operation
         | 
| 351 359 | 
             
                                {
         | 
| 352 | 
            -
                                  msg, = val
         | 
| 353 | 
            -
                                  result = new_call(nil, msg.to_sym).line  | 
| 360 | 
            +
                                  (msg, line), = val
         | 
| 361 | 
            +
                                  result = new_call(nil, msg.to_sym).line line
         | 
| 354 362 | 
             
                                }
         | 
| 355 363 |  | 
| 356 364 | 
             
                     command: fcall command_args =tLOWEST
         | 
| @@ -373,12 +381,14 @@ rule | |
| 373 381 | 
             
                                }
         | 
| 374 382 | 
             
                            | primary_value call_op operation2 command_args =tLOWEST
         | 
| 375 383 | 
             
                                {
         | 
| 376 | 
            -
                                  lhs, callop, op, args = val
         | 
| 384 | 
            +
                                  lhs, callop, (op, _), args = val
         | 
| 385 | 
            +
             | 
| 377 386 | 
             
                                  result = new_call lhs, op.to_sym, args, callop
         | 
| 387 | 
            +
                                  result.line lhs.line
         | 
| 378 388 | 
             
                                }
         | 
| 379 389 | 
             
                            | primary_value call_op operation2 command_args cmd_brace_block
         | 
| 380 390 | 
             
                                {
         | 
| 381 | 
            -
                                  recv, _, msg, args, block = val
         | 
| 391 | 
            +
                                  recv, _, (msg, _line), args, block = val
         | 
| 382 392 | 
             
                                  call = new_call recv, msg.to_sym, args, val[1]
         | 
| 383 393 |  | 
| 384 394 | 
             
                                  block_dup_check call, block
         | 
| @@ -388,11 +398,14 @@ rule | |
| 388 398 | 
             
                                }
         | 
| 389 399 | 
             
                            | primary_value tCOLON2 operation2 command_args =tLOWEST
         | 
| 390 400 | 
             
                                {
         | 
| 391 | 
            -
                                   | 
| 401 | 
            +
                                  lhs, _, (id, line), args = val
         | 
| 402 | 
            +
             | 
| 403 | 
            +
                                  result = new_call lhs, id.to_sym, args
         | 
| 404 | 
            +
                                  result.line line
         | 
| 392 405 | 
             
                                }
         | 
| 393 406 | 
             
                            | primary_value tCOLON2 operation2 command_args cmd_brace_block
         | 
| 394 407 | 
             
                                {
         | 
| 395 | 
            -
                                  recv, _, msg, args, block = val
         | 
| 408 | 
            +
                                  recv, _, (msg, _line), args, block = val
         | 
| 396 409 | 
             
                                  call = new_call recv, msg.to_sym, args
         | 
| 397 410 |  | 
| 398 411 | 
             
                                  block_dup_check call, block
         | 
| @@ -550,25 +563,29 @@ rule | |
| 550 563 | 
             
                                }
         | 
| 551 564 | 
             
                            | primary_value call_op tIDENTIFIER
         | 
| 552 565 | 
             
                                {
         | 
| 553 | 
            -
                                   | 
| 566 | 
            +
                                  lhs, call_op, (id, _line) = val
         | 
| 567 | 
            +
             | 
| 568 | 
            +
                                  result = new_attrasgn lhs, id, call_op
         | 
| 554 569 | 
             
                                }
         | 
| 555 570 | 
             
                            | primary_value tCOLON2 tIDENTIFIER
         | 
| 556 571 | 
             
                                {
         | 
| 557 | 
            -
                                  recv, _, id = val
         | 
| 572 | 
            +
                                  recv, _, (id, _line) = val
         | 
| 558 573 | 
             
                                  result = new_attrasgn recv, id
         | 
| 559 574 | 
             
                                }
         | 
| 560 575 | 
             
                            | primary_value call_op tCONSTANT
         | 
| 561 576 | 
             
                                {
         | 
| 562 | 
            -
                                   | 
| 577 | 
            +
                                  lhs, call_op, (id, _line) = val
         | 
| 578 | 
            +
             | 
| 579 | 
            +
                                  result = new_attrasgn lhs, id, call_op
         | 
| 563 580 | 
             
                                }
         | 
| 564 581 | 
             
                            | primary_value tCOLON2 tCONSTANT
         | 
| 565 582 | 
             
                                {
         | 
| 566 583 | 
             
                                  if (self.in_def || self.in_single > 0) then
         | 
| 567 | 
            -
                                     | 
| 584 | 
            +
                                    debug 14
         | 
| 568 585 | 
             
                                    yyerror "dynamic constant assignment"
         | 
| 569 586 | 
             
                                  end
         | 
| 570 587 |  | 
| 571 | 
            -
                                  expr, _, id = val
         | 
| 588 | 
            +
                                  expr, _, (id, _line) = val
         | 
| 572 589 | 
             
                                  l = expr.line
         | 
| 573 590 |  | 
| 574 591 | 
             
                                  result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
         | 
| @@ -576,58 +593,65 @@ rule | |
| 576 593 | 
             
                            | tCOLON3 tCONSTANT
         | 
| 577 594 | 
             
                                {
         | 
| 578 595 | 
             
                                  if (self.in_def || self.in_single > 0) then
         | 
| 579 | 
            -
                                     | 
| 596 | 
            +
                                    debug 15
         | 
| 580 597 | 
             
                                    yyerror "dynamic constant assignment"
         | 
| 581 598 | 
             
                                  end
         | 
| 582 599 |  | 
| 583 | 
            -
                                  _, id = val
         | 
| 584 | 
            -
                                  l = lexer.lineno
         | 
| 600 | 
            +
                                  _, (id, l) = val
         | 
| 585 601 |  | 
| 586 602 | 
             
                                  result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
         | 
| 587 603 | 
             
                                }
         | 
| 588 604 | 
             
                            | backref
         | 
| 589 605 | 
             
                                {
         | 
| 590 | 
            -
                                   | 
| 606 | 
            +
                                  ref, = val
         | 
| 607 | 
            +
             | 
| 608 | 
            +
                                  self.backref_assign_error ref
         | 
| 591 609 | 
             
                                }
         | 
| 592 610 |  | 
| 593 611 | 
             
                         lhs: user_variable
         | 
| 594 612 | 
             
                                {
         | 
| 595 | 
            -
                                   | 
| 596 | 
            -
             | 
| 597 | 
            -
                                  result | 
| 613 | 
            +
                                  var, = val
         | 
| 614 | 
            +
             | 
| 615 | 
            +
                                  result = self.assignable var
         | 
| 598 616 | 
             
                                }
         | 
| 599 617 | 
             
                            | keyword_variable
         | 
| 600 618 | 
             
                                {
         | 
| 601 | 
            -
                                   | 
| 602 | 
            -
             | 
| 603 | 
            -
                                  result | 
| 604 | 
            -
             | 
| 619 | 
            +
                                  var, = val
         | 
| 620 | 
            +
             | 
| 621 | 
            +
                                  result = self.assignable var
         | 
| 622 | 
            +
             | 
| 623 | 
            +
                                  debug 16
         | 
| 605 624 | 
             
                                }
         | 
| 606 625 | 
             
                            | primary_value tLBRACK2 opt_call_args rbracket
         | 
| 607 626 | 
             
                                {
         | 
| 608 627 | 
             
                                  lhs, _, args, _ = val
         | 
| 628 | 
            +
             | 
| 609 629 | 
             
                                  result = self.aryset lhs, args
         | 
| 610 630 | 
             
                                }
         | 
| 611 631 | 
             
                            | primary_value call_op tIDENTIFIER # REFACTOR
         | 
| 612 632 | 
             
                                {
         | 
| 613 | 
            -
                                  lhs, op, id = val
         | 
| 633 | 
            +
                                  lhs, op, (id, _line) = val
         | 
| 634 | 
            +
             | 
| 614 635 | 
             
                                  result = new_attrasgn lhs, id, op
         | 
| 615 636 | 
             
                                }
         | 
| 616 637 | 
             
                            | primary_value tCOLON2 tIDENTIFIER
         | 
| 617 638 | 
             
                                {
         | 
| 618 | 
            -
                                  lhs, _, id = val
         | 
| 639 | 
            +
                                  lhs, _, (id, _line) = val
         | 
| 640 | 
            +
             | 
| 619 641 | 
             
                                  result = new_attrasgn lhs, id
         | 
| 620 642 | 
             
                                }
         | 
| 621 643 | 
             
                            | primary_value call_op tCONSTANT # REFACTOR?
         | 
| 622 644 | 
             
                                {
         | 
| 623 | 
            -
                                   | 
| 645 | 
            +
                                  lhs, call_op, (id, _line) = val
         | 
| 646 | 
            +
             | 
| 647 | 
            +
                                  result = new_attrasgn lhs, id, call_op
         | 
| 624 648 | 
             
                                }
         | 
| 625 649 | 
             
                            | primary_value tCOLON2 tCONSTANT
         | 
| 626 650 | 
             
                                {
         | 
| 627 | 
            -
                                  expr, _, id = val
         | 
| 651 | 
            +
                                  expr, _, (id, _line) = val
         | 
| 628 652 |  | 
| 629 653 | 
             
                                  if (self.in_def || self.in_single > 0) then
         | 
| 630 | 
            -
                                     | 
| 654 | 
            +
                                    debug 17
         | 
| 631 655 | 
             
                                    yyerror "dynamic constant assignment"
         | 
| 632 656 | 
             
                                  end
         | 
| 633 657 |  | 
| @@ -636,14 +660,13 @@ rule | |
| 636 660 | 
             
                                }
         | 
| 637 661 | 
             
                            | tCOLON3 tCONSTANT
         | 
| 638 662 | 
             
                                {
         | 
| 639 | 
            -
                                  _, id = val
         | 
| 663 | 
            +
                                  _, (id, l) = val
         | 
| 640 664 |  | 
| 641 665 | 
             
                                  if (self.in_def || self.in_single > 0) then
         | 
| 642 | 
            -
                                     | 
| 666 | 
            +
                                    debug 18
         | 
| 643 667 | 
             
                                    yyerror "dynamic constant assignment"
         | 
| 644 668 | 
             
                                  end
         | 
| 645 669 |  | 
| 646 | 
            -
                                  l = lexer.lineno
         | 
| 647 670 | 
             
                                  result = s(:const, s(:colon3, id.to_sym).line(l)).line l
         | 
| 648 671 | 
             
                                }
         | 
| 649 672 | 
             
                            | backref
         | 
| @@ -659,16 +682,17 @@ rule | |
| 659 682 |  | 
| 660 683 | 
             
                       cpath: tCOLON3 cname
         | 
| 661 684 | 
             
                                {
         | 
| 662 | 
            -
                                  _, name = val
         | 
| 663 | 
            -
                                  result = s(:colon3, name.to_sym).line  | 
| 685 | 
            +
                                  _, (name, line) = val
         | 
| 686 | 
            +
                                  result = s(:colon3, name.to_sym).line line
         | 
| 664 687 | 
             
                                }
         | 
| 665 688 | 
             
                            | cname
         | 
| 666 689 | 
             
                                {
         | 
| 667 | 
            -
                                   | 
| 690 | 
            +
                                  (id, line), = val
         | 
| 691 | 
            +
                                  result = [id.to_sym, line] # TODO: sexp?
         | 
| 668 692 | 
             
                                }
         | 
| 669 693 | 
             
                            | primary_value tCOLON2 cname
         | 
| 670 694 | 
             
                                {
         | 
| 671 | 
            -
                                  pval, _, name = val
         | 
| 695 | 
            +
                                  pval, _, (name, _line) = val
         | 
| 672 696 |  | 
| 673 697 | 
             
                                  result = s(:colon2, pval, name.to_sym)
         | 
| 674 698 | 
             
                                  result.line pval.line
         | 
| @@ -678,24 +702,17 @@ rule | |
| 678 702 | 
             
                            | op
         | 
| 679 703 | 
             
                                {
         | 
| 680 704 | 
             
                                  lexer.lex_state = EXPR_END
         | 
| 681 | 
            -
                                  result = val[0]
         | 
| 682 705 | 
             
                                }
         | 
| 683 706 |  | 
| 684 707 | 
             
                            | reswords
         | 
| 685 | 
            -
                                {
         | 
| 686 | 
            -
                                  (sym, _line), = val
         | 
| 687 | 
            -
                                  lexer.lex_state = EXPR_END
         | 
| 688 | 
            -
                                  result = sym
         | 
| 689 | 
            -
                                }
         | 
| 690 | 
            -
             | 
| 691 | 
            -
                        fsym: fname | symbol
         | 
| 692 708 |  | 
| 693 | 
            -
                       fitem:  | 
| 709 | 
            +
                       fitem: fname
         | 
| 694 710 | 
             
                                {
         | 
| 695 | 
            -
                                  id, = val
         | 
| 696 | 
            -
             | 
| 711 | 
            +
                                  (id, line), = val
         | 
| 712 | 
            +
             | 
| 713 | 
            +
                                  result = s(:lit, id.to_sym).line line
         | 
| 697 714 | 
             
                                }
         | 
| 698 | 
            -
                            |  | 
| 715 | 
            +
                            | symbol
         | 
| 699 716 |  | 
| 700 717 | 
             
                  undef_list: fitem
         | 
| 701 718 | 
             
                                {
         | 
| @@ -716,8 +733,6 @@ rule | |
| 716 733 | 
             
                            |   tNEQ     | tLSHFT  | tRSHFT   | tPLUS | tMINUS | tSTAR2
         | 
| 717 734 | 
             
                            |   tSTAR    | tDIVIDE | tPERCENT | tPOW  | tDSTAR | tBANG   | tTILDE
         | 
| 718 735 | 
             
                            |   tUPLUS   | tUMINUS | tAREF    | tASET | tBACK_REF2
         | 
| 719 | 
            -
                                # TODO: tUBANG dead?
         | 
| 720 | 
            -
                            |   tUBANG
         | 
| 721 736 |  | 
| 722 737 | 
             
                    reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
         | 
| 723 738 | 
             
                            | kALIAS    | kAND      | kBEGIN        | kBREAK  | kCASE
         | 
| @@ -751,24 +766,20 @@ rule | |
| 751 766 | 
             
                                }
         | 
| 752 767 | 
             
                            | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
         | 
| 753 768 | 
             
                                {
         | 
| 754 | 
            -
                                  lhs, _, id, op, rhs = val
         | 
| 769 | 
            +
                                  lhs, _, (id, _line), (op, _), rhs = val
         | 
| 755 770 |  | 
| 756 771 | 
             
                                  result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
         | 
| 757 772 | 
             
                                }
         | 
| 758 773 | 
             
                            | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
         | 
| 759 774 | 
             
                                {
         | 
| 760 | 
            -
                                  lhs1, _, lhs2, op, rhs = val
         | 
| 775 | 
            +
                                  lhs1, _, (lhs2, _line), op, rhs = val
         | 
| 761 776 |  | 
| 762 777 | 
             
                                  lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line
         | 
| 763 778 | 
             
                                  result = new_const_op_asgn [lhs, op, rhs]
         | 
| 764 779 | 
             
                                }
         | 
| 765 | 
            -
                            | tCOLON3 tCONSTANT
         | 
| 780 | 
            +
                            | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
         | 
| 766 781 | 
             
                                {
         | 
| 767 | 
            -
                                   | 
| 768 | 
            -
                                }
         | 
| 769 | 
            -
                                tOP_ASGN arg_rhs
         | 
| 770 | 
            -
                                {
         | 
| 771 | 
            -
                                  _, lhs, line, op, rhs = val
         | 
| 782 | 
            +
                                  _, (lhs, line), op, rhs = val
         | 
| 772 783 |  | 
| 773 784 | 
             
                                  lhs = s(:colon3, lhs.to_sym).line line
         | 
| 774 785 | 
             
                                  result = new_const_op_asgn [lhs, op, rhs]
         | 
| @@ -782,7 +793,7 @@ rule | |
| 782 793 | 
             
                            | arg tDOT2 arg
         | 
| 783 794 | 
             
                                {
         | 
| 784 795 | 
             
                                  v1, v2 = val[0], val[2]
         | 
| 785 | 
            -
                                  if v1. | 
| 796 | 
            +
                                  if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
         | 
| 786 797 | 
             
                                    result = s(:lit, (v1.last)..(v2.last)).line v1.line
         | 
| 787 798 | 
             
                                  else
         | 
| 788 799 | 
             
                                    result = s(:dot2, v1, v2).line v1.line
         | 
| @@ -791,12 +802,14 @@ rule | |
| 791 802 | 
             
                            | arg tDOT3 arg
         | 
| 792 803 | 
             
                                {
         | 
| 793 804 | 
             
                                  v1, v2 = val[0], val[2]
         | 
| 794 | 
            -
                                  if v1. | 
| 805 | 
            +
                                  if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
         | 
| 795 806 | 
             
                                    result = s(:lit, (v1.last)...(v2.last)).line v1.line
         | 
| 796 807 | 
             
                                  else
         | 
| 797 808 | 
             
                                    result = s(:dot3, v1, v2).line v1.line
         | 
| 798 809 | 
             
                                  end
         | 
| 799 810 | 
             
                                }
         | 
| 811 | 
            +
             | 
| 812 | 
            +
             | 
| 800 813 | 
             
                            | arg tPLUS arg
         | 
| 801 814 | 
             
                                {
         | 
| 802 815 | 
             
                                  result = new_call val[0], :+, argl(val[2])
         | 
| @@ -823,16 +836,18 @@ rule | |
| 823 836 | 
             
                                }
         | 
| 824 837 | 
             
                            | tUMINUS_NUM tINTEGER tPOW arg
         | 
| 825 838 | 
             
                                {
         | 
| 826 | 
            -
                                   | 
| 827 | 
            -
                                   | 
| 839 | 
            +
                                  _, (num, line), _, arg = val
         | 
| 840 | 
            +
                                  lit = s(:lit, num).line line
         | 
| 841 | 
            +
                                  result = new_call(new_call(lit, :"**", argl(arg)), :"-@")
         | 
| 828 842 | 
             
                                }
         | 
| 829 843 | 
             
                            | tUMINUS_NUM tFLOAT tPOW arg
         | 
| 830 844 | 
             
                                {
         | 
| 831 | 
            -
                                   | 
| 832 | 
            -
                                   | 
| 845 | 
            +
                                  _, (num, line), _, arg = val
         | 
| 846 | 
            +
                                  lit = s(:lit, num).line line
         | 
| 847 | 
            +
                                  result = new_call(new_call(lit, :"**", argl(arg)), :"-@")
         | 
| 833 848 |  | 
| 834 849 | 
             
                                  ## TODO: why is this 2.0 only?
         | 
| 835 | 
            -
                                   | 
| 850 | 
            +
                                  debug 19
         | 
| 836 851 | 
             
                                }
         | 
| 837 852 | 
             
                            | tUPLUS arg
         | 
| 838 853 | 
             
                                {
         | 
| @@ -930,12 +945,12 @@ rule | |
| 930 945 |  | 
| 931 946 | 
             
                    rel_expr: arg      relop arg                    =tGT
         | 
| 932 947 | 
             
                                {
         | 
| 933 | 
            -
                                  lhs, op, rhs = val
         | 
| 948 | 
            +
                                  lhs, (op, _), rhs = val
         | 
| 934 949 | 
             
                                  result = new_call lhs, op.to_sym, argl(rhs)
         | 
| 935 950 | 
             
                                }
         | 
| 936 951 | 
             
                            | rel_expr relop arg                    =tGT
         | 
| 937 952 | 
             
                                {
         | 
| 938 | 
            -
                                  lhs, op, rhs = val
         | 
| 953 | 
            +
                                  lhs, (op, _), rhs = val
         | 
| 939 954 | 
             
                                  warn "comparison '%s' after comparison", op
         | 
| 940 955 | 
             
                                  result = new_call lhs, op.to_sym, argl(rhs)
         | 
| 941 956 | 
             
                                }
         | 
| @@ -1117,8 +1132,9 @@ rule | |
| 1117 1132 | 
             
                            | backref
         | 
| 1118 1133 | 
             
                            | tFID
         | 
| 1119 1134 | 
             
                                {
         | 
| 1120 | 
            -
                                  msg, = val
         | 
| 1135 | 
            +
                                  (msg, line), = val
         | 
| 1121 1136 | 
             
                                  result = new_call nil, msg.to_sym
         | 
| 1137 | 
            +
                                  result.line line
         | 
| 1122 1138 | 
             
                                }
         | 
| 1123 1139 | 
             
                            | k_begin
         | 
| 1124 1140 | 
             
                                {
         | 
| @@ -1160,15 +1176,15 @@ rule | |
| 1160 1176 | 
             
                                }
         | 
| 1161 1177 | 
             
                            | primary_value tCOLON2 tCONSTANT
         | 
| 1162 1178 | 
             
                                {
         | 
| 1163 | 
            -
                                  expr, _, id = val
         | 
| 1179 | 
            +
                                  expr, _, (id, _line) = val
         | 
| 1164 1180 |  | 
| 1165 1181 | 
             
                                  result = s(:colon2, expr, id.to_sym).line expr.line
         | 
| 1166 1182 | 
             
                                }
         | 
| 1167 1183 | 
             
                            | tCOLON3 tCONSTANT
         | 
| 1168 1184 | 
             
                                {
         | 
| 1169 | 
            -
                                  _, id = val
         | 
| 1185 | 
            +
                                  _, (id, line) = val
         | 
| 1170 1186 |  | 
| 1171 | 
            -
                                  result = s(:colon3, id.to_sym).line  | 
| 1187 | 
            +
                                  result = s(:colon3, id.to_sym).line line
         | 
| 1172 1188 | 
             
                                }
         | 
| 1173 1189 | 
             
                            | tLBRACK { result = lexer.lineno } aref_args tRBRACK
         | 
| 1174 1190 | 
             
                                {
         | 
| @@ -1192,15 +1208,21 @@ rule | |
| 1192 1208 | 
             
                                }
         | 
| 1193 1209 | 
             
                            | kYIELD tLPAREN2 call_args rparen
         | 
| 1194 1210 | 
             
                                {
         | 
| 1195 | 
            -
                                   | 
| 1211 | 
            +
                                  (_, line), _, args, _ = val
         | 
| 1212 | 
            +
             | 
| 1213 | 
            +
                                  result = new_yield(args).line line
         | 
| 1196 1214 | 
             
                                }
         | 
| 1197 1215 | 
             
                            | kYIELD tLPAREN2 rparen
         | 
| 1198 1216 | 
             
                                {
         | 
| 1199 | 
            -
                                   | 
| 1217 | 
            +
                                  (_, line), _, _ = val
         | 
| 1218 | 
            +
             | 
| 1219 | 
            +
                                  result = new_yield.line line
         | 
| 1200 1220 | 
             
                                }
         | 
| 1201 1221 | 
             
                            | kYIELD
         | 
| 1202 1222 | 
             
                                {
         | 
| 1203 | 
            -
                                   | 
| 1223 | 
            +
                                  (_, line), = val
         | 
| 1224 | 
            +
             | 
| 1225 | 
            +
                                  result = new_yield.line line
         | 
| 1204 1226 | 
             
                                }
         | 
| 1205 1227 | 
             
                            | kDEFINED opt_nl tLPAREN2 expr rparen
         | 
| 1206 1228 | 
             
                                {
         | 
| @@ -1215,7 +1237,7 @@ rule | |
| 1215 1237 | 
             
                                }
         | 
| 1216 1238 | 
             
                            | kNOT tLPAREN2 rparen
         | 
| 1217 1239 | 
             
                                {
         | 
| 1218 | 
            -
                                   | 
| 1240 | 
            +
                                  debug 20
         | 
| 1219 1241 | 
             
                                }
         | 
| 1220 1242 | 
             
                            | fcall brace_block
         | 
| 1221 1243 | 
             
                                {
         | 
| @@ -1233,9 +1255,10 @@ rule | |
| 1233 1255 | 
             
                                  iter.insert 1, call # FIX
         | 
| 1234 1256 | 
             
                                  result = iter
         | 
| 1235 1257 | 
             
                                }
         | 
| 1236 | 
            -
                            |  | 
| 1258 | 
            +
                            | lambda
         | 
| 1237 1259 | 
             
                                {
         | 
| 1238 | 
            -
                                   | 
| 1260 | 
            +
                                  expr, = val
         | 
| 1261 | 
            +
                                  result = expr
         | 
| 1239 1262 | 
             
                                }
         | 
| 1240 1263 | 
             
                            | k_if expr_value then compstmt if_tail k_end
         | 
| 1241 1264 | 
             
                                {
         | 
| @@ -1278,7 +1301,6 @@ rule | |
| 1278 1301 | 
             
                                }
         | 
| 1279 1302 | 
             
                                cpath superclass
         | 
| 1280 1303 | 
             
                                {
         | 
| 1281 | 
            -
                                  self.comments.push self.lexer.comments
         | 
| 1282 1304 | 
             
                                  if (self.in_def || self.in_single > 0) then
         | 
| 1283 1305 | 
             
                                    yyerror "class definition in method body"
         | 
| 1284 1306 | 
             
                                  end
         | 
| @@ -1288,7 +1310,7 @@ rule | |
| 1288 1310 | 
             
                                {
         | 
| 1289 1311 | 
             
                                  result = new_class val
         | 
| 1290 1312 | 
             
                                  self.env.unextend
         | 
| 1291 | 
            -
                                  self.lexer. | 
| 1313 | 
            +
                                  self.lexer.ignore_body_comments
         | 
| 1292 1314 | 
             
                                }
         | 
| 1293 1315 | 
             
                            | k_class tLSHFT
         | 
| 1294 1316 | 
             
                                {
         | 
| @@ -1309,7 +1331,7 @@ rule | |
| 1309 1331 | 
             
                                {
         | 
| 1310 1332 | 
             
                                  result = new_sclass val
         | 
| 1311 1333 | 
             
                                  self.env.unextend
         | 
| 1312 | 
            -
                                  self.lexer. | 
| 1334 | 
            +
                                  self.lexer.ignore_body_comments
         | 
| 1313 1335 | 
             
                                }
         | 
| 1314 1336 | 
             
                            | k_module
         | 
| 1315 1337 | 
             
                                {
         | 
| @@ -1317,7 +1339,6 @@ rule | |
| 1317 1339 | 
             
                                }
         | 
| 1318 1340 | 
             
                                cpath
         | 
| 1319 1341 | 
             
                                {
         | 
| 1320 | 
            -
                                  self.comments.push self.lexer.comments
         | 
| 1321 1342 | 
             
                                  yyerror "module definition in method body" if
         | 
| 1322 1343 | 
             
                                    self.in_def or self.in_single > 0
         | 
| 1323 1344 |  | 
| @@ -1327,7 +1348,7 @@ rule | |
| 1327 1348 | 
             
                                {
         | 
| 1328 1349 | 
             
                                  result = new_module val
         | 
| 1329 1350 | 
             
                                  self.env.unextend
         | 
| 1330 | 
            -
                                  self.lexer. | 
| 1351 | 
            +
                                  self.lexer.ignore_body_comments
         | 
| 1331 1352 | 
             
                                }
         | 
| 1332 1353 | 
             
                            | k_def fname
         | 
| 1333 1354 | 
             
                                {
         | 
| @@ -1337,21 +1358,17 @@ rule | |
| 1337 1358 | 
             
                                  self.env.extend
         | 
| 1338 1359 | 
             
                                  lexer.cmdarg.push false
         | 
| 1339 1360 | 
             
                                  lexer.cond.push false
         | 
| 1340 | 
            -
             | 
| 1341 | 
            -
                                  self.comments.push self.lexer.comments
         | 
| 1342 1361 | 
             
                                }
         | 
| 1343 | 
            -
                                f_arglist bodystmt  | 
| 1362 | 
            +
                                f_arglist bodystmt k_end
         | 
| 1344 1363 | 
             
                                {
         | 
| 1345 | 
            -
                                  in_def = val | 
| 1346 | 
            -
             | 
| 1347 | 
            -
                                  result = new_defn val
         | 
| 1364 | 
            +
                                  result, in_def = new_defn val
         | 
| 1348 1365 |  | 
| 1349 1366 | 
             
                                  lexer.cond.pop # group = local_pop
         | 
| 1350 1367 | 
             
                                  lexer.cmdarg.pop
         | 
| 1351 1368 | 
             
                                  self.env.unextend
         | 
| 1352 1369 | 
             
                                  self.in_def = in_def
         | 
| 1353 1370 |  | 
| 1354 | 
            -
                                  self.lexer. | 
| 1371 | 
            +
                                  self.lexer.ignore_body_comments
         | 
| 1355 1372 | 
             
                                }
         | 
| 1356 1373 | 
             
                            | k_def singleton dot_or_colon
         | 
| 1357 1374 | 
             
                                {
         | 
| @@ -1359,7 +1376,7 @@ rule | |
| 1359 1376 | 
             
                                }
         | 
| 1360 1377 | 
             
                                fname
         | 
| 1361 1378 | 
             
                                {
         | 
| 1362 | 
            -
                                  result =  | 
| 1379 | 
            +
                                  result = self.in_def
         | 
| 1363 1380 |  | 
| 1364 1381 | 
             
                                  self.in_single += 1 # TODO: remove?
         | 
| 1365 1382 |  | 
| @@ -1369,13 +1386,18 @@ rule | |
| 1369 1386 | 
             
                                  lexer.cond.push false
         | 
| 1370 1387 |  | 
| 1371 1388 | 
             
                                  lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
         | 
| 1372 | 
            -
                                  self.comments.push self.lexer.comments
         | 
| 1373 1389 | 
             
                                }
         | 
| 1374 1390 | 
             
                                f_arglist bodystmt k_end
         | 
| 1375 1391 | 
             
                                {
         | 
| 1376 | 
            -
                                  _, _recv, _, _, _name, (in_def, _lineno), _args, _body, _ = val
         | 
| 1377 1392 |  | 
| 1378 | 
            -
                                   | 
| 1393 | 
            +
                                  # [kdef, recv, _, _, (name, line), in_def, args, body, kend]
         | 
| 1394 | 
            +
                                  # =>
         | 
| 1395 | 
            +
                                  # [kdef, recv, (name, line), in_def, args, body, kend]
         | 
| 1396 | 
            +
             | 
| 1397 | 
            +
                                  val.delete_at 3
         | 
| 1398 | 
            +
                                  val.delete_at 2
         | 
| 1399 | 
            +
             | 
| 1400 | 
            +
                                  result, in_def = new_defs val
         | 
| 1379 1401 |  | 
| 1380 1402 | 
             
                                  lexer.cond.pop # group = local_pop
         | 
| 1381 1403 | 
             
                                  lexer.cmdarg.pop
         | 
| @@ -1386,7 +1408,7 @@ rule | |
| 1386 1408 |  | 
| 1387 1409 | 
             
                                  # TODO: restore cur_arg ? what's cur_arg?
         | 
| 1388 1410 |  | 
| 1389 | 
            -
                                  self.lexer. | 
| 1411 | 
            +
                                  self.lexer.ignore_body_comments
         | 
| 1390 1412 | 
             
                                }
         | 
| 1391 1413 | 
             
                            | kBREAK
         | 
| 1392 1414 | 
             
                                {
         | 
| @@ -1423,8 +1445,17 @@ rule | |
| 1423 1445 | 
             
                      k_case: kCASE
         | 
| 1424 1446 | 
             
                       k_for: kFOR
         | 
| 1425 1447 | 
             
                     k_class: kCLASS
         | 
| 1448 | 
            +
                                {
         | 
| 1449 | 
            +
                                  self.comments.push self.lexer.comments
         | 
| 1450 | 
            +
                                }
         | 
| 1426 1451 | 
             
                    k_module: kMODULE
         | 
| 1452 | 
            +
                                {
         | 
| 1453 | 
            +
                                  self.comments.push self.lexer.comments
         | 
| 1454 | 
            +
                                }
         | 
| 1427 1455 | 
             
                       k_def: kDEF
         | 
| 1456 | 
            +
                                {
         | 
| 1457 | 
            +
                                  self.comments.push self.lexer.comments
         | 
| 1458 | 
            +
                                }
         | 
| 1428 1459 | 
             
                        k_do: kDO
         | 
| 1429 1460 | 
             
                  k_do_block: kDO_BLOCK
         | 
| 1430 1461 | 
             
                    k_rescue: kRESCUE
         | 
| @@ -1485,51 +1516,42 @@ rule | |
| 1485 1516 |  | 
| 1486 1517 | 
             
                                  result = block_var args
         | 
| 1487 1518 | 
             
                                }
         | 
| 1488 | 
            -
                            | f_marg_list tCOMMA  | 
| 1519 | 
            +
                            | f_marg_list tCOMMA f_rest_marg
         | 
| 1489 1520 | 
             
                                {
         | 
| 1490 | 
            -
                                  args, _,  | 
| 1521 | 
            +
                                  args, _, rest = val
         | 
| 1491 1522 |  | 
| 1492 | 
            -
                                  result = block_var args,  | 
| 1523 | 
            +
                                  result = block_var args, rest
         | 
| 1493 1524 | 
             
                                }
         | 
| 1494 | 
            -
                            | f_marg_list tCOMMA  | 
| 1525 | 
            +
                            | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list
         | 
| 1495 1526 | 
             
                                {
         | 
| 1496 | 
            -
                                   | 
| 1527 | 
            +
                                  lhs, _, splat, _, rhs = val
         | 
| 1497 1528 |  | 
| 1498 | 
            -
                                  result = block_var  | 
| 1529 | 
            +
                                  result = block_var lhs, splat, rhs
         | 
| 1499 1530 | 
             
                                }
         | 
| 1500 | 
            -
                            |  | 
| 1531 | 
            +
                            | f_rest_marg
         | 
| 1501 1532 | 
             
                                {
         | 
| 1502 | 
            -
                                   | 
| 1533 | 
            +
                                  rest, = val
         | 
| 1503 1534 |  | 
| 1504 | 
            -
                                  result = block_var  | 
| 1535 | 
            +
                                  result = block_var rest
         | 
| 1505 1536 | 
             
                                }
         | 
| 1506 | 
            -
                            |  | 
| 1537 | 
            +
                            | f_rest_marg tCOMMA f_marg_list
         | 
| 1507 1538 | 
             
                                {
         | 
| 1508 | 
            -
                                   | 
| 1539 | 
            +
                                  splat, _, rest = val
         | 
| 1509 1540 |  | 
| 1510 | 
            -
                                  result = block_var  | 
| 1541 | 
            +
                                  result = block_var splat, rest
         | 
| 1511 1542 | 
             
                                }
         | 
| 1512 | 
            -
                            | tSTAR f_norm_arg
         | 
| 1513 | 
            -
                                {
         | 
| 1514 | 
            -
                                  _, splat = val
         | 
| 1515 1543 |  | 
| 1516 | 
            -
             | 
| 1517 | 
            -
                                }
         | 
| 1518 | 
            -
                            | tSTAR f_norm_arg tCOMMA f_marg_list
         | 
| 1544 | 
            +
                 f_rest_marg: tSTAR f_norm_arg
         | 
| 1519 1545 | 
             
                                {
         | 
| 1520 | 
            -
                                  _,  | 
| 1546 | 
            +
                                  _, (id, line) = val
         | 
| 1521 1547 |  | 
| 1522 | 
            -
                                  result =  | 
| 1548 | 
            +
                                  result = args ["*#{id}".to_sym]
         | 
| 1549 | 
            +
                                  result.line line
         | 
| 1523 1550 | 
             
                                }
         | 
| 1524 1551 | 
             
                            | tSTAR
         | 
| 1525 1552 | 
             
                                {
         | 
| 1526 | 
            -
                                  result =  | 
| 1527 | 
            -
             | 
| 1528 | 
            -
                            | tSTAR tCOMMA f_marg_list
         | 
| 1529 | 
            -
                                {
         | 
| 1530 | 
            -
                                  _, _, args = val
         | 
| 1531 | 
            -
             | 
| 1532 | 
            -
                                  result = block_var :*, args
         | 
| 1553 | 
            +
                                  result = args [:*]
         | 
| 1554 | 
            +
                                  result.line lexer.lineno # FIX: tSTAR -> line
         | 
| 1533 1555 | 
             
                                }
         | 
| 1534 1556 |  | 
| 1535 1557 | 
             
             block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
         | 
| @@ -1546,8 +1568,8 @@ rule | |
| 1546 1568 | 
             
                                }
         | 
| 1547 1569 | 
             
                            | f_block_arg
         | 
| 1548 1570 | 
             
                                {
         | 
| 1549 | 
            -
                                  line =  | 
| 1550 | 
            -
                                  result = call_args  | 
| 1571 | 
            +
                                  (id, line), = val
         | 
| 1572 | 
            +
                                  result = call_args [id]
         | 
| 1551 1573 | 
             
                                  result.line line
         | 
| 1552 1574 | 
             
                                }
         | 
| 1553 1575 |  | 
| @@ -1656,13 +1678,13 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1656 1678 |  | 
| 1657 1679 | 
             
                        bvar: tIDENTIFIER
         | 
| 1658 1680 | 
             
                                {
         | 
| 1659 | 
            -
                                  id, = val
         | 
| 1660 | 
            -
                                  line = lexer.lineno
         | 
| 1681 | 
            +
                                  (id, line), = val
         | 
| 1661 1682 | 
             
                                  result = s(:shadow, id.to_sym).line line
         | 
| 1662 1683 | 
             
                                }
         | 
| 1663 1684 | 
             
                            | f_bad_arg
         | 
| 1664 1685 |  | 
| 1665 | 
            -
                      lambda: | 
| 1686 | 
            +
                      lambda: tLAMBDA
         | 
| 1687 | 
            +
                                {
         | 
| 1666 1688 | 
             
                                  self.env.extend :dynamic
         | 
| 1667 1689 | 
             
                                  result = [lexer.lineno, lexer.lpar_beg]
         | 
| 1668 1690 | 
             
                                  lexer.paren_nest += 1
         | 
| @@ -1674,14 +1696,14 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1674 1696 | 
             
                                }
         | 
| 1675 1697 | 
             
                                lambda_body
         | 
| 1676 1698 | 
             
                                {
         | 
| 1677 | 
            -
                                  (line, lpar), args, _cmdarg, body = val
         | 
| 1699 | 
            +
                                  _, (line, lpar), args, _cmdarg, body = val
         | 
| 1678 1700 | 
             
                                  lexer.lpar_beg = lpar
         | 
| 1679 1701 |  | 
| 1680 1702 | 
             
                                  lexer.cmdarg.pop
         | 
| 1681 1703 |  | 
| 1682 1704 | 
             
                                  call = s(:lambda).line line
         | 
| 1683 1705 | 
             
                                  result = new_iter call, args, body
         | 
| 1684 | 
            -
                                  result.line  | 
| 1706 | 
            +
                                  result.line line
         | 
| 1685 1707 | 
             
                                  self.env.unextend # TODO: dynapush & dynapop
         | 
| 1686 1708 | 
             
                                }
         | 
| 1687 1709 |  | 
| @@ -1716,23 +1738,28 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1716 1738 | 
             
                                  ## if (nd_type($1) == NODE_YIELD) {
         | 
| 1717 1739 | 
             
                                  ##     compile_error(PARSER_ARG "block given to yield");
         | 
| 1718 1740 |  | 
| 1719 | 
            -
                                   | 
| 1720 | 
            -
                                    val[0].block_pass?
         | 
| 1741 | 
            +
                                  cmd, blk = val
         | 
| 1721 1742 |  | 
| 1722 | 
            -
                                   | 
| 1743 | 
            +
                                  syntax_error "Both block arg and actual block given." if
         | 
| 1744 | 
            +
                                    cmd.block_pass?
         | 
| 1723 1745 |  | 
| 1724 | 
            -
                                   | 
| 1746 | 
            +
                                  if inverted? val then
         | 
| 1747 | 
            +
                                    val = invert_block_call val
         | 
| 1748 | 
            +
                                    cmd, blk = val
         | 
| 1749 | 
            +
                                  end
         | 
| 1725 1750 |  | 
| 1726 1751 | 
             
                                  result = blk
         | 
| 1727 1752 | 
             
                                  result.insert 1, cmd
         | 
| 1728 1753 | 
             
                                }
         | 
| 1729 1754 | 
             
                            | block_call call_op2 operation2 opt_paren_args
         | 
| 1730 1755 | 
             
                                {
         | 
| 1731 | 
            -
                                   | 
| 1756 | 
            +
                                  lhs, _, (id, _line), args = val
         | 
| 1757 | 
            +
             | 
| 1758 | 
            +
                                  result = new_call lhs, id.to_sym, args
         | 
| 1732 1759 | 
             
                                }
         | 
| 1733 1760 | 
             
                            | block_call call_op2 operation2 opt_paren_args brace_block
         | 
| 1734 1761 | 
             
                                {
         | 
| 1735 | 
            -
                                  iter1, _, name, args, iter2 = val
         | 
| 1762 | 
            +
                                  iter1, _, (name, _line), args, iter2 = val
         | 
| 1736 1763 |  | 
| 1737 1764 | 
             
                                  call = new_call iter1, name.to_sym, args
         | 
| 1738 1765 | 
             
                                  iter2.insert 1, call
         | 
| @@ -1741,7 +1768,7 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1741 1768 | 
             
                                }
         | 
| 1742 1769 | 
             
                            | block_call call_op2 operation2 command_args do_block
         | 
| 1743 1770 | 
             
                                {
         | 
| 1744 | 
            -
                                  iter1, _, name, args, iter2 = val
         | 
| 1771 | 
            +
                                  iter1, _, (name, _line), args, iter2 = val
         | 
| 1745 1772 |  | 
| 1746 1773 | 
             
                                  call = new_call iter1, name.to_sym, args
         | 
| 1747 1774 | 
             
                                  iter2.insert 1, call
         | 
| @@ -1749,28 +1776,29 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1749 1776 | 
             
                                  result = iter2
         | 
| 1750 1777 | 
             
                                }
         | 
| 1751 1778 |  | 
| 1752 | 
            -
                 method_call: fcall
         | 
| 1753 | 
            -
                                {
         | 
| 1754 | 
            -
                                  result = self.lexer.lineno
         | 
| 1755 | 
            -
                                }
         | 
| 1756 | 
            -
                                paren_args
         | 
| 1779 | 
            +
                 method_call: fcall paren_args
         | 
| 1757 1780 | 
             
                                {
         | 
| 1758 | 
            -
                                  call,  | 
| 1781 | 
            +
                                  call, args = val
         | 
| 1759 1782 |  | 
| 1760 1783 | 
             
                                  result = call.concat args.sexp_body if args
         | 
| 1761 | 
            -
                                  result.line lineno
         | 
| 1762 1784 | 
             
                                }
         | 
| 1763 1785 | 
             
                            | primary_value call_op operation2 opt_paren_args
         | 
| 1764 1786 | 
             
                                {
         | 
| 1765 | 
            -
                                   | 
| 1787 | 
            +
                                  recv, call_op, (op, _line), args = val
         | 
| 1788 | 
            +
             | 
| 1789 | 
            +
                                  result = new_call recv, op.to_sym, args, call_op
         | 
| 1766 1790 | 
             
                                }
         | 
| 1767 1791 | 
             
                            | primary_value tCOLON2 operation2 paren_args
         | 
| 1768 1792 | 
             
                                {
         | 
| 1769 | 
            -
                                   | 
| 1793 | 
            +
                                  recv, _, (op, _line), args = val
         | 
| 1794 | 
            +
             | 
| 1795 | 
            +
                                  result = new_call recv, op.to_sym, args
         | 
| 1770 1796 | 
             
                                }
         | 
| 1771 1797 | 
             
                            | primary_value tCOLON2 operation3
         | 
| 1772 1798 | 
             
                                {
         | 
| 1773 | 
            -
                                   | 
| 1799 | 
            +
                                  lhs, _, (id, _line) = val
         | 
| 1800 | 
            +
             | 
| 1801 | 
            +
                                  result = new_call lhs, id.to_sym
         | 
| 1774 1802 | 
             
                                }
         | 
| 1775 1803 | 
             
                            | primary_value call_op paren_args
         | 
| 1776 1804 | 
             
                                {
         | 
| @@ -1803,7 +1831,7 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1803 1831 | 
             
                                  _, line, body, _ = val
         | 
| 1804 1832 |  | 
| 1805 1833 | 
             
                                  result = body
         | 
| 1806 | 
            -
                                  result.line  | 
| 1834 | 
            +
                                  result.line line
         | 
| 1807 1835 |  | 
| 1808 1836 | 
             
                                  self.env.unextend
         | 
| 1809 1837 | 
             
                                }
         | 
| @@ -1817,7 +1845,7 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1817 1845 | 
             
                                  _, line, body, _ = val
         | 
| 1818 1846 |  | 
| 1819 1847 | 
             
                                  result = body
         | 
| 1820 | 
            -
                                  result.line  | 
| 1848 | 
            +
                                  result.line line
         | 
| 1821 1849 |  | 
| 1822 1850 | 
             
                                  self.env.unextend
         | 
| 1823 1851 | 
             
                                }
         | 
| @@ -1846,14 +1874,39 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1846 1874 | 
             
                                  self.env.unextend
         | 
| 1847 1875 | 
             
                                }
         | 
| 1848 1876 |  | 
| 1877 | 
            +
                   case_args: arg_value
         | 
| 1878 | 
            +
                                {
         | 
| 1879 | 
            +
                                  arg, = val
         | 
| 1880 | 
            +
             | 
| 1881 | 
            +
                                  result = s(:array, arg).line arg.line
         | 
| 1882 | 
            +
                                }
         | 
| 1883 | 
            +
                            | tSTAR arg_value
         | 
| 1884 | 
            +
                                {
         | 
| 1885 | 
            +
                                  _, arg = val
         | 
| 1886 | 
            +
             | 
| 1887 | 
            +
                                  result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
         | 
| 1888 | 
            +
                                }
         | 
| 1889 | 
            +
                            | case_args tCOMMA arg_value
         | 
| 1890 | 
            +
                                {
         | 
| 1891 | 
            +
                                  args, _, id = val
         | 
| 1892 | 
            +
             | 
| 1893 | 
            +
                                  result = self.list_append args, id
         | 
| 1894 | 
            +
                                }
         | 
| 1895 | 
            +
                            | case_args tCOMMA tSTAR arg_value
         | 
| 1896 | 
            +
                                {
         | 
| 1897 | 
            +
                                  args, _, _, id = val
         | 
| 1898 | 
            +
             | 
| 1899 | 
            +
                                  result = self.list_append args, s(:splat, id).line(id.line)
         | 
| 1900 | 
            +
                                }
         | 
| 1901 | 
            +
             | 
| 1849 1902 | 
             
                   case_body: k_when
         | 
| 1850 1903 | 
             
                                {
         | 
| 1851 1904 | 
             
                                  result = self.lexer.lineno
         | 
| 1852 1905 | 
             
                                }
         | 
| 1853 | 
            -
                                 | 
| 1906 | 
            +
                                case_args then compstmt cases
         | 
| 1854 1907 | 
             
                                {
         | 
| 1855 1908 | 
             
                                  result = new_when(val[2], val[4])
         | 
| 1856 | 
            -
                                  result.line  | 
| 1909 | 
            +
                                  result.line val[1]
         | 
| 1857 1910 | 
             
                                  result << val[5] if val[5]
         | 
| 1858 1911 | 
             
                                }
         | 
| 1859 1912 |  | 
| @@ -1899,17 +1952,10 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1899 1952 |  | 
| 1900 1953 | 
             
                     literal: numeric
         | 
| 1901 1954 | 
             
                                {
         | 
| 1902 | 
            -
                                  line =  | 
| 1903 | 
            -
                                  result = s(:lit,  | 
| 1904 | 
            -
                                  result.line = line
         | 
| 1955 | 
            +
                                  (lit, line), = val
         | 
| 1956 | 
            +
                                  result = s(:lit, lit).line line
         | 
| 1905 1957 | 
             
                                }
         | 
| 1906 1958 | 
             
                            | symbol
         | 
| 1907 | 
            -
                                {
         | 
| 1908 | 
            -
                                  line = lexer.lineno
         | 
| 1909 | 
            -
                                  result = s(:lit, val[0])
         | 
| 1910 | 
            -
                                  result.line = line
         | 
| 1911 | 
            -
                                }
         | 
| 1912 | 
            -
                            | dsym
         | 
| 1913 1959 |  | 
| 1914 1960 | 
             
                     strings: string
         | 
| 1915 1961 | 
             
                                {
         | 
| @@ -1920,7 +1966,7 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1920 1966 |  | 
| 1921 1967 | 
             
                      string: tCHAR
         | 
| 1922 1968 | 
             
                                {
         | 
| 1923 | 
            -
                                   | 
| 1969 | 
            +
                                  debug 37
         | 
| 1924 1970 | 
             
                                }
         | 
| 1925 1971 | 
             
                            | string1
         | 
| 1926 1972 | 
             
                            | string string1
         | 
| @@ -1930,11 +1976,11 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1930 1976 |  | 
| 1931 1977 | 
             
                     string1: tSTRING_BEG string_contents tSTRING_END
         | 
| 1932 1978 | 
             
                                {
         | 
| 1933 | 
            -
                                  _, str, (_, func) = val
         | 
| 1979 | 
            +
                                  (_, line), str, (_, func) = val
         | 
| 1934 1980 |  | 
| 1935 | 
            -
                                  str = dedent str if func =~ RubyLexer:: | 
| 1981 | 
            +
                                  str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT
         | 
| 1936 1982 |  | 
| 1937 | 
            -
                                  result = str
         | 
| 1983 | 
            +
                                  result = str.line line
         | 
| 1938 1984 | 
             
                                }
         | 
| 1939 1985 | 
             
                            | tSTRING
         | 
| 1940 1986 | 
             
                                {
         | 
| @@ -1954,11 +2000,15 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1954 2000 |  | 
| 1955 2001 | 
             
                       words: tWORDS_BEG tSPACE tSTRING_END
         | 
| 1956 2002 | 
             
                                {
         | 
| 1957 | 
            -
                                   | 
| 2003 | 
            +
                                  (_, line), _, _ = val
         | 
| 2004 | 
            +
             | 
| 2005 | 
            +
                                  result = s(:array).line line
         | 
| 1958 2006 | 
             
                                }
         | 
| 1959 2007 | 
             
                            | tWORDS_BEG word_list tSTRING_END
         | 
| 1960 2008 | 
             
                                {
         | 
| 1961 | 
            -
                                   | 
| 2009 | 
            +
                                  (_, line), list, _ = val
         | 
| 2010 | 
            +
             | 
| 2011 | 
            +
                                  result = list.line line
         | 
| 1962 2012 | 
             
                                }
         | 
| 1963 2013 |  | 
| 1964 2014 | 
             
                   word_list: none
         | 
| @@ -1978,18 +2028,20 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1978 2028 |  | 
| 1979 2029 | 
             
                     symbols: tSYMBOLS_BEG tSPACE tSTRING_END
         | 
| 1980 2030 | 
             
                                {
         | 
| 1981 | 
            -
                                   | 
| 2031 | 
            +
                                  (_, line), _, _ = val
         | 
| 2032 | 
            +
             | 
| 2033 | 
            +
                                  result = s(:array).line line
         | 
| 1982 2034 | 
             
                                }
         | 
| 1983 | 
            -
                            | tSYMBOLS_BEG  | 
| 2035 | 
            +
                            | tSYMBOLS_BEG symbol_list tSTRING_END
         | 
| 1984 2036 | 
             
                                {
         | 
| 1985 | 
            -
                                  _, line, list, _, = val
         | 
| 1986 | 
            -
                                  list.line  | 
| 2037 | 
            +
                                  (_, line), list, _, = val
         | 
| 2038 | 
            +
                                  list.line line
         | 
| 1987 2039 | 
             
                                  result = list
         | 
| 1988 2040 | 
             
                                }
         | 
| 1989 2041 |  | 
| 1990 2042 | 
             
                 symbol_list: none
         | 
| 1991 2043 | 
             
                                {
         | 
| 1992 | 
            -
                                  result = new_symbol_list | 
| 2044 | 
            +
                                  result = new_symbol_list
         | 
| 1993 2045 | 
             
                                }
         | 
| 1994 2046 | 
             
                            | symbol_list word tSPACE
         | 
| 1995 2047 | 
             
                                {
         | 
| @@ -1999,20 +2051,28 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 1999 2051 |  | 
| 2000 2052 | 
             
                      qwords: tQWORDS_BEG tSPACE tSTRING_END
         | 
| 2001 2053 | 
             
                                {
         | 
| 2002 | 
            -
                                   | 
| 2054 | 
            +
                                  (_, line), _, _ = val
         | 
| 2055 | 
            +
             | 
| 2056 | 
            +
                                  result = s(:array).line line
         | 
| 2003 2057 | 
             
                                }
         | 
| 2004 2058 | 
             
                            | tQWORDS_BEG qword_list tSTRING_END
         | 
| 2005 2059 | 
             
                                {
         | 
| 2006 | 
            -
                                   | 
| 2060 | 
            +
                                  (_, line), list, _ = val
         | 
| 2061 | 
            +
             | 
| 2062 | 
            +
                                  result = list.line line
         | 
| 2007 2063 | 
             
                                }
         | 
| 2008 2064 |  | 
| 2009 2065 | 
             
                    qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
         | 
| 2010 2066 | 
             
                                {
         | 
| 2011 | 
            -
                                   | 
| 2067 | 
            +
                                  (_, line), _, _ = val
         | 
| 2068 | 
            +
             | 
| 2069 | 
            +
                                  result = s(:array).line line
         | 
| 2012 2070 | 
             
                                }
         | 
| 2013 2071 | 
             
                            | tQSYMBOLS_BEG qsym_list tSTRING_END
         | 
| 2014 2072 | 
             
                                {
         | 
| 2015 | 
            -
                                   | 
| 2073 | 
            +
                                  (_, line), list, _ = val
         | 
| 2074 | 
            +
             | 
| 2075 | 
            +
                                  result = list.line line
         | 
| 2016 2076 | 
             
                                }
         | 
| 2017 2077 |  | 
| 2018 2078 | 
             
                  qword_list: none
         | 
| @@ -2035,7 +2095,8 @@ opt_block_args_tail: tCOMMA block_args_tail | |
| 2035 2095 |  | 
| 2036 2096 | 
             
             string_contents: none
         | 
| 2037 2097 | 
             
                                {
         | 
| 2038 | 
            -
                                   | 
| 2098 | 
            +
                                  line = prev_value_to_lineno _values.last
         | 
| 2099 | 
            +
                                  result = s(:str, +"").line line
         | 
| 2039 2100 | 
             
                                }
         | 
| 2040 2101 | 
             
                            | string_contents string_content
         | 
| 2041 2102 | 
             
                                {
         | 
| @@ -2110,8 +2171,8 @@ regexp_contents: none | |
| 2110 2171 | 
             
                                  lexer.brace_nest  = brace_nest
         | 
| 2111 2172 | 
             
                                  lexer.string_nest = string_nest
         | 
| 2112 2173 |  | 
| 2113 | 
            -
                                  lexer.cmdarg.pop
         | 
| 2114 2174 | 
             
                                  lexer.cond.pop
         | 
| 2175 | 
            +
                                  lexer.cmdarg.pop
         | 
| 2115 2176 |  | 
| 2116 2177 | 
             
                                  lexer.lex_state = oldlex_state
         | 
| 2117 2178 |  | 
| @@ -2126,29 +2187,49 @@ regexp_contents: none | |
| 2126 2187 | 
             
                                  when nil then
         | 
| 2127 2188 | 
             
                                    result = s(:evstr).line line
         | 
| 2128 2189 | 
             
                                  else
         | 
| 2129 | 
            -
                                     | 
| 2190 | 
            +
                                    debug 38
         | 
| 2130 2191 | 
             
                                    raise "unknown string body: #{stmt.inspect}"
         | 
| 2131 2192 | 
             
                                  end
         | 
| 2132 2193 | 
             
                                }
         | 
| 2133 2194 |  | 
| 2134 | 
            -
                 string_dvar: tGVAR | 
| 2135 | 
            -
             | 
| 2136 | 
            -
             | 
| 2195 | 
            +
                 string_dvar: tGVAR
         | 
| 2196 | 
            +
                                {
         | 
| 2197 | 
            +
                                  (id, line), = val
         | 
| 2198 | 
            +
                                  result = s(:gvar, id.to_sym).line line
         | 
| 2199 | 
            +
                                }
         | 
| 2200 | 
            +
                            | tIVAR
         | 
| 2201 | 
            +
                                {
         | 
| 2202 | 
            +
                                  (id, line), = val
         | 
| 2203 | 
            +
                                  result = s(:ivar, id.to_sym).line line
         | 
| 2204 | 
            +
                                }
         | 
| 2205 | 
            +
                            | tCVAR
         | 
| 2206 | 
            +
                                {
         | 
| 2207 | 
            +
                                  (id, line), = val
         | 
| 2208 | 
            +
                                  result = s(:cvar, id.to_sym).line line
         | 
| 2209 | 
            +
                                }
         | 
| 2137 2210 | 
             
                            | backref
         | 
| 2138 2211 |  | 
| 2139 | 
            -
                      symbol:  | 
| 2212 | 
            +
                      symbol: ssym
         | 
| 2213 | 
            +
                            | dsym
         | 
| 2214 | 
            +
             | 
| 2215 | 
            +
                        ssym: tSYMBEG sym
         | 
| 2140 2216 | 
             
                                {
         | 
| 2217 | 
            +
                                  _, (id, line) = val
         | 
| 2218 | 
            +
             | 
| 2141 2219 | 
             
                                  lexer.lex_state = EXPR_END
         | 
| 2142 | 
            -
                                  result =  | 
| 2220 | 
            +
                                  result = s(:lit, id.to_sym).line line
         | 
| 2143 2221 | 
             
                                }
         | 
| 2144 2222 | 
             
                            | tSYMBOL
         | 
| 2145 2223 | 
             
                                {
         | 
| 2146 | 
            -
                                   | 
| 2224 | 
            +
                                  (id, line), = val
         | 
| 2225 | 
            +
             | 
| 2226 | 
            +
                                  lexer.lex_state = EXPR_END
         | 
| 2227 | 
            +
                                  result = s(:lit, id.to_sym).line line
         | 
| 2147 2228 | 
             
                                }
         | 
| 2148 2229 |  | 
| 2149 2230 | 
             
                         sym: fname | tIVAR | tGVAR | tCVAR
         | 
| 2150 2231 |  | 
| 2151 | 
            -
                        dsym: tSYMBEG  | 
| 2232 | 
            +
                        dsym: tSYMBEG string_contents tSTRING_END
         | 
| 2152 2233 | 
             
                                {
         | 
| 2153 2234 | 
             
                                  _, result, _ = val
         | 
| 2154 2235 |  | 
| @@ -2164,7 +2245,7 @@ regexp_contents: none | |
| 2164 2245 | 
             
                                  when :evstr then
         | 
| 2165 2246 | 
             
                                    result = s(:dsym, "", result).line result.line
         | 
| 2166 2247 | 
             
                                  else
         | 
| 2167 | 
            -
                                     | 
| 2248 | 
            +
                                    debug 39
         | 
| 2168 2249 | 
             
                                  end
         | 
| 2169 2250 | 
             
                                }
         | 
| 2170 2251 |  | 
| @@ -2172,11 +2253,13 @@ regexp_contents: none | |
| 2172 2253 | 
             
                            | tFLOAT
         | 
| 2173 2254 | 
             
                            | tUMINUS_NUM tINTEGER =tLOWEST
         | 
| 2174 2255 | 
             
                                {
         | 
| 2175 | 
            -
                                   | 
| 2256 | 
            +
                                  _, (num, line) = val
         | 
| 2257 | 
            +
                                  result = [-num, line]
         | 
| 2176 2258 | 
             
                                }
         | 
| 2177 2259 | 
             
                            | tUMINUS_NUM tFLOAT   =tLOWEST
         | 
| 2178 2260 | 
             
                                {
         | 
| 2179 | 
            -
                                   | 
| 2261 | 
            +
                                  _, (num, line) = val
         | 
| 2262 | 
            +
                                  result = [-num, line]
         | 
| 2180 2263 | 
             
                                }
         | 
| 2181 2264 |  | 
| 2182 2265 | 
             
               user_variable: tIDENTIFIER
         | 
| @@ -2204,8 +2287,10 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2204 2287 |  | 
| 2205 2288 | 
             
                     var_ref: user_variable
         | 
| 2206 2289 | 
             
                                {
         | 
| 2207 | 
            -
                                   | 
| 2290 | 
            +
                                  raise "NO: #{val.inspect}" if Sexp === val.first
         | 
| 2291 | 
            +
                                  (var, line), = val
         | 
| 2208 2292 | 
             
                                  result = Sexp === var ? var : self.gettable(var)
         | 
| 2293 | 
            +
                                  result.line line
         | 
| 2209 2294 | 
             
                                }
         | 
| 2210 2295 | 
             
                            | keyword_variable
         | 
| 2211 2296 | 
             
                                {
         | 
| @@ -2220,11 +2305,19 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2220 2305 | 
             
                            | keyword_variable
         | 
| 2221 2306 | 
             
                                {
         | 
| 2222 2307 | 
             
                                  result = self.assignable val[0]
         | 
| 2223 | 
            -
                                   | 
| 2308 | 
            +
                                  debug 40
         | 
| 2224 2309 | 
             
                                }
         | 
| 2225 2310 |  | 
| 2226 | 
            -
                     backref: tNTH_REF | 
| 2227 | 
            -
             | 
| 2311 | 
            +
                     backref: tNTH_REF
         | 
| 2312 | 
            +
                                {
         | 
| 2313 | 
            +
                                  (ref, line), = val
         | 
| 2314 | 
            +
                                  result = s(:nth_ref, ref).line line
         | 
| 2315 | 
            +
                                }
         | 
| 2316 | 
            +
                            | tBACK_REF
         | 
| 2317 | 
            +
                                {
         | 
| 2318 | 
            +
                                  (ref, line), = val
         | 
| 2319 | 
            +
                                  result = s(:back_ref, ref).line line
         | 
| 2320 | 
            +
                                }
         | 
| 2228 2321 |  | 
| 2229 2322 | 
             
                  superclass: tLT
         | 
| 2230 2323 | 
             
                                {
         | 
| @@ -2242,9 +2335,7 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2242 2335 |  | 
| 2243 2336 | 
             
                   f_arglist: tLPAREN2 f_args rparen
         | 
| 2244 2337 | 
             
                                {
         | 
| 2245 | 
            -
                                  result = val | 
| 2246 | 
            -
                                  self.lexer.lex_state = EXPR_BEG
         | 
| 2247 | 
            -
                                  self.lexer.command_start = true
         | 
| 2338 | 
            +
                                  result = end_args val
         | 
| 2248 2339 | 
             
                                }
         | 
| 2249 2340 | 
             
                            |   {
         | 
| 2250 2341 | 
             
                                  result = self.in_kwarg
         | 
| @@ -2253,12 +2344,7 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2253 2344 | 
             
                                }
         | 
| 2254 2345 | 
             
                                f_args term
         | 
| 2255 2346 | 
             
                                {
         | 
| 2256 | 
            -
                                   | 
| 2257 | 
            -
             | 
| 2258 | 
            -
                                  self.in_kwarg = kwarg
         | 
| 2259 | 
            -
                                  result = args
         | 
| 2260 | 
            -
                                  lexer.lex_state     = EXPR_BEG
         | 
| 2261 | 
            -
                                  lexer.command_start = true
         | 
| 2347 | 
            +
                                  result = end_args val
         | 
| 2262 2348 | 
             
                                }
         | 
| 2263 2349 |  | 
| 2264 2350 | 
             
                   args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
         | 
| @@ -2343,8 +2429,10 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2343 2429 | 
             
                            |
         | 
| 2344 2430 | 
             
                                {
         | 
| 2345 2431 | 
             
                                  result = args val
         | 
| 2432 | 
            +
                                  # result.line lexer.lineno
         | 
| 2346 2433 | 
             
                                }
         | 
| 2347 2434 |  | 
| 2435 | 
            +
             | 
| 2348 2436 | 
             
                   f_bad_arg: tCONSTANT
         | 
| 2349 2437 | 
             
                                {
         | 
| 2350 2438 | 
             
                                  yyerror "formal argument cannot be a constant"
         | 
| @@ -2365,31 +2453,24 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2365 2453 | 
             
                  f_norm_arg: f_bad_arg
         | 
| 2366 2454 | 
             
                            | tIDENTIFIER
         | 
| 2367 2455 | 
             
                                {
         | 
| 2368 | 
            -
                                   | 
| 2456 | 
            +
                                  (id, line), = val
         | 
| 2457 | 
            +
                                  identifier = id.to_sym
         | 
| 2369 2458 | 
             
                                  self.env[identifier] = :lvar
         | 
| 2370 2459 |  | 
| 2371 | 
            -
                                  result = identifier
         | 
| 2460 | 
            +
                                  result = [identifier, line]
         | 
| 2372 2461 | 
             
                                }
         | 
| 2373 2462 |  | 
| 2374 2463 | 
             
                  f_arg_item: f_norm_arg
         | 
| 2375 2464 | 
             
                            | tLPAREN f_margs rparen
         | 
| 2376 2465 | 
             
                                {
         | 
| 2377 | 
            -
                                   | 
| 2466 | 
            +
                                  _, margs, _ = val
         | 
| 2467 | 
            +
             | 
| 2468 | 
            +
                                  result = margs
         | 
| 2378 2469 | 
             
                                }
         | 
| 2379 2470 |  | 
| 2380 2471 | 
             
                       f_arg: f_arg_item
         | 
| 2381 2472 | 
             
                                {
         | 
| 2382 | 
            -
                                   | 
| 2383 | 
            -
             | 
| 2384 | 
            -
                                  case arg
         | 
| 2385 | 
            -
                                  when Symbol then
         | 
| 2386 | 
            -
                                    result = s(:args, arg).line lexer.lineno
         | 
| 2387 | 
            -
                                  when Sexp then
         | 
| 2388 | 
            -
                                    result = arg
         | 
| 2389 | 
            -
                                  else
         | 
| 2390 | 
            -
                                    debug20 32
         | 
| 2391 | 
            -
                                    raise "Unknown f_arg type: #{val.inspect}"
         | 
| 2392 | 
            -
                                  end
         | 
| 2473 | 
            +
                                  result = new_arg val
         | 
| 2393 2474 | 
             
                                }
         | 
| 2394 2475 | 
             
                            | f_arg tCOMMA f_arg_item
         | 
| 2395 2476 | 
             
                                {
         | 
| @@ -2401,7 +2482,7 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2401 2482 | 
             
                                    result = s(:args, list).line list.line
         | 
| 2402 2483 | 
             
                                  end
         | 
| 2403 2484 |  | 
| 2404 | 
            -
                                  result << item
         | 
| 2485 | 
            +
                                  result << (Sexp === item ? item : item.first)
         | 
| 2405 2486 | 
             
                                }
         | 
| 2406 2487 |  | 
| 2407 2488 | 
             
                        f_kw: tLABEL arg_value
         | 
| @@ -2442,26 +2523,33 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2442 2523 | 
             
                 kwrest_mark: tPOW
         | 
| 2443 2524 | 
             
                            | tDSTAR
         | 
| 2444 2525 |  | 
| 2526 | 
            +
             | 
| 2445 2527 | 
             
                    f_kwrest: kwrest_mark tIDENTIFIER
         | 
| 2446 2528 | 
             
                                {
         | 
| 2447 | 
            -
                                   | 
| 2448 | 
            -
             | 
| 2449 | 
            -
                                   | 
| 2529 | 
            +
                                  _, (id, line) = val
         | 
| 2530 | 
            +
             | 
| 2531 | 
            +
                                  name = id.to_sym
         | 
| 2532 | 
            +
                                  self.assignable [name, line]
         | 
| 2533 | 
            +
                                  result = [:"**#{name}", line]
         | 
| 2450 2534 | 
             
                                }
         | 
| 2451 2535 | 
             
                            | kwrest_mark
         | 
| 2452 2536 | 
             
                                {
         | 
| 2453 | 
            -
                                   | 
| 2537 | 
            +
                                  id = :"**"
         | 
| 2538 | 
            +
                                  self.env[id] = :lvar # TODO: needed?!?
         | 
| 2539 | 
            +
                                  result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno
         | 
| 2454 2540 | 
             
                                }
         | 
| 2455 2541 |  | 
| 2456 2542 | 
             
                       f_opt: tIDENTIFIER tEQL arg_value
         | 
| 2457 2543 | 
             
                                {
         | 
| 2458 | 
            -
                                   | 
| 2544 | 
            +
                                  lhs, _, rhs = val
         | 
| 2545 | 
            +
                                  result = self.assignable lhs, rhs
         | 
| 2459 2546 | 
             
                                  # TODO: detect duplicate names
         | 
| 2460 2547 | 
             
                                }
         | 
| 2461 2548 |  | 
| 2462 2549 | 
             
                 f_block_opt: tIDENTIFIER tEQL primary_value
         | 
| 2463 2550 | 
             
                                {
         | 
| 2464 | 
            -
                                   | 
| 2551 | 
            +
                                  lhs, _, rhs = val
         | 
| 2552 | 
            +
                                  result = self.assignable lhs, rhs
         | 
| 2465 2553 | 
             
                                }
         | 
| 2466 2554 |  | 
| 2467 2555 | 
             
              f_block_optarg: f_block_opt
         | 
| @@ -2491,30 +2579,33 @@ keyword_variable: kNIL      { result = s(:nil).line lexer.lineno } | |
| 2491 2579 | 
             
                  f_rest_arg: restarg_mark tIDENTIFIER
         | 
| 2492 2580 | 
             
                                {
         | 
| 2493 2581 | 
             
                                  # TODO: differs from parse.y - needs tests
         | 
| 2494 | 
            -
                                   | 
| 2495 | 
            -
                                   | 
| 2496 | 
            -
                                   | 
| 2582 | 
            +
                                  _, (id, line) = val
         | 
| 2583 | 
            +
                                  name = id.to_sym
         | 
| 2584 | 
            +
                                  self.assignable [name, line]
         | 
| 2585 | 
            +
                                  result = [:"*#{name}", line]
         | 
| 2497 2586 | 
             
                                }
         | 
| 2498 2587 | 
             
                            | restarg_mark
         | 
| 2499 2588 | 
             
                                {
         | 
| 2500 2589 | 
             
                                  name = :"*"
         | 
| 2501 2590 | 
             
                                  self.env[name] = :lvar
         | 
| 2502 | 
            -
                                  result = name
         | 
| 2591 | 
            +
                                  result = [name, lexer.lineno] # FIX: tSTAR to include lineno
         | 
| 2503 2592 | 
             
                                }
         | 
| 2504 2593 |  | 
| 2505 2594 | 
             
                 blkarg_mark: tAMPER2 | tAMPER
         | 
| 2506 2595 |  | 
| 2507 2596 | 
             
                 f_block_arg: blkarg_mark tIDENTIFIER
         | 
| 2508 2597 | 
             
                                {
         | 
| 2509 | 
            -
                                   | 
| 2598 | 
            +
                                  _, (id, line) = val
         | 
| 2599 | 
            +
                                  identifier = id.to_sym
         | 
| 2510 2600 |  | 
| 2511 2601 | 
             
                                  self.env[identifier] = :lvar
         | 
| 2512 | 
            -
                                  result = "&#{identifier}".to_sym
         | 
| 2602 | 
            +
                                  result = ["&#{identifier}".to_sym, line]
         | 
| 2513 2603 | 
             
                                }
         | 
| 2514 2604 |  | 
| 2515 2605 | 
             
             opt_f_block_arg: tCOMMA f_block_arg
         | 
| 2516 2606 | 
             
                                {
         | 
| 2517 | 
            -
                                   | 
| 2607 | 
            +
                                  _, arg = val
         | 
| 2608 | 
            +
                                  result = arg
         | 
| 2518 2609 | 
             
                                }
         | 
| 2519 2610 | 
             
                            |
         | 
| 2520 2611 | 
             
                                {
         |