@@ -86,6 +86,22 @@ def cmdarg?
86
86
( @cmdarg & 1 ) != 0
87
87
end
88
88
89
+ def arg?
90
+ [ :expr_arg , :expr_cmdarg ] . include? @lex_state
91
+ end
92
+
93
+ def end?
94
+ [ :expr_end , :expr_endarg , :expr_endfn ] . include? @lex_state
95
+ end
96
+
97
+ def beg?
98
+ [ :expr_beg , :expr_value , :expr_mid , :expr_class ] . include? @lex_state
99
+ end
100
+
101
+ def after_operator?
102
+ [ :expr_fname , :expr_dot ] . include? @lex_state
103
+ end
104
+
89
105
def next_string_token
90
106
# str_parse, scanner = current_string_parse, @scanner
91
107
str_parse = @string_parse
@@ -269,15 +285,15 @@ def next_token
269
285
# if we are trying to parse a string, then delegate to that
270
286
return next_string_token if @string_parse
271
287
272
- # scanner, space_seen, cmd_start, c = @scanner, false, false, ''
288
+ # scanner, @ space_seen, cmd_start, c = @scanner, false, false, ''
273
289
scanner = @scanner
274
- space_seen = false
290
+ @ space_seen = false
275
291
cmd_start = false
276
292
c = ''
277
293
278
294
while true
279
295
if scanner . scan ( /\ |\t |\r / )
280
- space_seen = true
296
+ @ space_seen = true
281
297
next
282
298
283
299
elsif scanner . scan ( /(\n |#)/ )
@@ -290,7 +306,7 @@ def next_token
290
306
next if [ :expr_beg , :expr_dot ] . include? @lex_state
291
307
292
308
if scanner . scan ( /([\ \t \r \f \v ]*)\. / )
293
- space_seen = true unless scanner [ 1 ] . empty?
309
+ @ space_seen = true unless scanner [ 1 ] . empty?
294
310
scanner . pos = scanner . pos - 1
295
311
296
312
next unless scanner . check ( /\. \. / )
@@ -304,6 +320,83 @@ def next_token
304
320
@lex_state = :expr_beg
305
321
return ';' , ';'
306
322
323
+ elsif scanner . scan ( /\* / )
324
+ if scanner . scan ( /\* / )
325
+ if scanner . scan ( /\= / )
326
+ @lex_state = :expr_beg
327
+ return :OP_ASGN , '**'
328
+ end
329
+
330
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
331
+ @lex_state = :expr_arg
332
+ else
333
+ @lex_state = :expr_beg
334
+ end
335
+
336
+ return '**' , '**'
337
+
338
+ else
339
+ if scanner . scan ( /\= / )
340
+ @lex_state = :expr_beg
341
+ return :OP_ASGN , '*'
342
+ end
343
+ end
344
+
345
+ if scanner . scan ( /\* \= / )
346
+ @lex_state = :expr_beg
347
+ return :OP_ASGN , '**'
348
+ end
349
+
350
+ if scanner . scan ( /\* / )
351
+ if after_operator?
352
+ @lex_state = :expr_arg
353
+ else
354
+ @lex_state = :expr_beg
355
+ end
356
+
357
+ return '**' , '**'
358
+ end
359
+
360
+ if scanner . scan ( /\= / )
361
+ @lex_state = :expr_beg
362
+ return :OP_ASGN , '*'
363
+ else
364
+ result = '*'
365
+ if @lex_state == :expr_fname
366
+ @lex_state = :expr_end
367
+ return '*' , result
368
+ elsif @space_seen && scanner . check ( /\S / )
369
+ @lex_state = :expr_beg
370
+ return :SPLAT , result
371
+ elsif [ :expr_beg , :expr_mid ] . include? @lex_state
372
+ @lex_state = :expr_beg
373
+ return :SPLAT , result
374
+ else
375
+ @lex_state = :expr_beg
376
+ return '*' , result
377
+ end
378
+ end
379
+
380
+ elsif scanner . scan ( /\! / )
381
+ c = scanner . scan ( /./ )
382
+ if after_operator?
383
+ @lex_state = :expr_arg
384
+ if c == "@"
385
+ return '!' , '!'
386
+ end
387
+ else
388
+ @lex_state = :expr_beg
389
+ end
390
+
391
+ if c == '='
392
+ return '!=' , '!='
393
+ elsif c == '~'
394
+ return '!~' , '!~'
395
+ end
396
+
397
+ scanner . pos = scanner . pos - 1
398
+ return '!' , '!'
399
+
307
400
elsif scanner . scan ( /\" / )
308
401
@string_parse = { :beg => '"' , :end => '"' , :interpolate => true }
309
402
return :STRING_BEG , scanner . matched
@@ -359,7 +452,7 @@ def next_token
359
452
elsif @lex_state == :expr_fname
360
453
@lex_state = :expr_end
361
454
elsif @lex_state == :expr_cmdarg || @lex_state == :expr_arg
362
- if !scanner . check ( /\s / ) && space_seen
455
+ if !scanner . check ( /\s / ) && @ space_seen
363
456
@string_parse = { :beg => '/' , :end => '/' , :interpolate => true , :regexp => true }
364
457
return :REGEXP_BEG , scanner . matched
365
458
end
@@ -374,7 +467,7 @@ def next_token
374
467
@lex_state = :expr_beg
375
468
return :OP_ASGN , '%'
376
469
elsif scanner . check ( /[^\s ]/ )
377
- if @lex_state == :expr_beg or ( @lex_state == :expr_arg && space_seen )
470
+ if @lex_state == :expr_beg or ( @lex_state == :expr_arg && @ space_seen)
378
471
interpolate = true
379
472
start_word = scanner . scan ( /./ )
380
473
end_word = { '(' => ')' , '[' => ']' , '{' => '}' } [ start_word ] || start_word
@@ -387,7 +480,7 @@ def next_token
387
480
388
481
elsif scanner . scan ( /\\ / )
389
482
if scanner . scan ( /\r ?\n / )
390
- space_seen = true
483
+ @ space_seen = true
391
484
next
392
485
end
393
486
@@ -397,7 +490,7 @@ def next_token
397
490
result = scanner . matched
398
491
if [ :expr_beg , :expr_mid ] . include? @lex_state
399
492
result = :PAREN_BEG
400
- elsif space_seen && [ :expr_arg , :expr_cmdarg ] . include? ( @lex_state )
493
+ elsif @ space_seen && [ :expr_arg , :expr_cmdarg ] . include? ( @lex_state )
401
494
result = :tLPAREN_ARG
402
495
else
403
496
result = '('
@@ -427,7 +520,7 @@ def next_token
427
520
else
428
521
raise "Unexpected '[' token"
429
522
end
430
- elsif [ :expr_beg , :expr_mid ] . include? ( @lex_state ) || space_seen
523
+ elsif [ :expr_beg , :expr_mid ] . include? ( @lex_state ) || @ space_seen
431
524
@lex_state = :expr_beg
432
525
cond_push 0
433
526
cmdarg_push 0
@@ -464,43 +557,11 @@ def next_token
464
557
@lex_state = :expr_dot unless @lex_state == :expr_fname
465
558
return '.' , scanner . matched
466
559
467
- elsif scanner . scan ( /\* \* \= / )
468
- @lex_state = :expr_beg
469
- return :OP_ASGN , '**'
470
-
471
- elsif scanner . scan ( /\* \* / )
472
- if @lex_state == :expr_fname or @lex_state == :expr_dot
473
- @lex_state = :expr_arg
474
- else
475
- @lex_state = :expr_beg
476
- end
477
- return '**' , '**'
478
-
479
- elsif scanner . scan ( /\* \= / )
480
- @lex_state = :expr_beg
481
- return :OP_ASGN , '*'
482
-
483
- elsif scanner . scan ( /\* / )
484
- result = scanner . matched
485
- if @lex_state == :expr_fname
486
- @lex_state = :expr_end
487
- return '*' , result
488
- elsif space_seen && scanner . check ( /\S / )
489
- @lex_state = :expr_beg
490
- return :SPLAT , result
491
- elsif [ :expr_beg , :expr_mid ] . include? @lex_state
492
- @lex_state = :expr_beg
493
- return :SPLAT , result
494
- else
495
- @lex_state = :expr_beg
496
- return '*' , result
497
- end
498
-
499
560
elsif scanner . scan ( /\: \: / )
500
561
if [ :expr_beg , :expr_mid , :expr_class ] . include? @lex_state
501
562
@lex_state = :expr_beg
502
563
return '::@' , scanner . matched
503
- elsif space_seen && @lex_state == :expr_arg
564
+ elsif @ space_seen && @lex_state == :expr_arg
504
565
@lex_state = :expr_beg
505
566
return '::@' , scanner . matched
506
567
end
@@ -571,7 +632,7 @@ def next_token
571
632
@lex_state = :expr_beg
572
633
return :OP_ASGN , '&'
573
634
elsif scanner . scan ( /\& / )
574
- if space_seen && !scanner . check ( /\s / ) && ( @lex_state == :expr_cmdarg || @lex_state == :expr_arg )
635
+ if @ space_seen && !scanner . check ( /\s / ) && ( @lex_state == :expr_cmdarg || @lex_state == :expr_arg )
575
636
return '&@' , '&'
576
637
elsif [ :expr_beg , :expr_mid ] . include? @lex_state
577
638
return '&@' , '&'
@@ -594,7 +655,7 @@ def next_token
594
655
if @lex_state == :expr_fname
595
656
@lex_state = :expr_end
596
657
return '<<' , '<<'
597
- elsif ![ :expr_end , :expr_dot , :expr_endarg , :expr_class ] . include? ( @lex_state ) && space_seen
658
+ elsif ![ :expr_end , :expr_dot , :expr_endarg , :expr_class ] . include? ( @lex_state ) && @ space_seen
598
659
if scanner . scan ( /(-?)['"]?(\w +)['"]?/ )
599
660
heredoc = scanner [ 2 ]
600
661
# for now just scrap rest of line + skip down one line for
@@ -682,7 +743,7 @@ def next_token
682
743
end
683
744
684
745
if @lex_state == :expr_cmdarg || @lex_state == :expr_arg
685
- if !scanner . check ( /\s / ) && space_seen
746
+ if !scanner . check ( /\s / ) && @ space_seen
686
747
@lex_state = :expr_mid
687
748
return [ sign , sign ]
688
749
end
@@ -701,19 +762,7 @@ def next_token
701
762
@lex_state = :expr_end
702
763
return :STRING , scanner . scan ( /./ )
703
764
end
704
- #if scanner.scan(/\\/)
705
- #c = if scanner.scan(/n/)
706
- #"\n"
707
- #else
708
- #scanner.scan(/./)
709
- #scanner.matched
710
- #end
711
- #else
712
- #c = scanner.scan(/./)
713
- #end
714
-
715
- #@lex_state = :expr_end
716
- #return :STRING, c
765
+
717
766
@lex_state = :expr_beg
718
767
return '?' , scanner . matched
719
768
@@ -749,26 +798,6 @@ def next_token
749
798
@lex_state = :expr_beg
750
799
return '=' , '='
751
800
752
- elsif scanner . scan ( /\! \= / )
753
- if @lex_state == :expr_fname
754
- @lex_state == :expr_end
755
- return '!=' , '!='
756
- end
757
- @lex_state = :expr_beg
758
- return '!=' , '!='
759
-
760
- elsif scanner . scan ( /\! \~ / )
761
- @lex_state = :expr_beg
762
- return '!~' , '!~'
763
-
764
- elsif scanner . scan ( /\! / )
765
- if @lex_state == :expr_fname
766
- @lex_state = :expr_end
767
- return '!' , '!'
768
- end
769
- @lex_state = :expr_beg
770
- return '!' , '!'
771
-
772
801
elsif scanner . scan ( /\~ / )
773
802
if @lex_state == :expr_fname
774
803
@lex_state = :expr_end
0 commit comments