ruby_parser 3.9.0 → 3.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +17 -0
- data/Rakefile +2 -2
- data/lib/rp_extensions.rb +5 -1
- data/lib/ruby18_parser.rb +15 -9
- data/lib/ruby18_parser.y +15 -9
- data/lib/ruby19_parser.rb +19 -15
- data/lib/ruby19_parser.y +19 -15
- data/lib/ruby20_parser.rb +2229 -2223
- data/lib/ruby20_parser.y +34 -23
- data/lib/ruby21_parser.rb +2546 -2530
- data/lib/ruby21_parser.y +34 -23
- data/lib/ruby22_parser.rb +2567 -2552
- data/lib/ruby22_parser.y +35 -24
- data/lib/ruby23_parser.rb +2505 -2483
- data/lib/ruby23_parser.y +35 -24
- data/lib/ruby24_parser.rb +2505 -2483
- data/lib/ruby24_parser.y +35 -24
- data/lib/ruby_lexer.rb +84 -11
- data/lib/ruby_parser.yy +35 -24
- data/lib/ruby_parser_extras.rb +112 -89
- data/test/test_ruby_lexer.rb +67 -0
- data/test/test_ruby_parser.rb +32 -1
- metadata +6 -6
- metadata.gz.sig +0 -0
data/lib/ruby_parser_extras.rb
CHANGED
@@ -7,7 +7,7 @@ require "rp_extensions"
|
|
7
7
|
require "rp_stringscanner"
|
8
8
|
|
9
9
|
module RubyParserStuff
|
10
|
-
VERSION = "3.
|
10
|
+
VERSION = "3.10.0"
|
11
11
|
|
12
12
|
attr_accessor :lexer, :in_def, :in_single, :file
|
13
13
|
attr_reader :env, :comments
|
@@ -52,7 +52,7 @@ module RubyParserStuff
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def arg_blk_pass node1, node2 # TODO: nuke
|
55
|
-
node1 = s(:arglist, node1) unless [:arglist, :call_args, :array, :args].include? node1.
|
55
|
+
node1 = s(:arglist, node1) unless [:arglist, :call_args, :array, :args].include? node1.sexp_type
|
56
56
|
node1 << node2 if node2
|
57
57
|
node1
|
58
58
|
end
|
@@ -67,7 +67,7 @@ module RubyParserStuff
|
|
67
67
|
case sexp.sexp_type
|
68
68
|
when :masgn then
|
69
69
|
if sexp.size == 2 and sexp[1].sexp_type == :array then
|
70
|
-
s(:masgn, *sexp[1]
|
70
|
+
s(:masgn, *sexp[1].sexp_body.map { |sub| clean_mlhs sub })
|
71
71
|
else
|
72
72
|
debug20 5
|
73
73
|
sexp
|
@@ -86,7 +86,7 @@ module RubyParserStuff
|
|
86
86
|
|
87
87
|
def block_var *args
|
88
88
|
result = self.args args
|
89
|
-
result
|
89
|
+
result.sexp_type = :masgn
|
90
90
|
result
|
91
91
|
end
|
92
92
|
|
@@ -101,7 +101,7 @@ module RubyParserStuff
|
|
101
101
|
ary << "&#{block[1]}".to_sym if block
|
102
102
|
|
103
103
|
if ary.length > 2 or ary.splat then # HACK
|
104
|
-
s(:masgn, *ary
|
104
|
+
s(:masgn, *ary.sexp_body)
|
105
105
|
else
|
106
106
|
ary.last
|
107
107
|
end
|
@@ -112,7 +112,7 @@ module RubyParserStuff
|
|
112
112
|
when :kwsplat then
|
113
113
|
array
|
114
114
|
else
|
115
|
-
s(:hash, *array
|
115
|
+
s(:hash, *array.sexp_body)
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
@@ -124,7 +124,7 @@ module RubyParserStuff
|
|
124
124
|
when Sexp then
|
125
125
|
case arg.sexp_type
|
126
126
|
when :array, :args, :call_args then # HACK? remove array at some point
|
127
|
-
result.concat arg
|
127
|
+
result.concat arg.sexp_body
|
128
128
|
else
|
129
129
|
result << arg
|
130
130
|
end
|
@@ -148,7 +148,7 @@ module RubyParserStuff
|
|
148
148
|
when Sexp then
|
149
149
|
case arg.sexp_type
|
150
150
|
when :args, :block, :array, :call_args then # HACK call_args mismatch
|
151
|
-
result.concat arg
|
151
|
+
result.concat arg.sexp_body
|
152
152
|
when :block_arg then
|
153
153
|
result << :"&#{arg.last}"
|
154
154
|
when :shadow then
|
@@ -177,8 +177,8 @@ module RubyParserStuff
|
|
177
177
|
end
|
178
178
|
|
179
179
|
def aryset receiver, index
|
180
|
-
index ||=
|
181
|
-
s(:attrasgn, receiver, :"[]=", *index
|
180
|
+
index ||= s()
|
181
|
+
s(:attrasgn, receiver, :"[]=", *index.sexp_body).compact # [].sexp_body => nil
|
182
182
|
end
|
183
183
|
|
184
184
|
def assignable(lhs, value = nil)
|
@@ -233,7 +233,7 @@ module RubyParserStuff
|
|
233
233
|
return nil if node.nil?
|
234
234
|
node = value_expr node
|
235
235
|
|
236
|
-
case node.
|
236
|
+
case node.sexp_type
|
237
237
|
when :lit then
|
238
238
|
if Regexp === node.last then
|
239
239
|
return s(:match, node)
|
@@ -247,11 +247,13 @@ module RubyParserStuff
|
|
247
247
|
when :dot2 then
|
248
248
|
label = "flip#{node.hash}"
|
249
249
|
env[label] = :lvar
|
250
|
-
|
250
|
+
_, lhs, rhs = node
|
251
|
+
return s(:flip2, lhs, rhs)
|
251
252
|
when :dot3 then
|
252
253
|
label = "flip#{node.hash}"
|
253
254
|
env[label] = :lvar
|
254
|
-
|
255
|
+
_, lhs, rhs = node
|
256
|
+
return s(:flip3, lhs, rhs)
|
255
257
|
else
|
256
258
|
return node
|
257
259
|
end
|
@@ -266,7 +268,7 @@ module RubyParserStuff
|
|
266
268
|
|
267
269
|
def new_match lhs, rhs
|
268
270
|
if lhs then
|
269
|
-
case lhs
|
271
|
+
case lhs.sexp_type
|
270
272
|
when :dregx, :dregx_once then
|
271
273
|
return s(:match2, lhs, rhs).line(lhs.line)
|
272
274
|
when :lit then
|
@@ -275,7 +277,7 @@ module RubyParserStuff
|
|
275
277
|
end
|
276
278
|
|
277
279
|
if rhs then
|
278
|
-
case rhs
|
280
|
+
case rhs.sexp_type
|
279
281
|
when :dregx, :dregx_once then
|
280
282
|
return s(:match3, rhs, lhs).line(lhs.line)
|
281
283
|
when :lit then
|
@@ -347,12 +349,12 @@ module RubyParserStuff
|
|
347
349
|
|
348
350
|
def list_append list, item # TODO: nuke me *sigh*
|
349
351
|
return s(:array, item) unless list
|
350
|
-
list = s(:array, list) unless Sexp === list && list.
|
352
|
+
list = s(:array, list) unless Sexp === list && list.sexp_type == :array
|
351
353
|
list << item
|
352
354
|
end
|
353
355
|
|
354
356
|
def list_prepend item, list # TODO: nuke me *sigh*
|
355
|
-
list = s(:array, list) unless Sexp === list && list
|
357
|
+
list = s(:array, list) unless Sexp === list && list.sexp_type == :array
|
356
358
|
list.insert 1, item
|
357
359
|
list
|
358
360
|
end
|
@@ -361,37 +363,43 @@ module RubyParserStuff
|
|
361
363
|
return tail unless head
|
362
364
|
return head unless tail
|
363
365
|
|
364
|
-
htype, ttype = head
|
366
|
+
htype, ttype = head.sexp_type, tail.sexp_type
|
365
367
|
|
366
368
|
head = s(:dstr, '', head) if htype == :evstr
|
367
369
|
|
368
370
|
case ttype
|
369
371
|
when :str then
|
370
372
|
if htype == :str
|
371
|
-
head
|
373
|
+
head.last << tail.last
|
372
374
|
elsif htype == :dstr and head.size == 2 then
|
373
|
-
head
|
375
|
+
head.last << tail.last
|
374
376
|
else
|
375
377
|
head << tail
|
376
378
|
end
|
377
379
|
when :dstr then
|
378
380
|
if htype == :str then
|
379
381
|
lineno = head.line
|
380
|
-
tail[1] = head
|
382
|
+
tail[1] = head.last + tail[1]
|
381
383
|
head = tail
|
382
384
|
head.line = lineno
|
383
385
|
else
|
384
|
-
tail
|
386
|
+
tail.sexp_type = :array
|
385
387
|
tail[1] = s(:str, tail[1])
|
386
388
|
tail.delete_at 1 if tail[1] == s(:str, '')
|
387
389
|
|
388
|
-
head.push(*tail
|
390
|
+
head.push(*tail.sexp_body)
|
389
391
|
end
|
390
392
|
when :evstr then
|
391
|
-
|
392
|
-
|
393
|
-
head
|
394
|
-
head
|
393
|
+
if htype == :str then
|
394
|
+
f, l = head.file, head.line
|
395
|
+
head = s(:dstr, *head.sexp_body)
|
396
|
+
head.file = f
|
397
|
+
head.line = l
|
398
|
+
end
|
399
|
+
|
400
|
+
if head.size == 2 and tail.size > 1 and tail[1].sexp_type == :str then
|
401
|
+
head.last << tail[1].last
|
402
|
+
head.sexp_type = :str if head.size == 2 # HACK ?
|
395
403
|
else
|
396
404
|
head.push(tail)
|
397
405
|
end
|
@@ -406,14 +414,16 @@ module RubyParserStuff
|
|
406
414
|
def logical_op type, left, right
|
407
415
|
left = value_expr left
|
408
416
|
|
409
|
-
if left and left
|
410
|
-
node,
|
417
|
+
if left and left.sexp_type == type and not left.paren then
|
418
|
+
node, rhs = left, nil
|
411
419
|
|
412
|
-
|
413
|
-
|
420
|
+
loop do
|
421
|
+
_, _lhs, rhs = node
|
422
|
+
break unless rhs && rhs.sexp_type == type and not rhs.paren
|
423
|
+
node = rhs
|
414
424
|
end
|
415
425
|
|
416
|
-
node[2] = s(type,
|
426
|
+
node[2] = s(type, rhs, right)
|
417
427
|
|
418
428
|
return left
|
419
429
|
end
|
@@ -426,7 +436,7 @@ module RubyParserStuff
|
|
426
436
|
|
427
437
|
def new_aref val
|
428
438
|
val[2] ||= s(:arglist)
|
429
|
-
val[2]
|
439
|
+
val[2].sexp_type = :arglist if val[2].sexp_type == :array # REFACTOR
|
430
440
|
if val[0].node_type == :self then
|
431
441
|
result = new_call nil, :"[]", val[2]
|
432
442
|
else
|
@@ -468,13 +478,13 @@ module RubyParserStuff
|
|
468
478
|
end
|
469
479
|
|
470
480
|
def argl x
|
471
|
-
x = s(:arglist, x) if x and x
|
481
|
+
x = s(:arglist, x) if x and x.sexp_type == :array
|
472
482
|
x
|
473
483
|
end
|
474
484
|
|
475
485
|
def backref_assign_error ref
|
476
486
|
# TODO: need a test for this... obviously
|
477
|
-
case ref.
|
487
|
+
case ref.sexp_type
|
478
488
|
when :nth_ref then
|
479
489
|
raise "write a test 2"
|
480
490
|
raise SyntaxError, "Can't set variable %p" % ref.last
|
@@ -500,7 +510,7 @@ module RubyParserStuff
|
|
500
510
|
# TODO: need a test with f(&b) { } to produce warning
|
501
511
|
|
502
512
|
if args
|
503
|
-
if [:arglist, :args, :array, :call_args].include? args.
|
513
|
+
if [:arglist, :args, :array, :call_args].include? args.sexp_type
|
504
514
|
result.concat args.sexp_body
|
505
515
|
else
|
506
516
|
result << args
|
@@ -539,7 +549,7 @@ module RubyParserStuff
|
|
539
549
|
|
540
550
|
result[2..-1].each do |node|
|
541
551
|
block = node.block(:delete)
|
542
|
-
node.concat block
|
552
|
+
node.concat block.sexp_body if block
|
543
553
|
end
|
544
554
|
|
545
555
|
# else
|
@@ -556,8 +566,8 @@ module RubyParserStuff
|
|
556
566
|
result = s(:class, path, superclass)
|
557
567
|
|
558
568
|
if body then
|
559
|
-
if body.
|
560
|
-
result.push(*body
|
569
|
+
if body.sexp_type == :block then
|
570
|
+
result.push(*body.sexp_body)
|
561
571
|
else
|
562
572
|
result.push body
|
563
573
|
end
|
@@ -581,8 +591,8 @@ module RubyParserStuff
|
|
581
591
|
result = s(:defn, name.to_sym, args)
|
582
592
|
|
583
593
|
if body then
|
584
|
-
if body.
|
585
|
-
result.push(*body
|
594
|
+
if body.sexp_type == :block then
|
595
|
+
result.push(*body.sexp_body)
|
586
596
|
else
|
587
597
|
result.push body
|
588
598
|
end
|
@@ -602,8 +612,8 @@ module RubyParserStuff
|
|
602
612
|
result = s(:defs, recv, name.to_sym, args)
|
603
613
|
|
604
614
|
if body then
|
605
|
-
if body.
|
606
|
-
result.push(*body
|
615
|
+
if body.sexp_type == :block then
|
616
|
+
result.push(*body.sexp_body)
|
607
617
|
else
|
608
618
|
result.push body
|
609
619
|
end
|
@@ -627,7 +637,7 @@ module RubyParserStuff
|
|
627
637
|
def new_if c, t, f
|
628
638
|
l = [c.line, t && t.line, f && f.line].compact.min
|
629
639
|
c = cond c
|
630
|
-
c, t, f = c.last, f, t if c
|
640
|
+
c, t, f = c.last, f, t if c.sexp_type == :not and canonicalize_conditions
|
631
641
|
s(:if, c, t, f).line(l)
|
632
642
|
end
|
633
643
|
|
@@ -642,7 +652,7 @@ module RubyParserStuff
|
|
642
652
|
result << args
|
643
653
|
result << body if body
|
644
654
|
|
645
|
-
args
|
655
|
+
args.sexp_type = :args unless args == 0
|
646
656
|
|
647
657
|
result
|
648
658
|
end
|
@@ -654,10 +664,12 @@ module RubyParserStuff
|
|
654
664
|
end
|
655
665
|
|
656
666
|
def new_masgn lhs, rhs, wrap = false
|
667
|
+
_, ary = lhs
|
668
|
+
|
657
669
|
rhs = value_expr(rhs)
|
658
|
-
rhs =
|
670
|
+
rhs = ary ? s(:to_ary, rhs) : s(:array, rhs) if wrap
|
659
671
|
|
660
|
-
lhs.delete_at 1 if
|
672
|
+
lhs.delete_at 1 if ary.nil?
|
661
673
|
lhs << rhs
|
662
674
|
|
663
675
|
lhs
|
@@ -669,8 +681,8 @@ module RubyParserStuff
|
|
669
681
|
result = s(:module, path)
|
670
682
|
|
671
683
|
if body then # REFACTOR?
|
672
|
-
if body.
|
673
|
-
result.push(*body
|
684
|
+
if body.sexp_type == :block then
|
685
|
+
result.push(*body.sexp_body)
|
674
686
|
else
|
675
687
|
result.push body
|
676
688
|
end
|
@@ -741,9 +753,9 @@ module RubyParserStuff
|
|
741
753
|
k = c if c =~ /[esu]/ if RUBY_VERSION < "1.9"
|
742
754
|
end
|
743
755
|
|
744
|
-
case node
|
756
|
+
case node.sexp_type
|
745
757
|
when :str then
|
746
|
-
node
|
758
|
+
node.sexp_type = :lit
|
747
759
|
node[1] = if k then
|
748
760
|
Regexp.new(node[1], o, k)
|
749
761
|
else
|
@@ -762,14 +774,14 @@ module RubyParserStuff
|
|
762
774
|
end
|
763
775
|
when :dstr then
|
764
776
|
if options =~ /o/ then
|
765
|
-
node
|
777
|
+
node.sexp_type = :dregx_once
|
766
778
|
else
|
767
|
-
node
|
779
|
+
node.sexp_type = :dregx
|
768
780
|
end
|
769
781
|
node << o if o and o != 0
|
770
782
|
else
|
771
783
|
node = s(:dregx, '', node);
|
772
|
-
node
|
784
|
+
node.sexp_type = :dregx_once if options =~ /o/
|
773
785
|
node << o if o and o != 0
|
774
786
|
end
|
775
787
|
|
@@ -777,12 +789,12 @@ module RubyParserStuff
|
|
777
789
|
end
|
778
790
|
|
779
791
|
def new_resbody cond, body
|
780
|
-
if body && body.
|
792
|
+
if body && body.sexp_type == :block then
|
781
793
|
body.shift # remove block and splat it in directly
|
782
794
|
else
|
783
795
|
body = [body]
|
784
796
|
end
|
785
|
-
s(:resbody, cond, *body)
|
797
|
+
s(:resbody, cond, *body).line cond.line
|
786
798
|
end
|
787
799
|
|
788
800
|
def new_sclass val
|
@@ -791,8 +803,8 @@ module RubyParserStuff
|
|
791
803
|
result = s(:sclass, recv)
|
792
804
|
|
793
805
|
if body then
|
794
|
-
if body.
|
795
|
-
result.push(*body
|
806
|
+
if body.sexp_type == :block then
|
807
|
+
result.push(*body.sexp_body)
|
796
808
|
else
|
797
809
|
result.push body
|
798
810
|
end
|
@@ -833,7 +845,7 @@ module RubyParserStuff
|
|
833
845
|
end
|
834
846
|
|
835
847
|
def new_word_list_entry val
|
836
|
-
result = val[1]
|
848
|
+
result = val[1].sexp_type == :evstr ? s(:dstr, "", val[1]) : val[1]
|
837
849
|
self.lexer.fixup_lineno
|
838
850
|
result
|
839
851
|
end
|
@@ -862,9 +874,9 @@ module RubyParserStuff
|
|
862
874
|
|
863
875
|
result ||= s(:str, "")
|
864
876
|
|
865
|
-
case sym
|
877
|
+
case sym.sexp_type
|
866
878
|
when :dstr then
|
867
|
-
sym
|
879
|
+
sym.sexp_type = :dsym
|
868
880
|
when :str then
|
869
881
|
sym = s(:lit, sym.last.to_sym)
|
870
882
|
else
|
@@ -880,7 +892,7 @@ module RubyParserStuff
|
|
880
892
|
s(:super, args)
|
881
893
|
else
|
882
894
|
args ||= s(:arglist)
|
883
|
-
s(:super, *args
|
895
|
+
s(:super, *args.sexp_body)
|
884
896
|
end
|
885
897
|
end
|
886
898
|
|
@@ -899,11 +911,11 @@ module RubyParserStuff
|
|
899
911
|
def new_until_or_while type, block, expr, pre
|
900
912
|
other = type == :until ? :while : :until
|
901
913
|
line = [block && block.line, expr.line].compact.min
|
902
|
-
block, pre = block.last, false if block && block
|
914
|
+
block, pre = block.last, false if block && block.sexp_type == :begin
|
903
915
|
|
904
916
|
expr = cond expr
|
905
917
|
|
906
|
-
result = unless expr.
|
918
|
+
result = unless expr.sexp_type == :not and canonicalize_conditions then
|
907
919
|
s(type, expr, block, pre)
|
908
920
|
else
|
909
921
|
s(other, expr.last, block, pre)
|
@@ -923,11 +935,11 @@ module RubyParserStuff
|
|
923
935
|
|
924
936
|
def new_xstring str
|
925
937
|
if str then
|
926
|
-
case str
|
938
|
+
case str.sexp_type
|
927
939
|
when :str
|
928
|
-
str
|
940
|
+
str.sexp_type = :xstr
|
929
941
|
when :dstr
|
930
|
-
str
|
942
|
+
str.sexp_type = :dxstr
|
931
943
|
else
|
932
944
|
str = s(:dxstr, '', str)
|
933
945
|
end
|
@@ -945,10 +957,10 @@ module RubyParserStuff
|
|
945
957
|
|
946
958
|
args ||= s(:arglist)
|
947
959
|
|
948
|
-
args
|
949
|
-
args = s(:arglist, args) unless args.
|
960
|
+
args.sexp_type = :arglist if [:call_args, :array].include? args.sexp_type
|
961
|
+
args = s(:arglist, args) unless args.sexp_type == :arglist
|
950
962
|
|
951
|
-
return s(:yield, *args
|
963
|
+
return s(:yield, *args.sexp_body)
|
952
964
|
end
|
953
965
|
|
954
966
|
def next_token
|
@@ -966,11 +978,11 @@ module RubyParserStuff
|
|
966
978
|
|
967
979
|
rhs = value_expr rhs
|
968
980
|
|
969
|
-
case lhs
|
981
|
+
case lhs.sexp_type
|
970
982
|
when :lasgn, :iasgn, :cdecl, :cvdecl, :gasgn, :cvasgn, :attrasgn, :safe_attrasgn then
|
971
983
|
lhs << rhs
|
972
984
|
when :const then
|
973
|
-
lhs
|
985
|
+
lhs.sexp_type = :cdecl
|
974
986
|
lhs << rhs
|
975
987
|
else
|
976
988
|
raise "unknown lhs #{lhs.inspect} w/ #{rhs.inspect}"
|
@@ -1080,8 +1092,8 @@ module RubyParserStuff
|
|
1080
1092
|
|
1081
1093
|
def remove_begin node
|
1082
1094
|
oldnode = node
|
1083
|
-
if node and
|
1084
|
-
node = node
|
1095
|
+
if node and node.sexp_type == :begin and node.size == 2 then
|
1096
|
+
node = node.last
|
1085
1097
|
node.line = oldnode.line
|
1086
1098
|
end
|
1087
1099
|
node
|
@@ -1114,18 +1126,18 @@ module RubyParserStuff
|
|
1114
1126
|
|
1115
1127
|
def ret_args node
|
1116
1128
|
if node then
|
1117
|
-
raise "write a test 5" if node
|
1129
|
+
raise "write a test 5" if node.sexp_type == :block_pass
|
1118
1130
|
|
1119
1131
|
raise SyntaxError, "block argument should not be given" if
|
1120
|
-
node
|
1132
|
+
node.sexp_type == :block_pass
|
1121
1133
|
|
1122
|
-
node
|
1123
|
-
node = node.last if node
|
1134
|
+
node.sexp_type = :array if node.sexp_type == :call_args
|
1135
|
+
node = node.last if node.sexp_type == :array && node.size == 2
|
1124
1136
|
|
1125
1137
|
# HACK matz wraps ONE of the FOUR splats in a newline to
|
1126
1138
|
# distinguish. I use paren for now. ugh
|
1127
|
-
node = s(:svalue, node) if node
|
1128
|
-
node
|
1139
|
+
node = s(:svalue, node) if node.sexp_type == :splat and not node.paren
|
1140
|
+
node.sexp_type = :svalue if node.sexp_type == :arglist && node[1].sexp_type == :splat
|
1129
1141
|
end
|
1130
1142
|
|
1131
1143
|
node
|
@@ -1141,15 +1153,20 @@ module RubyParserStuff
|
|
1141
1153
|
def value_expr oldnode # HACK
|
1142
1154
|
node = remove_begin oldnode
|
1143
1155
|
node.line = oldnode.line if oldnode
|
1144
|
-
node[2] = value_expr
|
1156
|
+
node[2] = value_expr node[2] if node and node.sexp_type == :if
|
1145
1157
|
node
|
1146
1158
|
end
|
1147
1159
|
|
1148
1160
|
def void_stmts node
|
1149
1161
|
return nil unless node
|
1150
|
-
return node unless node
|
1162
|
+
return node unless node.sexp_type == :block
|
1163
|
+
|
1164
|
+
if node.respond_to? :sexp_body= then
|
1165
|
+
node.sexp_body = node.sexp_body.map { |n| remove_begin n }
|
1166
|
+
else
|
1167
|
+
node[1..-1] = node[1..-1].map { |n| remove_begin(n) }
|
1168
|
+
end
|
1151
1169
|
|
1152
|
-
node[1..-1] = node[1..-1].map { |n| remove_begin(n) }
|
1153
1170
|
node
|
1154
1171
|
end
|
1155
1172
|
|
@@ -1310,10 +1327,15 @@ module RubyParserStuff
|
|
1310
1327
|
attr_reader :stack
|
1311
1328
|
attr_accessor :debug
|
1312
1329
|
|
1313
|
-
def initialize
|
1330
|
+
def initialize name, debug=false
|
1314
1331
|
@name = name
|
1315
1332
|
@stack = [false]
|
1316
|
-
@debug =
|
1333
|
+
@debug = debug
|
1334
|
+
end
|
1335
|
+
|
1336
|
+
def reset
|
1337
|
+
@stack = [false]
|
1338
|
+
warn "#{name}_stack(set): 0" if debug
|
1317
1339
|
end
|
1318
1340
|
|
1319
1341
|
def inspect
|
@@ -1321,12 +1343,11 @@ module RubyParserStuff
|
|
1321
1343
|
end
|
1322
1344
|
|
1323
1345
|
def is_in_state
|
1324
|
-
p :stack_is_in_state => [name, @stack.last, caller.first] if debug
|
1325
1346
|
@stack.last
|
1326
1347
|
end
|
1327
1348
|
|
1328
1349
|
def lexpop
|
1329
|
-
|
1350
|
+
warn "#{name}_stack.lexpop" if debug
|
1330
1351
|
raise if @stack.size == 0
|
1331
1352
|
a = @stack.pop
|
1332
1353
|
b = @stack.pop
|
@@ -1335,14 +1356,16 @@ module RubyParserStuff
|
|
1335
1356
|
|
1336
1357
|
def pop
|
1337
1358
|
r = @stack.pop
|
1338
|
-
|
1359
|
+
warn "#{name}_stack.pop" if debug
|
1339
1360
|
@stack.push false if @stack.size == 0
|
1340
1361
|
r
|
1341
1362
|
end
|
1342
1363
|
|
1343
1364
|
def push val
|
1344
1365
|
@stack.push val
|
1345
|
-
|
1366
|
+
c = caller.first
|
1367
|
+
c = caller[1] if c =~ /expr_result/
|
1368
|
+
warn "#{name}_stack(push): #{val} at line #{c.clean_caller}" if debug
|
1346
1369
|
nil
|
1347
1370
|
end
|
1348
1371
|
|