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