ruby_parser 3.13.1 → 3.15.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.
@@ -1,6 +1,3 @@
1
- # encoding: US-ASCII
2
- # TODO: work this out
3
-
4
1
  require "minitest/autorun"
5
2
  require "ruby_lexer"
6
3
  require "ruby_parser"
@@ -10,8 +7,8 @@ class TestRubyLexer < Minitest::Test
10
7
 
11
8
  attr_accessor :processor, :lex, :parser_class, :lex_state
12
9
 
13
- alias :lexer :lex # lets me copy/paste code from parser
14
- alias :lexer= :lex=
10
+ alias lexer lex # lets me copy/paste code from parser
11
+ alias lexer= lex=
15
12
 
16
13
  def setup
17
14
  self.lex_state = EXPR_BEG
@@ -21,12 +18,7 @@ class TestRubyLexer < Minitest::Test
21
18
  def setup_lexer input, exp_sexp = nil
22
19
  setup_new_parser
23
20
  lex.ss = RPStringScanner.new(input)
24
- lex.lex_state = self.lex_state
25
- end
26
-
27
- def setup_new_parser
28
- self.processor = parser_class.new
29
- self.lex = processor.lexer
21
+ lex.lex_state = lex_state
30
22
  end
31
23
 
32
24
  def setup_lexer_class parser_class
@@ -35,11 +27,16 @@ class TestRubyLexer < Minitest::Test
35
27
  setup_lexer "blah blah"
36
28
  end
37
29
 
38
- def assert_lex input, exp_sexp, *args, &b
30
+ def setup_new_parser
31
+ self.processor = parser_class.new
32
+ self.lex = processor.lexer
33
+ end
34
+
35
+ def assert_lex input, exp_sexp, *args
39
36
  setup_lexer input
40
37
  assert_parse input, exp_sexp if exp_sexp
41
38
 
42
- b.call if b
39
+ yield if block_given?
43
40
 
44
41
  args.each_slice(5) do |token, value, state, paren, brace|
45
42
  assert_next_lexeme token, value, state, paren, brace
@@ -54,14 +51,6 @@ class TestRubyLexer < Minitest::Test
54
51
  assert_lex(input, exp_sexp, *args, &block)
55
52
  end
56
53
 
57
- def refute_lex input, *args # TODO: re-sort
58
- args = args.each_slice(2).map { |a, b| [a, b, nil, nil, nil] }.flatten
59
-
60
- assert_raises RubyParser::SyntaxError do
61
- assert_lex(input, nil, *args)
62
- end
63
- end
64
-
65
54
  def assert_lex_fname name, type, end_state = EXPR_ARG # TODO: swap name/type
66
55
  assert_lex3("def #{name} ",
67
56
  nil,
@@ -73,29 +62,30 @@ class TestRubyLexer < Minitest::Test
73
62
  def assert_next_lexeme token=nil, value=nil, state=nil, paren=nil, brace=nil
74
63
  adv = @lex.next_token
75
64
 
76
- assert adv, "no more tokens"
65
+ assert adv, "no more tokens, expecting: %p %p %p %p %p" % [token, value, state, paren, brace]
77
66
 
78
67
  act_token, act_value = adv
79
68
 
80
69
  msg = message {
81
- act = [act_token, act_value, @lex.lex_state,
82
- @lex.paren_nest, @lex.brace_nest]
70
+ act = [act_token, act_value, @lex.lex_state, @lex.paren_nest, @lex.brace_nest]
83
71
  exp = [token, value, state, paren, brace]
84
72
  "#{exp.inspect} vs #{act.inspect}"
85
73
  }
86
74
 
87
75
  act_value = act_value.first if Array === act_value
88
76
 
89
- assert_equal token, act_token, msg
77
+ assert_equal token, act_token, msg
90
78
  case value
91
79
  when Float then
92
80
  assert_in_epsilon value, act_value, 0.001, msg
93
81
  when NilClass then
94
82
  assert_nil act_value, msg
83
+ when String then
84
+ assert_equal value, act_value.b.force_encoding(value.encoding), msg
95
85
  else
96
- assert_equal value, act_value, msg
86
+ assert_equal value, act_value, msg
97
87
  end
98
- assert_equal state, @lex.lex_state, msg if state
88
+ assert_match state, @lex.lex_state, msg if state
99
89
  assert_equal paren, @lex.paren_nest, msg if paren
100
90
  assert_equal brace, @lex.brace_nest, msg if brace
101
91
  end
@@ -106,7 +96,8 @@ class TestRubyLexer < Minitest::Test
106
96
 
107
97
  def assert_read_escape expected, input
108
98
  @lex.ss.string = input.dup
109
- assert_equal expected, @lex.read_escape.b, input
99
+ enc = expected.encoding
100
+ assert_equal expected, @lex.read_escape.b.force_encoding(enc), input
110
101
  end
111
102
 
112
103
  def assert_read_escape_bad input # TODO: rename refute_read_escape
@@ -116,6 +107,20 @@ class TestRubyLexer < Minitest::Test
116
107
  end
117
108
  end
118
109
 
110
+ def refute_lex input, *args # TODO: re-sort
111
+ args = args.each_slice(2).map { |a, b| [a, b, nil, nil, nil] }.flatten
112
+
113
+ assert_raises RubyParser::SyntaxError do
114
+ assert_lex(input, nil, *args)
115
+ end
116
+ end
117
+
118
+ def refute_lex5 input, *args
119
+ assert_raises RubyParser::SyntaxError do
120
+ assert_lex(input, *args)
121
+ end
122
+ end
123
+
119
124
  def refute_lexeme
120
125
  x = y = @lex.next_token
121
126
 
@@ -140,7 +145,7 @@ class TestRubyLexer < Minitest::Test
140
145
  yield
141
146
 
142
147
  lexer.lex_state = EXPR_ENDARG
143
- assert_next_lexeme :tSTRING_DEND, "}", EXPR_ENDARG, 0
148
+ assert_next_lexeme :tSTRING_DEND, "}", EXPR_END|EXPR_ENDARG, 0
144
149
 
145
150
  lexer.lex_strterm = lex_strterm
146
151
  lexer.lex_state = EXPR_BEG
@@ -159,9 +164,20 @@ class TestRubyLexer < Minitest::Test
159
164
  assert_nil @lex.next_token
160
165
  end
161
166
 
162
- def test_unicode_ident
163
- s = "@\u1088\u1077\u1093\u1072"
164
- assert_lex3(s.dup, nil, :tIVAR, s.dup, EXPR_END)
167
+ def test_pct_w_backslashes
168
+ ["\t", "\n", "\r", "\v", "\f"].each do |char|
169
+ next if !RubyLexer::HAS_ENC and char == "\v"
170
+
171
+ assert_lex("%w[foo#{char}bar]",
172
+ s(:array, s(:str, "foo"), s(:str, "bar")),
173
+
174
+ :tQWORDS_BEG, "%w[", EXPR_BEG, 0, 0,
175
+ :tSTRING_CONTENT, "foo", EXPR_BEG, 0, 0,
176
+ :tSPACE, nil, EXPR_BEG, 0, 0,
177
+ :tSTRING_CONTENT, "bar", EXPR_BEG, 0, 0,
178
+ :tSPACE, nil, EXPR_BEG, 0, 0,
179
+ :tSTRING_END, nil, EXPR_LIT, 0, 0)
180
+ end
165
181
  end
166
182
 
167
183
  def test_read_escape
@@ -217,6 +233,90 @@ class TestRubyLexer < Minitest::Test
217
233
  assert_read_escape "\230", 'M-\cx'
218
234
  end
219
235
 
236
+ def test_ruby21_imaginary_literal
237
+ setup_lexer_class RubyParser::V21
238
+
239
+ assert_lex3("1i", nil, :tIMAGINARY, Complex(0, 1), EXPR_NUM)
240
+ assert_lex3("0x10i", nil, :tIMAGINARY, Complex(0, 16), EXPR_NUM)
241
+ assert_lex3("0o10i", nil, :tIMAGINARY, Complex(0, 8), EXPR_NUM)
242
+ assert_lex3("0oi", nil, :tIMAGINARY, Complex(0, 0), EXPR_NUM)
243
+ assert_lex3("0b10i", nil, :tIMAGINARY, Complex(0, 2), EXPR_NUM)
244
+ assert_lex3("1.5i", nil, :tIMAGINARY, Complex(0, 1.5), EXPR_NUM)
245
+ assert_lex3("15e3i", nil, :tIMAGINARY, Complex(0, 15000), EXPR_NUM)
246
+ assert_lex3("15e-3i", nil, :tIMAGINARY, Complex(0, 0.015), EXPR_NUM)
247
+ assert_lex3("1.5e3i", nil, :tIMAGINARY, Complex(0, 1500), EXPR_NUM)
248
+ assert_lex3("1.5e-3i", nil, :tIMAGINARY, Complex(0, 0.0015), EXPR_NUM)
249
+
250
+ c010 = Complex(0, 10)
251
+ assert_lex3("-10i", nil,
252
+ :tUMINUS_NUM, "-", EXPR_BEG,
253
+ :tIMAGINARY, c010, EXPR_NUM)
254
+ end
255
+
256
+ def test_ruby21_imaginary_literal_with_succeeding_keyword
257
+ setup_lexer_class RubyParser::V21
258
+
259
+ # 2/4 scenarios are syntax errors on all tested versions so I
260
+ # deleted them.
261
+
262
+ assert_lex3("1if", nil,
263
+ :tINTEGER, 1, EXPR_NUM,
264
+ :kIF_MOD, "if", EXPR_PAR)
265
+ assert_lex3("1.0if", nil,
266
+ :tFLOAT, 1.0, EXPR_NUM,
267
+ :kIF_MOD, "if", EXPR_PAR)
268
+ end
269
+
270
+ def test_ruby21_rational_imaginary_literal
271
+ setup_lexer_class RubyParser::V21
272
+
273
+ assert_lex3 "1ri", nil, :tIMAGINARY, Complex(0, Rational(1)), EXPR_NUM
274
+ assert_lex3 "0x10ri", nil, :tIMAGINARY, Complex(0, Rational(16)), EXPR_NUM
275
+ assert_lex3 "0o10ri", nil, :tIMAGINARY, Complex(0, Rational(8)), EXPR_NUM
276
+ assert_lex3 "0ori", nil, :tIMAGINARY, Complex(0, Rational(0)), EXPR_NUM
277
+ assert_lex3 "0b10ri", nil, :tIMAGINARY, Complex(0, Rational(2)), EXPR_NUM
278
+ assert_lex3 "1.5ri", nil, :tIMAGINARY, Complex(0, Rational("1.5")), EXPR_NUM
279
+ assert_lex3 "15e3ri", nil, :tIMAGINARY, Complex(0, Rational("15e3")), EXPR_NUM
280
+ assert_lex3 "15e-3ri", nil, :tIMAGINARY, Complex(0, Rational("15e-3")), EXPR_NUM
281
+ assert_lex3 "1.5e3ri", nil, :tIMAGINARY, Complex(0, Rational("1.5e3")), EXPR_NUM
282
+ assert_lex3 "1.5e-3ri", nil, :tIMAGINARY, Complex(0, Rational("1.5e-3")), EXPR_NUM
283
+
284
+ assert_lex3("-10ri", nil,
285
+ :tUMINUS_NUM, "-", EXPR_BEG,
286
+ :tIMAGINARY, Complex(0, Rational(10)), EXPR_NUM)
287
+ end
288
+
289
+ def test_ruby21_rational_literal
290
+ setup_lexer_class RubyParser::V21
291
+
292
+ assert_lex3("10r", nil, :tRATIONAL, Rational(10), EXPR_NUM)
293
+ assert_lex3("0x10r", nil, :tRATIONAL, Rational(16), EXPR_NUM)
294
+ assert_lex3("0o10r", nil, :tRATIONAL, Rational(8), EXPR_NUM)
295
+ assert_lex3("0or", nil, :tRATIONAL, Rational(0), EXPR_NUM)
296
+ assert_lex3("0b10r", nil, :tRATIONAL, Rational(2), EXPR_NUM)
297
+ assert_lex3("1.5r", nil, :tRATIONAL, Rational(15, 10), EXPR_NUM)
298
+ assert_lex3("15e3r", nil, :tRATIONAL, Rational(15000), EXPR_NUM)
299
+ assert_lex3("15e-3r", nil, :tRATIONAL, Rational(15, 1000), EXPR_NUM)
300
+ assert_lex3("1.5e3r", nil, :tRATIONAL, Rational(1500), EXPR_NUM)
301
+ assert_lex3("1.5e-3r", nil, :tRATIONAL, Rational(15, 10000), EXPR_NUM)
302
+
303
+ r10 = Rational(10)
304
+ assert_lex3("-10r", nil,
305
+ :tUMINUS_NUM, "-", EXPR_BEG,
306
+ :tRATIONAL, r10, EXPR_NUM)
307
+ end
308
+
309
+ def test_unicode_ident
310
+ s = "@\u1088\u1077\u1093\u1072"
311
+ assert_lex3(s.dup, nil, :tIVAR, s.dup, EXPR_END)
312
+ end
313
+
314
+ def test_why_does_ruby_hate_me?
315
+ assert_lex3("\"Nl%\\000\\000A\\000\\999\"", # you should be ashamed
316
+ nil,
317
+ :tSTRING, %W[ Nl% \u0000 \u0000 A \u0000 999 ].join, EXPR_END)
318
+ end
319
+
220
320
  def test_yylex_ambiguous_uminus
221
321
  assert_lex3("m -3",
222
322
  nil,
@@ -248,6 +348,15 @@ class TestRubyLexer < Minitest::Test
248
348
  assert_lex3("&&=", nil, :tOP_ASGN, "&&", EXPR_BEG)
249
349
  end
250
350
 
351
+ def test_yylex_and_arg
352
+ self.lex_state = EXPR_ARG
353
+
354
+ assert_lex3(" &y",
355
+ nil,
356
+ :tAMPER, "&", EXPR_BEG,
357
+ :tIDENTIFIER, "y", EXPR_ARG)
358
+ end
359
+
251
360
  def test_yylex_and_dot
252
361
  setup_lexer_class RubyParser::V23
253
362
 
@@ -272,15 +381,6 @@ class TestRubyLexer < Minitest::Test
272
381
  :tIDENTIFIER, "y")
273
382
  end
274
383
 
275
- def test_yylex_and_arg
276
- self.lex_state = EXPR_ARG
277
-
278
- assert_lex3(" &y",
279
- nil,
280
- :tAMPER, "&", EXPR_BEG,
281
- :tIDENTIFIER, "y", EXPR_ARG)
282
- end
283
-
284
384
  def test_yylex_and_equals
285
385
  assert_lex3("&=", nil, :tOP_ASGN, "&", EXPR_BEG)
286
386
  end
@@ -303,424 +403,112 @@ class TestRubyLexer < Minitest::Test
303
403
  assert_lex3 "=>", nil, :tASSOC, "=>", EXPR_BEG
304
404
  end
305
405
 
306
- def test_yylex_label__20
307
- setup_lexer_class RubyParser::V20
406
+ def test_yylex_back_ref
407
+ assert_lex3("[$&, $`, $', $+]",
408
+ nil,
409
+ :tLBRACK, "[", EXPR_PAR,
410
+ :tBACK_REF, :&, EXPR_END, :tCOMMA, ",", EXPR_PAR,
411
+ :tBACK_REF, :"`", EXPR_END, :tCOMMA, ",", EXPR_PAR,
412
+ :tBACK_REF, :"'", EXPR_END, :tCOMMA, ",", EXPR_PAR,
413
+ :tBACK_REF, :+, EXPR_END,
414
+ :tRBRACK, "]", EXPR_END)
415
+ end
308
416
 
309
- assert_lex3("{a:",
417
+ def test_yylex_backslash
418
+ assert_lex3("1 \\\n+ 2",
310
419
  nil,
311
- :tLBRACE, "{", EXPR_PAR,
312
- :tLABEL, "a", EXPR_LAB)
420
+ :tINTEGER, 1, EXPR_NUM,
421
+ :tPLUS, "+", EXPR_BEG,
422
+ :tINTEGER, 2, EXPR_NUM)
313
423
  end
314
424
 
315
- def test_yylex_label_in_params__20
316
- setup_lexer_class RubyParser::V20
425
+ def test_yylex_backslash_bad
426
+ refute_lex("1 \\ + 2", :tINTEGER, 1)
427
+ end
317
428
 
318
- assert_lex3("foo(a:",
429
+ def test_yylex_backtick
430
+ assert_lex3("`ls`",
319
431
  nil,
320
- :tIDENTIFIER, "foo", EXPR_CMDARG,
321
- :tLPAREN2, "(", EXPR_PAR,
322
- :tLABEL, "a", EXPR_LAB)
432
+ :tXSTRING_BEG, "`", EXPR_BEG,
433
+ :tSTRING_CONTENT, "ls", EXPR_BEG,
434
+ :tSTRING_END, "`", EXPR_LIT)
323
435
  end
324
436
 
325
- def test_yylex_paren_string_parens_interpolated
326
- setup_lexer('%((#{b}#{d}))',
327
- s(:dstr,
328
- "(",
329
- s(:evstr, s(:call, nil, :b)),
330
- s(:evstr, s(:call, nil, :d)),
331
- s(:str, ")")))
437
+ def test_yylex_backtick_cmdarg
438
+ self.lex_state = EXPR_DOT
332
439
 
333
- assert_next_lexeme :tSTRING_BEG, "%)", EXPR_BEG, 0, 0
334
- assert_next_lexeme :tSTRING_CONTENT, "(", EXPR_BEG, 0, 0
335
- assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
440
+ # \n ensures expr_cmd (TODO: why?)
441
+ assert_lex3("\n`", nil, :tBACK_REF2, "`", EXPR_CMDARG)
442
+ end
336
443
 
337
- emulate_string_interpolation do
338
- assert_next_lexeme :tIDENTIFIER, "b", EXPR_CMDARG, 0, 0
339
- end
444
+ def test_yylex_backtick_dot
445
+ self.lex_state = EXPR_DOT
340
446
 
341
- assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
447
+ assert_lex3("a.`(3)",
448
+ nil,
449
+ :tIDENTIFIER, "a", EXPR_CMDARG,
450
+ :tDOT, ".", EXPR_DOT,
451
+ :tBACK_REF2, "`", EXPR_ARG,
452
+ :tLPAREN2, "(", EXPR_PAR,
453
+ :tINTEGER, 3, EXPR_NUM,
454
+ :tRPAREN, ")", EXPR_ENDFN)
455
+ end
342
456
 
343
- emulate_string_interpolation do
344
- assert_next_lexeme :tIDENTIFIER, "d", EXPR_CMDARG, 0, 0
345
- end
457
+ def test_yylex_backtick_method
458
+ self.lex_state = EXPR_FNAME
346
459
 
347
- assert_next_lexeme :tSTRING_CONTENT, ")", EXPR_BEG, 0, 0
348
- assert_next_lexeme :tSTRING_END, ")", EXPR_END, 0, 0
460
+ assert_lex3("`",
461
+ nil,
462
+ :tBACK_REF2, "`", EXPR_END)
463
+ end
349
464
 
350
- refute_lexeme
465
+ def test_yylex_bad_char
466
+ refute_lex(" \010 ")
351
467
  end
352
468
 
353
- def test_yylex_paren_string_interpolated_regexp
354
- setup_lexer('%( #{(/abcd/)} )',
355
- s(:dstr, " ", s(:evstr, s(:lit, /abcd/)), s(:str, " ")))
469
+ def test_yylex_bang
470
+ assert_lex3("!", nil, :tBANG, "!", EXPR_BEG)
471
+ end
356
472
 
357
- assert_next_lexeme :tSTRING_BEG, "%)", EXPR_BEG, 0, 0
358
- assert_next_lexeme :tSTRING_CONTENT, " ", EXPR_BEG, 0, 0
359
- assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
473
+ def test_yylex_bang_equals
474
+ assert_lex3("!=", nil, :tNEQ, "!=", EXPR_BEG)
475
+ end
360
476
 
361
- emulate_string_interpolation do
362
- assert_next_lexeme :tLPAREN, "(", EXPR_PAR, 1, 0
363
- assert_next_lexeme :tREGEXP_BEG, "/", EXPR_PAR, 1, 0
364
- assert_next_lexeme :tSTRING_CONTENT, "abcd", EXPR_PAR, 1, 0
365
- assert_next_lexeme :tREGEXP_END, "", EXPR_END, 1, 0
366
- assert_next_lexeme :tRPAREN, ")", EXPR_ENDFN, 0, 0
367
- end
477
+ def test_yylex_bang_tilde
478
+ assert_lex3("!~", nil, :tNMATCH, "!~", EXPR_BEG)
479
+ end
368
480
 
369
- assert_next_lexeme :tSTRING_CONTENT, " ", EXPR_BEG, 0, 0
370
- assert_next_lexeme :tSTRING_END, ")", EXPR_END, 0, 0
481
+ def test_yylex_block_bug_1
482
+ assert_lex3("a do end",
483
+ s(:iter, s(:call, nil, :a), 0),
371
484
 
372
- refute_lexeme
485
+ :tIDENTIFIER, "a", EXPR_CMDARG,
486
+ :kDO, "do", EXPR_BEG,
487
+ :kEND, "end", EXPR_END)
373
488
  end
374
489
 
375
- def test_yylex_not_at_defn__20
376
- setup_lexer_class RubyParser::V20
490
+ def test_yylex_block_bug_2
491
+ assert_lex3("a = 1\na do\nend",
492
+ s(:block,
493
+ s(:lasgn, :a, s(:lit, 1)),
494
+ s(:iter, s(:call, nil, :a), 0)),
377
495
 
378
- assert_lex("def +@; end",
379
- s(:defn, :+@, s(:args), s(:nil)),
380
-
381
- :kDEF, "def", EXPR_FNAME, 0, 0,
382
- :tUPLUS, "+@", EXPR_ARG, 0, 0,
383
- :tSEMI, ";", EXPR_BEG, 0, 0,
384
- :kEND, "end", EXPR_END, 0, 0)
385
-
386
- assert_lex("def !@; end",
387
- s(:defn, :"!@", s(:args), s(:nil)),
388
-
389
- :kDEF, "def", EXPR_FNAME, 0, 0,
390
- :tUBANG, "!@", EXPR_ARG, 0, 0,
391
- :tSEMI, ";", EXPR_BEG, 0, 0,
392
- :kEND, "end", EXPR_END, 0, 0)
393
- end
394
-
395
- def test_yylex_not_at_ivar
396
- assert_lex("!@ivar",
397
- s(:call, s(:ivar, :@ivar), :"!"),
398
-
399
- :tBANG, "!", EXPR_BEG, 0, 0,
400
- :tIVAR, "@ivar", EXPR_END, 0, 0)
401
- end
402
-
403
- def test_yylex_number_times_ident_times_return_number
404
- assert_lex("1 * b * 3",
405
- s(:call,
406
- s(:call, s(:lit, 1), :*, s(:call, nil, :b)),
407
- :*, s(:lit, 3)),
408
-
409
- :tINTEGER, 1, EXPR_NUM, 0, 0,
410
- :tSTAR2, "*", EXPR_BEG, 0, 0,
411
- :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
412
- :tSTAR2, "*", EXPR_BEG, 0, 0,
413
- :tINTEGER, 3, EXPR_NUM, 0, 0)
414
-
415
- assert_lex("1 * b *\n 3",
416
- s(:call,
417
- s(:call, s(:lit, 1), :*, s(:call, nil, :b)),
418
- :*, s(:lit, 3)),
419
-
420
- :tINTEGER, 1, EXPR_NUM, 0, 0,
421
- :tSTAR2, "*", EXPR_BEG, 0, 0,
422
- :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
423
- :tSTAR2, "*", EXPR_BEG, 0, 0,
424
- :tINTEGER, 3, EXPR_NUM, 0, 0)
425
- end
426
-
427
- def test_yylex_paren_string_parens_interpolated_regexp
428
- setup_lexer('%((#{(/abcd/)}))',
429
- s(:dstr, "(", s(:evstr, s(:lit, /abcd/)), s(:str, ")")))
430
-
431
- assert_next_lexeme :tSTRING_BEG, "%)", EXPR_BEG, 0, 0
432
- assert_next_lexeme :tSTRING_CONTENT, "(", EXPR_BEG, 0, 0
433
-
434
- assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
435
-
436
- emulate_string_interpolation do
437
- assert_next_lexeme :tLPAREN, "(", EXPR_PAR, 1, 0
438
- assert_next_lexeme :tREGEXP_BEG, "/", EXPR_PAR, 1, 0
439
- assert_next_lexeme :tSTRING_CONTENT, "abcd", EXPR_PAR, 1, 0
440
- assert_next_lexeme :tREGEXP_END, "", EXPR_END, 1, 0
441
- assert_next_lexeme :tRPAREN, ")", EXPR_ENDFN, 0, 0
442
- end
443
-
444
- assert_next_lexeme :tSTRING_CONTENT, ")", EXPR_BEG, 0, 0
445
- assert_next_lexeme :tSTRING_END, ")", EXPR_END, 0, 0
446
-
447
- refute_lexeme
448
- end
449
-
450
- def test_yylex_method_parens_chevron
451
- assert_lex("a()<<1",
452
- s(:call, s(:call, nil, :a), :<<, s(:lit, 1)),
453
- :tIDENTIFIER, "a", EXPR_CMDARG, 0, 0,
454
- :tLPAREN2, "(", EXPR_PAR, 1, 0,
455
- :tRPAREN, ")", EXPR_ENDFN, 0, 0,
456
- :tLSHFT, "<<" , EXPR_BEG, 0, 0,
457
- :tINTEGER, 1, EXPR_NUM, 0, 0)
458
- end
459
-
460
- def test_yylex_lambda_args__20
461
- setup_lexer_class RubyParser::V20
462
-
463
- assert_lex("-> (a) { }",
464
- s(:iter, s(:call, nil, :lambda),
465
- s(:args, :a)),
466
-
467
- :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
468
- :tLPAREN2, "(", EXPR_PAR, 1, 0,
469
- :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
470
- :tRPAREN, ")", EXPR_ENDFN, 0, 0,
471
- :tLCURLY, "{", EXPR_PAR, 0, 1,
472
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
473
- end
474
-
475
- def test_yylex_lambda_as_args_with_block__20
476
- setup_lexer_class RubyParser::V20
477
-
478
- assert_lex3("a -> do end do end",
479
- nil,
480
- :tIDENTIFIER, "a", EXPR_CMDARG,
481
- :tLAMBDA, nil, EXPR_ENDFN,
482
- :kDO, "do", EXPR_BEG,
483
- :kEND, "end", EXPR_END,
484
- :kDO, "do", EXPR_BEG,
485
- :kEND, "end", EXPR_END)
486
- end
487
-
488
- def test_yylex_lambda_args_opt__20
489
- setup_lexer_class RubyParser::V20
490
-
491
- assert_lex("-> (a=nil) { }",
492
- s(:iter, s(:call, nil, :lambda),
493
- s(:args, s(:lasgn, :a, s(:nil)))),
494
-
495
- :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
496
- :tLPAREN2, "(", EXPR_PAR, 1, 0,
497
- :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
498
- :tEQL, "=", EXPR_BEG, 1, 0,
499
- :kNIL, "nil", EXPR_END, 1, 0,
500
- :tRPAREN, ")", EXPR_ENDFN, 0, 0,
501
- :tLCURLY, "{", EXPR_PAR, 0, 1,
502
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
503
- end
504
-
505
- def test_yylex_lambda_hash__20
506
- setup_lexer_class RubyParser::V20
507
-
508
- assert_lex("-> (a={}) { }",
509
- s(:iter, s(:call, nil, :lambda),
510
- s(:args, s(:lasgn, :a, s(:hash)))),
511
-
512
- :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
513
- :tLPAREN2, "(", EXPR_PAR, 1, 0,
514
- :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
515
- :tEQL, "=", EXPR_BEG, 1, 0,
516
- :tLBRACE, "{", EXPR_PAR, 1, 1,
517
- :tRCURLY, "}", EXPR_ENDARG, 1, 0,
518
- :tRPAREN, ")", EXPR_ENDFN, 0, 0,
519
- :tLCURLY, "{", EXPR_PAR, 0, 1,
520
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
521
- end
522
-
523
- def test_yylex_iter_array_curly
524
- assert_lex("f :a, [:b] { |c, d| }", # yes, this is bad code
525
- s(:iter,
526
- s(:call, nil, :f, s(:lit, :a), s(:array, s(:lit, :b))),
527
- s(:args, :c, :d)),
528
-
529
- :tIDENTIFIER, "f", EXPR_CMDARG, 0, 0,
530
- :tSYMBOL, "a", EXPR_END, 0, 0,
531
- :tCOMMA, ",", EXPR_PAR, 0, 0,
532
- :tLBRACK, "[", EXPR_PAR, 1, 0,
533
- :tSYMBOL, "b", EXPR_END, 1, 0,
534
- :tRBRACK, "]", EXPR_ENDARG, 0, 0,
535
- :tLBRACE_ARG, "{", EXPR_BEG, 0, 1,
536
- :tPIPE, "|", EXPR_PAR, 0, 1,
537
- :tIDENTIFIER, "c", EXPR_ARG, 0, 1,
538
- :tCOMMA, ",", EXPR_PAR, 0, 1,
539
- :tIDENTIFIER, "d", EXPR_ARG, 0, 1,
540
- :tPIPE, "|", EXPR_PAR, 0, 1,
541
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
542
- end
543
-
544
- def test_yylex_const_call_same_name
545
- assert_lex("X = a { }; b { f :c }",
546
- s(:block,
547
- s(:cdecl, :X, s(:iter, s(:call, nil, :a), 0)),
548
- s(:iter,
549
- s(:call, nil, :b),
550
- 0,
551
- s(:call, nil, :f, s(:lit, :c)))),
552
-
553
- :tCONSTANT, "X", EXPR_CMDARG, 0, 0,
554
- :tEQL, "=", EXPR_BEG, 0, 0,
555
- :tIDENTIFIER, "a", EXPR_ARG, 0, 0,
556
- :tLCURLY, "{", EXPR_PAR, 0, 1,
557
- :tRCURLY, "}", EXPR_ENDARG, 0, 0,
558
- :tSEMI, ";", EXPR_BEG, 0, 0,
559
-
560
- :tIDENTIFIER, "b", EXPR_CMDARG, 0, 0,
561
- :tLCURLY, "{", EXPR_PAR, 0, 1,
562
- :tIDENTIFIER, "f", EXPR_CMDARG, 0, 1, # different
563
- :tSYMBOL, "c", EXPR_END, 0, 1,
564
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
565
-
566
- assert_lex("X = a { }; b { X :c }",
567
- s(:block,
568
- s(:cdecl, :X, s(:iter, s(:call, nil, :a), 0)),
569
- s(:iter,
570
- s(:call, nil, :b),
571
- 0,
572
- s(:call, nil, :X, s(:lit, :c)))),
573
-
574
- :tCONSTANT, "X", EXPR_CMDARG, 0, 0,
575
- :tEQL, "=", EXPR_BEG, 0, 0,
576
- :tIDENTIFIER, "a", EXPR_ARG, 0, 0,
577
- :tLCURLY, "{", EXPR_PAR, 0, 1,
578
- :tRCURLY, "}", EXPR_ENDARG, 0, 0,
579
- :tSEMI, ";", EXPR_BEG, 0, 0,
580
-
581
- :tIDENTIFIER, "b", EXPR_CMDARG, 0, 0,
582
- :tLCURLY, "{", EXPR_PAR, 0, 1,
583
- :tCONSTANT, "X", EXPR_CMDARG, 0, 1, # same
584
- :tSYMBOL, "c", EXPR_END, 0, 1,
585
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
586
- end
587
-
588
- def test_yylex_lasgn_call_same_name
589
- assert_lex("a = b.c :d => 1",
590
- s(:lasgn, :a,
591
- s(:call, s(:call, nil, :b), :c,
592
- s(:hash, s(:lit, :d), s(:lit, 1)))),
593
-
594
- :tIDENTIFIER, "a", EXPR_CMDARG, 0, 0,
595
- :tEQL, "=", EXPR_BEG, 0, 0,
596
- :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
597
- :tDOT, ".", EXPR_DOT, 0, 0,
598
- :tIDENTIFIER, "c", EXPR_ARG, 0, 0, # different
599
- :tSYMBOL, "d", EXPR_END, 0, 0,
600
- :tASSOC, "=>", EXPR_BEG, 0, 0,
601
- :tINTEGER, 1, EXPR_NUM, 0, 0)
602
-
603
- assert_lex("a = b.a :d => 1",
604
- s(:lasgn, :a,
605
- s(:call, s(:call, nil, :b), :a,
606
- s(:hash, s(:lit, :d), s(:lit, 1)))),
607
-
608
- :tIDENTIFIER, "a", EXPR_CMDARG, 0, 0,
609
- :tEQL, "=", EXPR_BEG, 0, 0,
610
- :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
611
- :tDOT, ".", EXPR_DOT, 0, 0,
612
- :tIDENTIFIER, "a", EXPR_ARG, 0, 0, # same as lvar
613
- :tSYMBOL, "d", EXPR_END, 0, 0,
614
- :tASSOC, "=>", EXPR_BEG, 0, 0,
615
- :tINTEGER, 1, EXPR_NUM, 0, 0)
616
- end
617
-
618
- def test_yylex_back_ref
619
- assert_lex3("[$&, $`, $', $+]",
620
- nil,
621
- :tLBRACK, "[", EXPR_PAR,
622
- :tBACK_REF, :&, EXPR_END, :tCOMMA, ",", EXPR_PAR,
623
- :tBACK_REF, :"`", EXPR_END, :tCOMMA, ",", EXPR_PAR,
624
- :tBACK_REF, :"'", EXPR_END, :tCOMMA, ",", EXPR_PAR,
625
- :tBACK_REF, :+, EXPR_END,
626
- :tRBRACK, "]", EXPR_ENDARG)
627
- end
628
-
629
- def test_yylex_backslash
630
- assert_lex3("1 \\\n+ 2",
631
- nil,
632
- :tINTEGER, 1, EXPR_NUM,
633
- :tPLUS, "+", EXPR_BEG,
634
- :tINTEGER, 2, EXPR_NUM)
635
- end
636
-
637
- def test_yylex_backslash_bad
638
- refute_lex("1 \\ + 2", :tINTEGER, 1)
639
- end
640
-
641
- def test_yylex_backtick
642
- assert_lex3("`ls`",
643
- nil,
644
- :tXSTRING_BEG, "`", EXPR_BEG,
645
- :tSTRING_CONTENT, "ls", EXPR_BEG,
646
- :tSTRING_END, "`", EXPR_END)
647
- end
648
-
649
- def test_yylex_backtick_cmdarg
650
- self.lex_state = EXPR_DOT
651
-
652
- # \n ensures expr_cmd (TODO: why?)
653
- assert_lex3("\n`", nil, :tBACK_REF2, "`", EXPR_CMDARG)
654
- end
655
-
656
- def test_yylex_backtick_dot
657
- self.lex_state = EXPR_DOT
658
-
659
- assert_lex3("a.`(3)",
660
- nil,
661
- :tIDENTIFIER, "a", EXPR_CMDARG,
662
- :tDOT, ".", EXPR_DOT,
663
- :tBACK_REF2, "`", EXPR_ARG,
664
- :tLPAREN2, "(", EXPR_PAR,
665
- :tINTEGER, 3, EXPR_NUM,
666
- :tRPAREN, ")", EXPR_ENDFN)
667
- end
668
-
669
- def test_yylex_backtick_method
670
- self.lex_state = EXPR_FNAME
671
-
672
- assert_lex3("`",
673
- nil,
674
- :tBACK_REF2, "`", EXPR_END)
675
- end
676
-
677
- def test_yylex_bad_char
678
- refute_lex(" \010 ")
679
- end
680
-
681
- def test_yylex_bang
682
- assert_lex3("!", nil, :tBANG, "!", EXPR_BEG)
683
- end
684
-
685
- def test_yylex_bang_equals
686
- assert_lex3("!=", nil, :tNEQ, "!=", EXPR_BEG)
687
- end
688
-
689
- def test_yylex_bang_tilde
690
- assert_lex3("!~", nil, :tNMATCH, "!~", EXPR_BEG)
691
- end
692
-
693
- def test_yylex_block_bug_1
694
- assert_lex3("a do end",
695
- s(:iter, s(:call, nil, :a), 0),
696
-
697
- :tIDENTIFIER, "a", EXPR_CMDARG,
698
- :kDO, "do", EXPR_BEG,
699
- :kEND, "end", EXPR_END)
700
- end
701
-
702
- def test_yylex_block_bug_2
703
- assert_lex3("a = 1\na do\nend",
704
- s(:block,
705
- s(:lasgn, :a, s(:lit, 1)),
706
- s(:iter, s(:call, nil, :a), 0)),
707
-
708
- :tIDENTIFIER, "a", EXPR_CMDARG,
709
- :tEQL, "=", EXPR_BEG,
710
- :tINTEGER, 1, EXPR_NUM,
711
- :tNL, nil, EXPR_BEG,
712
- :tIDENTIFIER, "a", EXPR_CMDARG,
713
- :kDO, "do", EXPR_BEG,
714
- :kEND, "end", EXPR_END)
715
- end
496
+ :tIDENTIFIER, "a", EXPR_CMDARG,
497
+ :tEQL, "=", EXPR_BEG,
498
+ :tINTEGER, 1, EXPR_NUM,
499
+ :tNL, nil, EXPR_BEG,
500
+ :tIDENTIFIER, "a", EXPR_CMDARG,
501
+ :kDO, "do", EXPR_BEG,
502
+ :kEND, "end", EXPR_END)
503
+ end
716
504
 
717
505
  def test_yylex_block_bug_3
718
506
  assert_lex3("a { }",
719
507
  s(:iter, s(:call, nil, :a), 0),
720
508
 
721
509
  :tIDENTIFIER, "a", EXPR_CMDARG, # verified
722
- :tLCURLY, "{", EXPR_PAR,
723
- :tRCURLY, "}", EXPR_ENDARG)
510
+ :tLCURLY, "{", EXPR_PAR,
511
+ :tRCURLY, "}", EXPR_END)
724
512
  end
725
513
 
726
514
  def test_yylex_carat
@@ -766,9 +554,9 @@ class TestRubyLexer < Minitest::Test
766
554
  def test_yylex_comment
767
555
  assert_lex3("1 # one\n# two\n2",
768
556
  nil,
769
- :tINTEGER, 1, EXPR_NUM,
557
+ :tINTEGER, 1, EXPR_NUM,
770
558
  :tNL, nil, EXPR_BEG,
771
- :tINTEGER, 2, EXPR_NUM)
559
+ :tINTEGER, 2, EXPR_NUM)
772
560
 
773
561
  assert_equal "# one\n# two\n", @lex.comments
774
562
  end
@@ -776,7 +564,7 @@ class TestRubyLexer < Minitest::Test
776
564
  def test_yylex_comment_begin
777
565
  assert_lex3("=begin\nblah\nblah\n=end\n42",
778
566
  nil,
779
- :tINTEGER, 42, EXPR_NUM)
567
+ :tINTEGER, 42, EXPR_NUM)
780
568
 
781
569
  assert_equal "=begin\nblah\nblah\n=end\n", @lex.comments
782
570
  end
@@ -792,7 +580,7 @@ class TestRubyLexer < Minitest::Test
792
580
  nil,
793
581
  :tIDENTIFIER, "beginfoo", EXPR_CMDARG,
794
582
  :tEQL, "=", EXPR_BEG,
795
- :tINTEGER, 5, EXPR_NUM,
583
+ :tINTEGER, 5, EXPR_NUM,
796
584
  :tNL, nil, EXPR_BEG,
797
585
  :tIDENTIFIER, "p", EXPR_CMDARG,
798
586
  :tIDENTIFIER, "x", EXPR_ARG,
@@ -816,6 +604,50 @@ class TestRubyLexer < Minitest::Test
816
604
  assert_lex3("# comment", nil)
817
605
  end
818
606
 
607
+ def test_yylex_const_call_same_name
608
+ assert_lex("X = a { }; b { f :c }",
609
+ s(:block,
610
+ s(:cdecl, :X, s(:iter, s(:call, nil, :a), 0)),
611
+ s(:iter,
612
+ s(:call, nil, :b),
613
+ 0,
614
+ s(:call, nil, :f, s(:lit, :c)))),
615
+
616
+ :tCONSTANT, "X", EXPR_CMDARG, 0, 0,
617
+ :tEQL, "=", EXPR_BEG, 0, 0,
618
+ :tIDENTIFIER, "a", EXPR_ARG, 0, 0,
619
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
620
+ :tRCURLY, "}", EXPR_END, 0, 0,
621
+ :tSEMI, ";", EXPR_BEG, 0, 0,
622
+
623
+ :tIDENTIFIER, "b", EXPR_CMDARG, 0, 0,
624
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
625
+ :tIDENTIFIER, "f", EXPR_CMDARG, 0, 1, # different
626
+ :tSYMBOL, "c", EXPR_LIT, 0, 1,
627
+ :tRCURLY, "}", EXPR_END, 0, 0)
628
+
629
+ assert_lex("X = a { }; b { X :c }",
630
+ s(:block,
631
+ s(:cdecl, :X, s(:iter, s(:call, nil, :a), 0)),
632
+ s(:iter,
633
+ s(:call, nil, :b),
634
+ 0,
635
+ s(:call, nil, :X, s(:lit, :c)))),
636
+
637
+ :tCONSTANT, "X", EXPR_CMDARG, 0, 0,
638
+ :tEQL, "=", EXPR_BEG, 0, 0,
639
+ :tIDENTIFIER, "a", EXPR_ARG, 0, 0,
640
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
641
+ :tRCURLY, "}", EXPR_END, 0, 0,
642
+ :tSEMI, ";", EXPR_BEG, 0, 0,
643
+
644
+ :tIDENTIFIER, "b", EXPR_CMDARG, 0, 0,
645
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
646
+ :tCONSTANT, "X", EXPR_CMDARG, 0, 1, # same
647
+ :tSYMBOL, "c", EXPR_LIT, 0, 1,
648
+ :tRCURLY, "}", EXPR_END, 0, 0)
649
+ end
650
+
819
651
  def test_yylex_constant
820
652
  assert_lex3("ArgumentError", nil, :tCONSTANT, "ArgumentError", EXPR_CMDARG)
821
653
  end
@@ -847,7 +679,7 @@ class TestRubyLexer < Minitest::Test
847
679
  nil,
848
680
  :tIDENTIFIER, "a", EXPR_CMDARG,
849
681
  :tDIVIDE, "/", EXPR_BEG,
850
- :tINTEGER, 2, EXPR_NUM)
682
+ :tINTEGER, 2, EXPR_NUM)
851
683
  end
852
684
 
853
685
  def test_yylex_div_equals
@@ -855,7 +687,7 @@ class TestRubyLexer < Minitest::Test
855
687
  nil,
856
688
  :tIDENTIFIER, "a", EXPR_CMDARG,
857
689
  :tOP_ASGN, "/", EXPR_BEG,
858
- :tINTEGER, 2, EXPR_NUM)
690
+ :tINTEGER, 2, EXPR_NUM)
859
691
  end
860
692
 
861
693
  def test_yylex_do
@@ -863,7 +695,7 @@ class TestRubyLexer < Minitest::Test
863
695
  nil,
864
696
  :tIDENTIFIER, "x", EXPR_CMDARG,
865
697
  :kDO, "do", EXPR_BEG,
866
- :tINTEGER, 42, EXPR_NUM,
698
+ :tINTEGER, 42, EXPR_NUM,
867
699
  :kEND, "end", EXPR_END)
868
700
  end
869
701
 
@@ -876,7 +708,7 @@ class TestRubyLexer < Minitest::Test
876
708
  :tDOT, ".", EXPR_DOT,
877
709
  :tIDENTIFIER, "y", EXPR_ARG,
878
710
  :kDO_BLOCK, "do", EXPR_BEG,
879
- :tINTEGER, 42, EXPR_NUM,
711
+ :tINTEGER, 42, EXPR_NUM,
880
712
  :kEND, "end", EXPR_END) do
881
713
  @lex.cmdarg.push true
882
714
  end
@@ -887,25 +719,17 @@ class TestRubyLexer < Minitest::Test
887
719
 
888
720
  assert_lex3("do 42 end",
889
721
  nil,
890
- :kDO_BLOCK, "do", EXPR_BEG,
891
- :tINTEGER, 42, EXPR_NUM,
722
+ :kDO, "do", EXPR_BEG,
723
+ :tINTEGER, 42, EXPR_NUM,
892
724
  :kEND, "end", EXPR_END)
893
725
  end
894
726
 
895
- def test_yylex_is_your_spacebar_broken?
896
- assert_lex3(":a!=:b",
897
- nil,
898
- :tSYMBOL, "a", EXPR_END,
899
- :tNEQ, "!=", EXPR_BEG,
900
- :tSYMBOL, "b", EXPR_END)
901
- end
902
-
903
727
  def test_yylex_do_cond
904
728
  assert_lex3("x do 42 end",
905
729
  nil,
906
730
  :tIDENTIFIER, "x", EXPR_CMDARG,
907
731
  :kDO_COND, "do", EXPR_BEG,
908
- :tINTEGER, 42, EXPR_NUM,
732
+ :tINTEGER, 42, EXPR_NUM,
909
733
  :kEND, "end", EXPR_END) do
910
734
  @lex.cond.push true
911
735
  end
@@ -950,7 +774,7 @@ class TestRubyLexer < Minitest::Test
950
774
  end
951
775
 
952
776
  def test_yylex_float
953
- assert_lex3("1.0", nil, :tFLOAT, 1.0, EXPR_NUM)
777
+ assert_lex3("1.0", nil, :tFLOAT, 1.0, EXPR_NUM)
954
778
  end
955
779
 
956
780
  def test_yylex_float_bad_no_underscores
@@ -968,7 +792,7 @@ class TestRubyLexer < Minitest::Test
968
792
  def test_yylex_float_call
969
793
  assert_lex3("1.0.to_s",
970
794
  nil,
971
- :tFLOAT, 1.0, EXPR_NUM,
795
+ :tFLOAT, 1.0, EXPR_NUM,
972
796
  :tDOT, ".", EXPR_DOT,
973
797
  :tIDENTIFIER, "to_s", EXPR_ARG)
974
798
  end
@@ -983,7 +807,7 @@ class TestRubyLexer < Minitest::Test
983
807
  assert_lex3("-1.0E10",
984
808
  nil,
985
809
  :tUMINUS_NUM, "-", EXPR_BEG,
986
- :tFLOAT, 10000000000.0, EXPR_NUM)
810
+ :tFLOAT, 10000000000.0, EXPR_NUM)
987
811
  end
988
812
 
989
813
  def test_yylex_float_dot_e
@@ -996,29 +820,22 @@ class TestRubyLexer < Minitest::Test
996
820
  assert_lex3("-1.0e10",
997
821
  nil,
998
822
  :tUMINUS_NUM, "-", EXPR_BEG,
999
- :tFLOAT, 10000000000.0, EXPR_NUM)
823
+ :tFLOAT, 10000000000.0, EXPR_NUM)
1000
824
  end
1001
825
 
1002
826
  def test_yylex_float_e
1003
827
  assert_lex3("1e10",
1004
828
  nil,
1005
- :tFLOAT, 10000000000.0, EXPR_NUM)
829
+ :tFLOAT, 10000000000.0, EXPR_NUM)
1006
830
  end
1007
831
 
1008
832
  def test_yylex_float_e_bad_double_e
1009
833
  assert_lex3("1e2e3",
1010
834
  nil,
1011
- :tFLOAT, 100, EXPR_NUM,
835
+ :tFLOAT, 100, EXPR_NUM,
1012
836
  :tIDENTIFIER, "e3", EXPR_END)
1013
837
  end
1014
838
 
1015
- def test_yylex_float_if_modifier
1016
- assert_lex3("1e2if",
1017
- nil,
1018
- :tFLOAT, 100, EXPR_NUM,
1019
- :kIF_MOD, "if", EXPR_PAR)
1020
- end
1021
-
1022
839
  def test_yylex_float_e_bad_trailing_underscore
1023
840
  refute_lex "123_e10"
1024
841
  end
@@ -1031,21 +848,21 @@ class TestRubyLexer < Minitest::Test
1031
848
  assert_lex3("-1e10",
1032
849
  nil,
1033
850
  :tUMINUS_NUM, "-", EXPR_BEG,
1034
- :tFLOAT, 10000000000.0, EXPR_NUM)
851
+ :tFLOAT, 10000000000.0, EXPR_NUM)
1035
852
  end
1036
853
 
1037
854
  def test_yylex_float_e_neg_minus
1038
855
  assert_lex3("-1e-10",
1039
856
  nil,
1040
857
  :tUMINUS_NUM, "-", EXPR_BEG,
1041
- :tFLOAT, 1.0e-10, EXPR_NUM)
858
+ :tFLOAT, 1.0e-10, EXPR_NUM)
1042
859
  end
1043
860
 
1044
861
  def test_yylex_float_e_neg_plus
1045
862
  assert_lex3("-1e+10",
1046
863
  nil,
1047
864
  :tUMINUS_NUM, "-", EXPR_BEG,
1048
- :tFLOAT, 10000000000.0, EXPR_NUM)
865
+ :tFLOAT, 10000000000.0, EXPR_NUM)
1049
866
  end
1050
867
 
1051
868
  def test_yylex_float_e_plus
@@ -1056,11 +873,18 @@ class TestRubyLexer < Minitest::Test
1056
873
  assert_lex3("0e0", nil, :tFLOAT, 0.0, EXPR_NUM)
1057
874
  end
1058
875
 
876
+ def test_yylex_float_if_modifier
877
+ assert_lex3("1e2if",
878
+ nil,
879
+ :tFLOAT, 100, EXPR_NUM,
880
+ :kIF_MOD, "if", EXPR_PAR)
881
+ end
882
+
1059
883
  def test_yylex_float_neg
1060
884
  assert_lex3("-1.0",
1061
885
  nil,
1062
886
  :tUMINUS_NUM, "-", EXPR_BEG,
1063
- :tFLOAT, 1.0, EXPR_NUM)
887
+ :tFLOAT, 1.0, EXPR_NUM)
1064
888
  end
1065
889
 
1066
890
  def test_yylex_ge
@@ -1068,7 +892,7 @@ class TestRubyLexer < Minitest::Test
1068
892
  nil,
1069
893
  :tIDENTIFIER, "a", EXPR_CMDARG,
1070
894
  :tGEQ, ">=", EXPR_BEG,
1071
- :tINTEGER, 2, EXPR_NUM)
895
+ :tINTEGER, 2, EXPR_NUM)
1072
896
  end
1073
897
 
1074
898
  def test_yylex_global
@@ -1092,56 +916,150 @@ class TestRubyLexer < Minitest::Test
1092
916
  def test_yylex_global_number
1093
917
  self.lex_state = EXPR_FNAME
1094
918
 
1095
- assert_lex3("$1", nil, :tGVAR, "$1", EXPR_END)
919
+ assert_lex3("$1", nil, :tGVAR, "$1", EXPR_END)
920
+ end
921
+
922
+ def test_yylex_global_number_big
923
+ self.lex_state = EXPR_FNAME
924
+
925
+ assert_lex3("$1234", nil, :tGVAR, "$1234", EXPR_END)
926
+ end
927
+
928
+ def test_yylex_global_I_have_no_words
929
+ assert_lex3("$x\xE2\x80\x8B = 42", # zero width space?!?!?
930
+ nil,
931
+ :tGVAR, "$x\xE2\x80\x8B", EXPR_END,
932
+ :tEQL, "=", EXPR_BEG,
933
+ :tINTEGER, 42, EXPR_NUM)
934
+ end
935
+
936
+ def test_yylex_global_other
937
+ assert_lex3("[$~, $*, $$, $?, $!, $@, $/, $\\, $;, $,, $., $=, $:, $<, $>, $\"]",
938
+ nil,
939
+ :tLBRACK, "[", EXPR_PAR,
940
+ :tGVAR, "$~", EXPR_END, :tCOMMA, ",", EXPR_PAR,
941
+ :tGVAR, "$*", EXPR_END, :tCOMMA, ",", EXPR_PAR,
942
+ :tGVAR, "$$", EXPR_END, :tCOMMA, ",", EXPR_PAR,
943
+ :tGVAR, "$?", EXPR_END, :tCOMMA, ",", EXPR_PAR,
944
+ :tGVAR, "$!", EXPR_END, :tCOMMA, ",", EXPR_PAR,
945
+ :tGVAR, "$@", EXPR_END, :tCOMMA, ",", EXPR_PAR,
946
+ :tGVAR, "$/", EXPR_END, :tCOMMA, ",", EXPR_PAR,
947
+ :tGVAR, "$\\", EXPR_END, :tCOMMA, ",", EXPR_PAR,
948
+ :tGVAR, "$;", EXPR_END, :tCOMMA, ",", EXPR_PAR,
949
+ :tGVAR, "$,", EXPR_END, :tCOMMA, ",", EXPR_PAR,
950
+ :tGVAR, "$.", EXPR_END, :tCOMMA, ",", EXPR_PAR,
951
+ :tGVAR, "$=", EXPR_END, :tCOMMA, ",", EXPR_PAR,
952
+ :tGVAR, "$:", EXPR_END, :tCOMMA, ",", EXPR_PAR,
953
+ :tGVAR, "$<", EXPR_END, :tCOMMA, ",", EXPR_PAR,
954
+ :tGVAR, "$>", EXPR_END, :tCOMMA, ",", EXPR_PAR,
955
+ :tGVAR, "$\"", EXPR_END,
956
+ :tRBRACK, "]", EXPR_END)
957
+ end
958
+
959
+ def test_yylex_global_underscore
960
+ assert_lex3("$_", nil, :tGVAR, "$_", EXPR_END)
961
+ end
962
+
963
+ def test_yylex_global_wierd
964
+ assert_lex3("$__blah", nil, :tGVAR, "$__blah", EXPR_END)
965
+ end
966
+
967
+ def test_yylex_global_zero
968
+ assert_lex3("$0", nil, :tGVAR, "$0", EXPR_END)
969
+ end
970
+
971
+ def test_yylex_gt
972
+ assert_lex3("a > 2",
973
+ nil,
974
+ :tIDENTIFIER, "a", EXPR_CMDARG,
975
+ :tGT, ">", EXPR_BEG,
976
+ :tINTEGER, 2, EXPR_NUM)
977
+ end
978
+
979
+ def test_yylex_hash_colon
980
+ assert_lex("{a:1}",
981
+ s(:hash, s(:lit, :a), s(:lit, 1)),
982
+
983
+ :tLBRACE, "{", EXPR_PAR, 0, 1,
984
+ :tLABEL, "a", EXPR_LAB, 0, 1,
985
+ :tINTEGER, 1, EXPR_NUM, 0, 1,
986
+ :tRCURLY, "}", EXPR_END, 0, 0)
987
+ end
988
+
989
+ def test_yylex_hash_colon_double_quoted_symbol
990
+ assert_lex('{"abc": :b}',
991
+ s(:hash, s(:lit, :abc), s(:lit, :b)),
992
+
993
+ :tLBRACE, "{", EXPR_PAR, 0, 1,
994
+ :tLABEL, "abc", EXPR_LAB, 0, 1,
995
+ :tSYMBOL, "b", EXPR_LIT, 0, 1,
996
+ :tRCURLY, "}", EXPR_END, 0, 0)
997
+ end
998
+
999
+ def test_yylex_hash_colon_double_quoted_symbol_22
1000
+ setup_lexer_class RubyParser::V22
1001
+
1002
+ assert_lex('{"abc": :b}',
1003
+ s(:hash, s(:lit, :abc), s(:lit, :b)),
1004
+
1005
+ :tLBRACE, "{", EXPR_PAR, 0, 1,
1006
+ :tLABEL, "abc", EXPR_LAB, 0, 1,
1007
+ :tSYMBOL, "b", EXPR_LIT, 0, 1,
1008
+ :tRCURLY, "}", EXPR_ENDARG, 0, 0)
1009
+ end
1010
+
1011
+ def test_yylex_hash_colon_double_quoted_with_escapes
1012
+ assert_lex3("{\"s\\tr\\i\\ng\\\\foo\\'bar\":1}",
1013
+ nil,
1014
+
1015
+ :tLBRACE, "{", EXPR_PAR,
1016
+ :tLABEL, "s\tr\i\ng\\foo'bar", EXPR_LAB,
1017
+ :tINTEGER, 1, EXPR_NUM,
1018
+ :tRCURLY, "}", EXPR_END)
1019
+ end
1020
+
1021
+ def test_yylex_hash_colon_quoted_22
1022
+ setup_lexer_class RubyParser::V22
1023
+
1024
+ assert_lex("{'a':1}",
1025
+ s(:hash, s(:lit, :a), s(:lit, 1)),
1026
+
1027
+ :tLBRACE, "{", EXPR_PAR, 0, 1,
1028
+ :tLABEL, "a", EXPR_LAB, 0, 1,
1029
+ :tINTEGER, 1, EXPR_NUM, 0, 1,
1030
+ :tRCURLY, "}", EXPR_ENDARG, 0, 0)
1096
1031
  end
1097
1032
 
1098
- def test_yylex_global_number_big
1099
- self.lex_state = EXPR_FNAME
1033
+ def test_yylex_hash_colon_quoted_symbol
1034
+ assert_lex("{'abc': :b}",
1035
+ s(:hash, s(:lit, :abc), s(:lit, :b)),
1100
1036
 
1101
- assert_lex3("$1234", nil, :tGVAR, "$1234", EXPR_END)
1037
+ :tLBRACE, "{", EXPR_PAR, 0, 1,
1038
+ :tLABEL, "abc", EXPR_LAB, 0, 1,
1039
+ :tSYMBOL, "b", EXPR_LIT, 0, 1,
1040
+ :tRCURLY, "}", EXPR_END, 0, 0)
1102
1041
  end
1103
1042
 
1104
- def test_yylex_global_other
1105
- assert_lex3("[$~, $*, $$, $?, $!, $@, $/, $\\, $;, $,, $., $=, $:, $<, $>, $\"]",
1106
- nil,
1107
- :tLBRACK, "[", EXPR_PAR,
1108
- :tGVAR, "$~", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1109
- :tGVAR, "$*", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1110
- :tGVAR, "$$", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1111
- :tGVAR, "$?", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1112
- :tGVAR, "$!", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1113
- :tGVAR, "$@", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1114
- :tGVAR, "$/", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1115
- :tGVAR, "$\\", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1116
- :tGVAR, "$;", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1117
- :tGVAR, "$,", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1118
- :tGVAR, "$.", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1119
- :tGVAR, "$=", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1120
- :tGVAR, "$:", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1121
- :tGVAR, "$<", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1122
- :tGVAR, "$>", EXPR_END, :tCOMMA, ",", EXPR_PAR,
1123
- :tGVAR, "$\"", EXPR_END,
1124
- :tRBRACK, "]", EXPR_ENDARG)
1125
- end
1043
+ def test_yylex_hash_colon_quoted_symbol_22
1044
+ setup_lexer_class RubyParser::V22
1126
1045
 
1127
- def test_yylex_global_underscore
1128
- assert_lex3("$_", nil, :tGVAR, "$_", EXPR_END)
1129
- end
1046
+ assert_lex("{'abc': :b}",
1047
+ s(:hash, s(:lit, :abc), s(:lit, :b)),
1130
1048
 
1131
- def test_yylex_global_wierd
1132
- assert_lex3("$__blah", nil, :tGVAR, "$__blah", EXPR_END)
1049
+ :tLBRACE, "{", EXPR_PAR, 0, 1,
1050
+ :tLABEL, "abc", EXPR_LAB, 0, 1,
1051
+ :tSYMBOL, "b", EXPR_LIT, 0, 1,
1052
+ :tRCURLY, "}", EXPR_ENDARG, 0, 0)
1133
1053
  end
1134
1054
 
1135
- def test_yylex_global_zero
1136
- assert_lex3("$0", nil, :tGVAR, "$0", EXPR_END)
1137
- end
1055
+ def test_yylex_hash_colon_quoted_with_escapes
1056
+ assert_lex3("{'s\\tr\\i\\ng\\\\foo\\'bar':1}",
1057
+ nil,
1138
1058
 
1139
- def test_yylex_gt
1140
- assert_lex3("a > 2",
1141
- nil,
1142
- :tIDENTIFIER, "a", EXPR_CMDARG,
1143
- :tGT, ">", EXPR_BEG,
1144
- :tINTEGER, 2, EXPR_NUM)
1059
+ :tLBRACE, "{", EXPR_PAR,
1060
+ :tLABEL, "s\\tr\\i\\ng\\foo'bar", EXPR_LAB,
1061
+ :tINTEGER, 1, EXPR_NUM,
1062
+ :tRCURLY, "}", EXPR_END)
1145
1063
  end
1146
1064
 
1147
1065
  def test_yylex_heredoc_backtick
@@ -1151,7 +1069,7 @@ class TestRubyLexer < Minitest::Test
1151
1069
  :tEQL, "=", EXPR_BEG,
1152
1070
  :tXSTRING_BEG, "`", EXPR_BEG,
1153
1071
  :tSTRING_CONTENT, " blah blah\n", EXPR_BEG,
1154
- :tSTRING_END, "EOF", EXPR_END,
1072
+ :tSTRING_END, "EOF", EXPR_LIT,
1155
1073
  :tNL, nil, EXPR_BEG)
1156
1074
  end
1157
1075
 
@@ -1162,7 +1080,7 @@ class TestRubyLexer < Minitest::Test
1162
1080
  :tEQL, "=", EXPR_BEG,
1163
1081
  :tSTRING_BEG, "\"", EXPR_BEG,
1164
1082
  :tSTRING_CONTENT, " blah blah\n", EXPR_BEG,
1165
- :tSTRING_END, "EOF", EXPR_END,
1083
+ :tSTRING_END, "EOF", EXPR_LIT,
1166
1084
  :tNL, nil, EXPR_BEG)
1167
1085
  end
1168
1086
 
@@ -1173,51 +1091,10 @@ class TestRubyLexer < Minitest::Test
1173
1091
  :tEQL, "=", EXPR_BEG,
1174
1092
  :tSTRING_BEG, "\"", EXPR_BEG,
1175
1093
  :tSTRING_CONTENT, " blah blah\n", EXPR_BEG,
1176
- :tSTRING_END, "EOF", EXPR_END,
1094
+ :tSTRING_END, "EOF", EXPR_LIT,
1177
1095
  :tNL, nil, EXPR_BEG)
1178
1096
  end
1179
1097
 
1180
- def test_yylex_heredoc_double_squiggly
1181
- setup_lexer_class Ruby23Parser
1182
-
1183
- assert_lex3("a = <<~\"EOF\"\n blah blah\n EOF\n\n",
1184
- nil,
1185
- :tIDENTIFIER, "a", EXPR_CMDARG,
1186
- :tEQL, "=", EXPR_BEG,
1187
- :tSTRING_BEG, "\"", EXPR_BEG,
1188
- :tSTRING_CONTENT, "blah blah\n", EXPR_BEG,
1189
- :tSTRING_END, "EOF", EXPR_END,
1190
- :tNL, nil, EXPR_BEG)
1191
- end
1192
-
1193
- # mri handles tabs in a pretty specific way:
1194
- # https://github.com/ruby/ruby/blob/trunk/parse.y#L5925
1195
- def test_yylex_heredoc_double_squiggly_with_tab_indentation_remaining
1196
- setup_lexer_class Ruby23Parser
1197
-
1198
- assert_lex3("a = <<~\"EOF\"\n blah blah\n \tblah blah\n EOF\n\n",
1199
- nil,
1200
- :tIDENTIFIER, "a", EXPR_CMDARG,
1201
- :tEQL, "=", EXPR_BEG,
1202
- :tSTRING_BEG, "\"", EXPR_BEG,
1203
- :tSTRING_CONTENT, "blah blah\n\tblah blah\n", EXPR_BEG,
1204
- :tSTRING_END, "EOF", EXPR_END,
1205
- :tNL, nil, EXPR_BEG)
1206
- end
1207
-
1208
- def test_yylex_heredoc_double_squiggly_with_tab_indentation_removed
1209
- setup_lexer_class Ruby23Parser
1210
-
1211
- assert_lex3("a = <<~\"EOF\"\n blah blah\n\t blah blah\n EOF\n\n",
1212
- nil,
1213
- :tIDENTIFIER, "a", EXPR_CMDARG,
1214
- :tEQL, "=", EXPR_BEG,
1215
- :tSTRING_BEG, "\"", EXPR_BEG,
1216
- :tSTRING_CONTENT, "blah blah\n blah blah\n", EXPR_BEG,
1217
- :tSTRING_END, "EOF", EXPR_END,
1218
- :tNL, nil, EXPR_BEG)
1219
- end
1220
-
1221
1098
  def test_yylex_heredoc_double_eos
1222
1099
  refute_lex("a = <<\"EOF\"\nblah",
1223
1100
  :tIDENTIFIER, "a",
@@ -1239,25 +1116,38 @@ class TestRubyLexer < Minitest::Test
1239
1116
  :tEQL, "=", EXPR_BEG,
1240
1117
  :tSTRING_BEG, "\"", EXPR_BEG,
1241
1118
  :tSTRING_CONTENT, "#x a ", EXPR_BEG,
1242
- :tSTRING_DVAR, "\#@", EXPR_BEG,
1119
+ :tSTRING_DVAR, "#", EXPR_BEG,
1243
1120
  :tSTRING_CONTENT, "@a b ", EXPR_BEG, # HUH?
1244
- :tSTRING_DVAR, "\#$", EXPR_BEG,
1121
+ :tSTRING_DVAR, "#", EXPR_BEG,
1245
1122
  :tSTRING_CONTENT, "$b c ", EXPR_BEG, # HUH?
1246
- :tSTRING_DVAR, "\#@", EXPR_BEG,
1123
+ :tSTRING_DVAR, "#", EXPR_BEG,
1247
1124
  :tSTRING_CONTENT, "@@d ", EXPR_BEG, # HUH?
1248
1125
  :tSTRING_DBEG, "\#{", EXPR_BEG,
1249
1126
  :tSTRING_CONTENT, "3} \n", EXPR_BEG,
1250
- :tSTRING_END, "EOF", EXPR_END,
1127
+ :tSTRING_END, "EOF", EXPR_LIT,
1251
1128
  :tNL, nil, EXPR_BEG)
1252
1129
  end
1253
1130
 
1131
+ def test_yylex_heredoc_double_squiggly
1132
+ setup_lexer_class Ruby23Parser
1133
+
1134
+ assert_lex3("a = <<~\"EOF\"\n blah blah\n EOF\n\n",
1135
+ nil,
1136
+ :tIDENTIFIER, "a", EXPR_CMDARG,
1137
+ :tEQL, "=", EXPR_BEG,
1138
+ :tSTRING_BEG, "\"", EXPR_BEG,
1139
+ :tSTRING_CONTENT, " blah blah\n", EXPR_BEG,
1140
+ :tSTRING_END, "EOF", EXPR_LIT,
1141
+ :tNL, nil, EXPR_BEG)
1142
+ end
1143
+
1254
1144
  def test_yylex_heredoc_empty
1255
1145
  assert_lex3("<<\"\"\n\#{x}\nblah2\n\n\n",
1256
1146
  nil,
1257
1147
  :tSTRING_BEG, "\"", EXPR_BEG,
1258
1148
  :tSTRING_DBEG, "\#{", EXPR_BEG,
1259
1149
  :tSTRING_CONTENT, "x}\nblah2\n", EXPR_BEG,
1260
- :tSTRING_END, "", EXPR_END,
1150
+ :tSTRING_END, "", EXPR_LIT,
1261
1151
  :tNL, nil, EXPR_BEG)
1262
1152
  end
1263
1153
 
@@ -1268,7 +1158,7 @@ class TestRubyLexer < Minitest::Test
1268
1158
  :tEQL, "=", EXPR_BEG,
1269
1159
  :tSTRING_BEG, "\"", EXPR_BEG,
1270
1160
  :tSTRING_CONTENT, "blah\nblah\n", EXPR_BEG,
1271
- :tSTRING_END, "EOF", EXPR_END,
1161
+ :tSTRING_END, "EOF", EXPR_LIT,
1272
1162
  :tNL, nil, EXPR_BEG)
1273
1163
  end
1274
1164
 
@@ -1286,7 +1176,7 @@ class TestRubyLexer < Minitest::Test
1286
1176
  :tEQL, "=", EXPR_BEG,
1287
1177
  :tSTRING_BEG, "\"", EXPR_BEG,
1288
1178
  :tSTRING_CONTENT, "blah\nblah\n", EXPR_BEG,
1289
- :tSTRING_END, "EOF", EXPR_END,
1179
+ :tSTRING_END, "EOF", EXPR_LIT,
1290
1180
  :tNL, nil, EXPR_BEG)
1291
1181
  end
1292
1182
 
@@ -1298,8 +1188,8 @@ class TestRubyLexer < Minitest::Test
1298
1188
  :tIDENTIFIER, "a", EXPR_CMDARG,
1299
1189
  :tEQL, "=", EXPR_BEG,
1300
1190
  :tSTRING_BEG, "\"", EXPR_BEG,
1301
- :tSTRING_CONTENT, "blah\nblah\n", EXPR_BEG,
1302
- :tSTRING_END, "EOF", EXPR_END,
1191
+ :tSTRING_CONTENT, " blah\n blah\n", EXPR_BEG,
1192
+ :tSTRING_END, "EOF", EXPR_LIT,
1303
1193
  :tNL, nil, EXPR_BEG)
1304
1194
  end
1305
1195
 
@@ -1310,7 +1200,7 @@ class TestRubyLexer < Minitest::Test
1310
1200
  :tEQL, "=", EXPR_BEG,
1311
1201
  :tSTRING_BEG, "\"", EXPR_BEG,
1312
1202
  :tSTRING_CONTENT, " blah blah\n", EXPR_BEG,
1313
- :tSTRING_END, "EOF", EXPR_END,
1203
+ :tSTRING_END, "EOF", EXPR_LIT,
1314
1204
  :tNL, nil, EXPR_BEG)
1315
1205
  end
1316
1206
 
@@ -1349,7 +1239,7 @@ class TestRubyLexer < Minitest::Test
1349
1239
  :tEQL, "=", EXPR_BEG,
1350
1240
  :tSTRING_BEG, "\"", EXPR_BEG,
1351
1241
  :tSTRING_CONTENT, " blah blah\n", EXPR_BEG,
1352
- :tSTRING_END, "EOF", EXPR_END,
1242
+ :tSTRING_END, "EOF", EXPR_LIT,
1353
1243
  :tNL, nil, EXPR_BEG)
1354
1244
  end
1355
1245
 
@@ -1361,8 +1251,8 @@ class TestRubyLexer < Minitest::Test
1361
1251
  :tIDENTIFIER, "a", EXPR_CMDARG,
1362
1252
  :tEQL, "=", EXPR_BEG,
1363
1253
  :tSTRING_BEG, "\"", EXPR_BEG,
1364
- :tSTRING_CONTENT, "blah blah\n", EXPR_BEG,
1365
- :tSTRING_END, "EOF", EXPR_END,
1254
+ :tSTRING_CONTENT, " blah blah\n", EXPR_BEG,
1255
+ :tSTRING_END, "EOF", EXPR_LIT,
1366
1256
  :tNL, nil, EXPR_BEG)
1367
1257
  end
1368
1258
 
@@ -1392,41 +1282,41 @@ class TestRubyLexer < Minitest::Test
1392
1282
  assert_lex3("identifier?", nil, :tFID, "identifier?", EXPR_CMDARG)
1393
1283
  end
1394
1284
 
1395
- def test_yylex_identifier_equals_arrow
1396
- assert_lex3(":blah==>",
1397
- nil,
1398
- :tSYMBOL, "blah=", EXPR_END,
1399
- :tASSOC, "=>", EXPR_BEG)
1400
- end
1401
-
1402
1285
  def test_yylex_identifier_equals3
1403
1286
  assert_lex3(":a===b",
1404
1287
  nil,
1405
- :tSYMBOL, "a", EXPR_END,
1288
+ :tSYMBOL, "a", EXPR_LIT,
1406
1289
  :tEQQ, "===", EXPR_BEG,
1407
1290
  :tIDENTIFIER, "b", EXPR_ARG)
1408
1291
  end
1409
1292
 
1410
- def test_yylex_identifier_equals_equals_arrow
1411
- assert_lex3(":a==>b",
1293
+ def test_yylex_identifier_equals_arrow
1294
+ assert_lex3(":blah==>",
1412
1295
  nil,
1413
- :tSYMBOL, "a=", EXPR_END,
1414
- :tASSOC, "=>", EXPR_BEG,
1415
- :tIDENTIFIER, "b", EXPR_ARG)
1296
+ :tSYMBOL, "blah=", EXPR_LIT,
1297
+ :tASSOC, "=>", EXPR_BEG)
1416
1298
  end
1417
1299
 
1418
1300
  def test_yylex_identifier_equals_caret
1419
1301
  assert_lex_fname "^", :tCARET
1420
1302
  end
1421
1303
 
1304
+ def test_yylex_identifier_equals_def2
1305
+ assert_lex_fname "==", :tEQ
1306
+ end
1307
+
1422
1308
  def test_yylex_identifier_equals_def__20
1423
1309
  setup_lexer_class RubyParser::V20
1424
1310
 
1425
1311
  assert_lex_fname "identifier=", :tIDENTIFIER, EXPR_ENDFN
1426
1312
  end
1427
1313
 
1428
- def test_yylex_identifier_equals_def2
1429
- assert_lex_fname "==", :tEQ
1314
+ def test_yylex_identifier_equals_equals_arrow
1315
+ assert_lex3(":a==>b",
1316
+ nil,
1317
+ :tSYMBOL, "a=", EXPR_LIT,
1318
+ :tASSOC, "=>", EXPR_BEG,
1319
+ :tIDENTIFIER, "b", EXPR_ARG)
1430
1320
  end
1431
1321
 
1432
1322
  def test_yylex_identifier_equals_expr
@@ -1515,25 +1405,6 @@ class TestRubyLexer < Minitest::Test
1515
1405
  refute_lex "0d42__24"
1516
1406
  end
1517
1407
 
1518
- def test_yylex_integer_if_modifier
1519
- assert_lex3("123if",
1520
- nil,
1521
- :tINTEGER, 123, EXPR_NUM,
1522
- :kIF_MOD, "if", EXPR_PAR)
1523
- end
1524
-
1525
- def test_yylex_question_eh_a__20
1526
- setup_lexer_class RubyParser::V20
1527
-
1528
- assert_lex3("?a", nil, :tSTRING, "a", EXPR_END)
1529
- end
1530
-
1531
- def test_yylex_question_eh_escape_M_escape_C__20
1532
- setup_lexer_class RubyParser::V20
1533
-
1534
- assert_lex3("?\\M-\\C-a", nil, :tSTRING, "\M-\C-a", EXPR_END)
1535
- end
1536
-
1537
1408
  def test_yylex_integer_hex
1538
1409
  assert_lex3 "0x2a", nil, :tINTEGER, 42, EXPR_NUM
1539
1410
  end
@@ -1546,20 +1417,15 @@ class TestRubyLexer < Minitest::Test
1546
1417
  refute_lex "0xab__cd"
1547
1418
  end
1548
1419
 
1549
- def test_yylex_integer_oct
1550
- assert_lex3("052", nil, :tINTEGER, 42, EXPR_NUM)
1551
- end
1552
-
1553
- def test_yylex_integer_oct_bad_range
1554
- refute_lex "08"
1555
- end
1556
-
1557
- def test_yylex_integer_oct_bad_range2
1558
- refute_lex "08"
1420
+ def test_yylex_integer_if_modifier
1421
+ assert_lex3("123if",
1422
+ nil,
1423
+ :tINTEGER, 123, EXPR_NUM,
1424
+ :kIF_MOD, "if", EXPR_PAR)
1559
1425
  end
1560
1426
 
1561
- def test_yylex_integer_oct_bad_underscores
1562
- refute_lex "01__23"
1427
+ def test_yylex_integer_oct
1428
+ assert_lex3("052", nil, :tINTEGER, 42, EXPR_NUM)
1563
1429
  end
1564
1430
 
1565
1431
  def test_yylex_integer_oct_O
@@ -1578,6 +1444,18 @@ class TestRubyLexer < Minitest::Test
1578
1444
  assert_lex3 "0O ", nil, :tINTEGER, 0, EXPR_NUM
1579
1445
  end
1580
1446
 
1447
+ def test_yylex_integer_oct_bad_range
1448
+ refute_lex "08"
1449
+ end
1450
+
1451
+ def test_yylex_integer_oct_bad_range2
1452
+ refute_lex "08"
1453
+ end
1454
+
1455
+ def test_yylex_integer_oct_bad_underscores
1456
+ refute_lex "01__23"
1457
+ end
1458
+
1581
1459
  def test_yylex_integer_oct_o
1582
1460
  assert_lex3 "0o52", nil, :tINTEGER, 42, EXPR_NUM
1583
1461
  end
@@ -1602,34 +1480,235 @@ class TestRubyLexer < Minitest::Test
1602
1480
  :tIDENTIFIER, "to_s", EXPR_ARG)
1603
1481
  end
1604
1482
 
1605
- def test_yylex_integer_underscore
1606
- assert_lex3("4_2", nil, :tINTEGER, 42, EXPR_NUM)
1483
+ def test_yylex_integer_underscore
1484
+ assert_lex3("4_2", nil, :tINTEGER, 42, EXPR_NUM)
1485
+ end
1486
+
1487
+ def test_yylex_integer_underscore_bad
1488
+ refute_lex "4__2"
1489
+ end
1490
+
1491
+ def test_yylex_integer_zero
1492
+ assert_lex3 "0", nil, :tINTEGER, 0, EXPR_NUM
1493
+ end
1494
+
1495
+ def test_yylex_is_your_spacebar_broken?
1496
+ assert_lex3(":a!=:b",
1497
+ nil,
1498
+ :tSYMBOL, "a", EXPR_LIT,
1499
+ :tNEQ, "!=", EXPR_BEG,
1500
+ :tSYMBOL, "b", EXPR_LIT)
1501
+ end
1502
+
1503
+ def test_yylex_iter_array_curly
1504
+ # this will lex, but doesn't parse... don't freak out.
1505
+ assert_lex("f :a, [:b] { |c, d| }", # yes, this is bad code
1506
+ nil,
1507
+
1508
+ :tIDENTIFIER, "f", EXPR_CMDARG, 0, 0,
1509
+ :tSYMBOL, "a", EXPR_LIT, 0, 0,
1510
+ :tCOMMA, ",", EXPR_PAR, 0, 0,
1511
+ :tLBRACK, "[", EXPR_PAR, 1, 0,
1512
+ :tSYMBOL, "b", EXPR_LIT, 1, 0,
1513
+ :tRBRACK, "]", EXPR_END, 0, 0,
1514
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
1515
+ :tPIPE, "|", EXPR_PAR, 0, 1,
1516
+ :tIDENTIFIER, "c", EXPR_ARG, 0, 1,
1517
+ :tCOMMA, ",", EXPR_PAR, 0, 1,
1518
+ :tIDENTIFIER, "d", EXPR_ARG, 0, 1,
1519
+ :tPIPE, "|", EXPR_PAR, 0, 1,
1520
+ :tRCURLY, "}", EXPR_END, 0, 0)
1521
+ end
1522
+
1523
+ def test_yylex_iter_array_curly__24
1524
+ setup_lexer_class RubyParser::V24
1525
+
1526
+ assert_lex("f :a, [:b] { |c, d| }", # yes, this is bad code
1527
+ s(:iter,
1528
+ s(:call, nil, :f, s(:lit, :a), s(:array, s(:lit, :b))),
1529
+ s(:args, :c, :d)),
1530
+
1531
+ :tIDENTIFIER, "f", EXPR_CMDARG, 0, 0,
1532
+ :tSYMBOL, "a", EXPR_LIT, 0, 0,
1533
+ :tCOMMA, ",", EXPR_PAR, 0, 0,
1534
+ :tLBRACK, "[", EXPR_PAR, 1, 0,
1535
+ :tSYMBOL, "b", EXPR_LIT, 1, 0,
1536
+ :tRBRACK, "]", EXPR_ENDARG, 0, 0,
1537
+ :tLBRACE_ARG, "{", EXPR_BEG, 0, 1,
1538
+ :tPIPE, "|", EXPR_PAR, 0, 1,
1539
+ :tIDENTIFIER, "c", EXPR_ARG, 0, 1,
1540
+ :tCOMMA, ",", EXPR_PAR, 0, 1,
1541
+ :tIDENTIFIER, "d", EXPR_ARG, 0, 1,
1542
+ :tPIPE, "|", EXPR_PAR, 0, 1,
1543
+ :tRCURLY, "}", EXPR_ENDARG, 0, 0)
1544
+ end
1545
+
1546
+ def test_yylex_ivar
1547
+ assert_lex3("@blah", nil, :tIVAR, "@blah", EXPR_END)
1548
+ end
1549
+
1550
+ def test_yylex_ivar_bad
1551
+ refute_lex "@1"
1552
+ end
1553
+
1554
+ def test_yylex_ivar_bad_0_length
1555
+ refute_lex "1+@\n", :tINTEGER, 1, :tPLUS, "+", EXPR_NUM
1556
+ end
1557
+
1558
+ def test_yylex_keyword_expr
1559
+ self.lex_state = EXPR_ENDARG
1560
+
1561
+ assert_lex3("if", nil, :kIF_MOD, "if", EXPR_PAR)
1562
+ end
1563
+
1564
+ def test_yylex_label
1565
+ assert_lex3("{a:",
1566
+ nil,
1567
+ :tLBRACE, "{", EXPR_PAR,
1568
+ :tLABEL, "a", EXPR_LAB)
1569
+ end
1570
+
1571
+ def test_yylex_label_in_params
1572
+ assert_lex3("foo(a:",
1573
+ nil,
1574
+ :tIDENTIFIER, "foo", EXPR_CMDARG,
1575
+ :tLPAREN2, "(", EXPR_PAR,
1576
+ :tLABEL, "a", EXPR_LAB)
1577
+ end
1578
+
1579
+ def test_yylex_lambda_args
1580
+ assert_lex("-> (a) { }",
1581
+ s(:iter, s(:lambda),
1582
+ s(:args, :a)),
1583
+
1584
+ :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
1585
+ :tLPAREN2, "(", EXPR_PAR, 1, 0,
1586
+ :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
1587
+ :tRPAREN, ")", EXPR_ENDFN, 0, 0,
1588
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
1589
+ :tRCURLY, "}", EXPR_END, 0, 0)
1590
+ end
1591
+
1592
+ def test_yylex_lambda_args__24
1593
+ setup_lexer_class RubyParser::V24
1594
+
1595
+ assert_lex("-> (a) { }",
1596
+ s(:iter, s(:lambda),
1597
+ s(:args, :a)),
1598
+
1599
+ :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
1600
+ :tLPAREN2, "(", EXPR_PAR, 1, 0,
1601
+ :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
1602
+ :tRPAREN, ")", EXPR_ENDFN, 0, 0,
1603
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
1604
+ :tRCURLY, "}", EXPR_ENDARG, 0, 0)
1605
+ end
1606
+
1607
+ def test_yylex_lambda_args_opt
1608
+ assert_lex("-> (a=nil) { }",
1609
+ s(:iter, s(:lambda),
1610
+ s(:args, s(:lasgn, :a, s(:nil)))),
1611
+
1612
+ :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
1613
+ :tLPAREN2, "(", EXPR_PAR, 1, 0,
1614
+ :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
1615
+ :tEQL, "=", EXPR_BEG, 1, 0,
1616
+ :kNIL, "nil", EXPR_END, 1, 0,
1617
+ :tRPAREN, ")", EXPR_ENDFN, 0, 0,
1618
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
1619
+ :tRCURLY, "}", EXPR_END, 0, 0)
1620
+ end
1621
+
1622
+ def test_yylex_lambda_args_opt__24
1623
+ setup_lexer_class RubyParser::V24
1624
+
1625
+ assert_lex("-> (a=nil) { }",
1626
+ s(:iter, s(:lambda),
1627
+ s(:args, s(:lasgn, :a, s(:nil)))),
1628
+
1629
+ :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
1630
+ :tLPAREN2, "(", EXPR_PAR, 1, 0,
1631
+ :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
1632
+ :tEQL, "=", EXPR_BEG, 1, 0,
1633
+ :kNIL, "nil", EXPR_END, 1, 0,
1634
+ :tRPAREN, ")", EXPR_ENDFN, 0, 0,
1635
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
1636
+ :tRCURLY, "}", EXPR_ENDARG, 0, 0)
1637
+ end
1638
+
1639
+ def test_yylex_lambda_as_args_with_block
1640
+ assert_lex3("a -> do end do end",
1641
+ nil,
1642
+ :tIDENTIFIER, "a", EXPR_CMDARG,
1643
+ :tLAMBDA, nil, EXPR_ENDFN,
1644
+ :kDO, "do", EXPR_BEG,
1645
+ :kEND, "end", EXPR_END,
1646
+ :kDO, "do", EXPR_BEG,
1647
+ :kEND, "end", EXPR_END)
1607
1648
  end
1608
1649
 
1609
- def test_yylex_integer_underscore_bad
1610
- refute_lex "4__2"
1611
- end
1650
+ def test_yylex_lambda_hash
1651
+ assert_lex("-> (a={}) { }",
1652
+ s(:iter, s(:lambda),
1653
+ s(:args, s(:lasgn, :a, s(:hash)))),
1612
1654
 
1613
- def test_yylex_integer_zero
1614
- assert_lex3 "0", nil, :tINTEGER, 0, EXPR_NUM
1655
+ :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
1656
+ :tLPAREN2, "(", EXPR_PAR, 1, 0,
1657
+ :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
1658
+ :tEQL, "=", EXPR_BEG, 1, 0,
1659
+ :tLBRACE, "{", EXPR_PAR, 1, 1,
1660
+ :tRCURLY, "}", EXPR_END, 1, 0,
1661
+ :tRPAREN, ")", EXPR_ENDFN, 0, 0,
1662
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
1663
+ :tRCURLY, "}", EXPR_END, 0, 0)
1615
1664
  end
1616
1665
 
1617
- def test_yylex_ivar
1618
- assert_lex3("@blah", nil, :tIVAR, "@blah", EXPR_END)
1619
- end
1666
+ def test_yylex_lambda_hash__24
1667
+ setup_lexer_class RubyParser::V24
1620
1668
 
1621
- def test_yylex_ivar_bad
1622
- refute_lex "@1"
1623
- end
1669
+ assert_lex("-> (a={}) { }",
1670
+ s(:iter, s(:lambda),
1671
+ s(:args, s(:lasgn, :a, s(:hash)))),
1624
1672
 
1625
- def test_yylex_ivar_bad_0_length
1626
- refute_lex "1+@\n", :tINTEGER, 1, :tPLUS, "+", EXPR_NUM
1673
+ :tLAMBDA, nil, EXPR_ENDFN, 0, 0,
1674
+ :tLPAREN2, "(", EXPR_PAR, 1, 0,
1675
+ :tIDENTIFIER, "a", EXPR_ARG, 1, 0,
1676
+ :tEQL, "=", EXPR_BEG, 1, 0,
1677
+ :tLBRACE, "{", EXPR_PAR, 1, 1,
1678
+ :tRCURLY, "}", EXPR_ENDARG, 1, 0,
1679
+ :tRPAREN, ")", EXPR_ENDFN, 0, 0,
1680
+ :tLCURLY, "{", EXPR_PAR, 0, 1,
1681
+ :tRCURLY, "}", EXPR_ENDARG, 0, 0)
1627
1682
  end
1628
1683
 
1629
- def test_yylex_keyword_expr
1630
- self.lex_state = EXPR_ENDARG
1684
+ def test_yylex_lasgn_call_same_name
1685
+ assert_lex("a = b.c :d => 1",
1686
+ s(:lasgn, :a,
1687
+ s(:call, s(:call, nil, :b), :c,
1688
+ s(:hash, s(:lit, :d), s(:lit, 1)))),
1631
1689
 
1632
- assert_lex3("if", nil, :kIF_MOD, "if", EXPR_PAR)
1690
+ :tIDENTIFIER, "a", EXPR_CMDARG, 0, 0,
1691
+ :tEQL, "=", EXPR_BEG, 0, 0,
1692
+ :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
1693
+ :tDOT, ".", EXPR_DOT, 0, 0,
1694
+ :tIDENTIFIER, "c", EXPR_ARG, 0, 0, # different
1695
+ :tSYMBOL, "d", EXPR_LIT, 0, 0,
1696
+ :tASSOC, "=>", EXPR_BEG, 0, 0,
1697
+ :tINTEGER, 1, EXPR_NUM, 0, 0)
1698
+
1699
+ assert_lex("a = b.a :d => 1",
1700
+ s(:lasgn, :a,
1701
+ s(:call, s(:call, nil, :b), :a,
1702
+ s(:hash, s(:lit, :d), s(:lit, 1)))),
1703
+
1704
+ :tIDENTIFIER, "a", EXPR_CMDARG, 0, 0,
1705
+ :tEQL, "=", EXPR_BEG, 0, 0,
1706
+ :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
1707
+ :tDOT, ".", EXPR_DOT, 0, 0,
1708
+ :tIDENTIFIER, "a", EXPR_ARG, 0, 0, # same as lvar
1709
+ :tSYMBOL, "d", EXPR_LIT, 0, 0,
1710
+ :tASSOC, "=>", EXPR_BEG, 0, 0,
1711
+ :tINTEGER, 1, EXPR_NUM, 0, 0)
1633
1712
  end
1634
1713
 
1635
1714
  def test_yylex_lt
@@ -1656,12 +1735,22 @@ class TestRubyLexer < Minitest::Test
1656
1735
  assert_lex3("<=", nil, :tLEQ, "<=", EXPR_BEG)
1657
1736
  end
1658
1737
 
1738
+ def test_yylex_method_parens_chevron
1739
+ assert_lex("a()<<1",
1740
+ s(:call, s(:call, nil, :a), :<<, s(:lit, 1)),
1741
+ :tIDENTIFIER, "a", EXPR_CMDARG, 0, 0,
1742
+ :tLPAREN2, "(", EXPR_PAR, 1, 0,
1743
+ :tRPAREN, ")", EXPR_ENDFN, 0, 0,
1744
+ :tLSHFT, "<<", EXPR_BEG, 0, 0,
1745
+ :tINTEGER, 1, EXPR_NUM, 0, 0)
1746
+ end
1747
+
1659
1748
  def test_yylex_minus
1660
1749
  assert_lex3("1 - 2",
1661
1750
  nil,
1662
- :tINTEGER, 1, EXPR_NUM,
1751
+ :tINTEGER, 1, EXPR_NUM,
1663
1752
  :tMINUS, "-", EXPR_BEG,
1664
- :tINTEGER, 2, EXPR_NUM)
1753
+ :tINTEGER, 2, EXPR_NUM)
1665
1754
  end
1666
1755
 
1667
1756
  def test_yylex_minus_equals
@@ -1684,7 +1773,39 @@ class TestRubyLexer < Minitest::Test
1684
1773
  assert_lex3("-42",
1685
1774
  nil,
1686
1775
  :tUMINUS_NUM, "-", EXPR_BEG,
1687
- :tINTEGER, 42, EXPR_NUM)
1776
+ :tINTEGER, 42, EXPR_NUM)
1777
+ end
1778
+
1779
+ def test_yylex_not_at_defn
1780
+ assert_lex("def +@; end",
1781
+ s(:defn, :+@, s(:args), s(:nil)),
1782
+
1783
+ :kDEF, "def", EXPR_FNAME, 0, 0,
1784
+ :tUPLUS, "+@", EXPR_ARG, 0, 0,
1785
+ :tSEMI, ";", EXPR_BEG, 0, 0,
1786
+ :kEND, "end", EXPR_END, 0, 0)
1787
+
1788
+ assert_lex("def !@; end",
1789
+ s(:defn, :"!@", s(:args), s(:nil)),
1790
+
1791
+ :kDEF, "def", EXPR_FNAME, 0, 0,
1792
+ :tUBANG, "!@", EXPR_ARG, 0, 0,
1793
+ :tSEMI, ";", EXPR_BEG, 0, 0,
1794
+ :kEND, "end", EXPR_END, 0, 0)
1795
+ end
1796
+
1797
+ def test_yylex_not_at_ivar
1798
+ assert_lex("!@ivar",
1799
+ s(:call, s(:ivar, :@ivar), :"!"),
1800
+
1801
+ :tBANG, "!", EXPR_BEG, 0, 0,
1802
+ :tIVAR, "@ivar", EXPR_END, 0, 0)
1803
+ end
1804
+
1805
+ def test_yylex_not_unary_method
1806
+ self.lex_state = EXPR_FNAME
1807
+
1808
+ assert_lex3("!@", nil, :tUBANG, "!@", EXPR_ARG)
1688
1809
  end
1689
1810
 
1690
1811
  def test_yylex_nth_ref
@@ -1700,7 +1821,68 @@ class TestRubyLexer < Minitest::Test
1700
1821
  :tNTH_REF, 7, EXPR_END, :tCOMMA, ",", EXPR_PAR,
1701
1822
  :tNTH_REF, 8, EXPR_END, :tCOMMA, ",", EXPR_PAR,
1702
1823
  :tNTH_REF, 9, EXPR_END,
1703
- :tRBRACK, "]", EXPR_ENDARG)
1824
+ :tRBRACK, "]", EXPR_END)
1825
+ end
1826
+
1827
+ def test_yylex_number_times_ident_times_return_number
1828
+ assert_lex("1 * b * 3",
1829
+ s(:call,
1830
+ s(:call, s(:lit, 1), :*, s(:call, nil, :b)),
1831
+ :*, s(:lit, 3)),
1832
+
1833
+ :tINTEGER, 1, EXPR_NUM, 0, 0,
1834
+ :tSTAR2, "*", EXPR_BEG, 0, 0,
1835
+ :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
1836
+ :tSTAR2, "*", EXPR_BEG, 0, 0,
1837
+ :tINTEGER, 3, EXPR_NUM, 0, 0)
1838
+
1839
+ assert_lex("1 * b *\n 3",
1840
+ s(:call,
1841
+ s(:call, s(:lit, 1), :*, s(:call, nil, :b)),
1842
+ :*, s(:lit, 3)),
1843
+
1844
+ :tINTEGER, 1, EXPR_NUM, 0, 0,
1845
+ :tSTAR2, "*", EXPR_BEG, 0, 0,
1846
+ :tIDENTIFIER, "b", EXPR_ARG, 0, 0,
1847
+ :tSTAR2, "*", EXPR_BEG, 0, 0,
1848
+ :tINTEGER, 3, EXPR_NUM, 0, 0)
1849
+ end
1850
+
1851
+ def test_yylex_numbers
1852
+ assert_lex3 "0b10", nil, :tINTEGER, 2, EXPR_NUM
1853
+ assert_lex3 "0B10", nil, :tINTEGER, 2, EXPR_NUM
1854
+
1855
+ assert_lex3 "0d10", nil, :tINTEGER, 10, EXPR_NUM
1856
+ assert_lex3 "0D10", nil, :tINTEGER, 10, EXPR_NUM
1857
+
1858
+ assert_lex3 "0x10", nil, :tINTEGER, 16, EXPR_NUM
1859
+ assert_lex3 "0X10", nil, :tINTEGER, 16, EXPR_NUM
1860
+
1861
+ assert_lex3 "0o10", nil, :tINTEGER, 8, EXPR_NUM
1862
+ assert_lex3 "0O10", nil, :tINTEGER, 8, EXPR_NUM
1863
+
1864
+ assert_lex3 "0o", nil, :tINTEGER, 0, EXPR_NUM
1865
+ assert_lex3 "0O", nil, :tINTEGER, 0, EXPR_NUM
1866
+
1867
+ assert_lex3 "0", nil, :tINTEGER, 0, EXPR_NUM
1868
+
1869
+ refute_lex "0x"
1870
+ refute_lex "0X"
1871
+ refute_lex "0b"
1872
+ refute_lex "0B"
1873
+ refute_lex "0d"
1874
+ refute_lex "0D"
1875
+
1876
+ refute_lex "08"
1877
+ refute_lex "09"
1878
+ refute_lex "0o8"
1879
+ refute_lex "0o9"
1880
+ refute_lex "0O8"
1881
+ refute_lex "0O9"
1882
+
1883
+ refute_lex "1_e1"
1884
+ refute_lex "1_.1"
1885
+ refute_lex "1__1"
1704
1886
  end
1705
1887
 
1706
1888
  def test_yylex_open_bracket
@@ -1730,9 +1912,9 @@ class TestRubyLexer < Minitest::Test
1730
1912
  assert_lex3("m { 3 }",
1731
1913
  nil,
1732
1914
  :tIDENTIFIER, "m", EXPR_CMDARG,
1733
- :tLCURLY, "{", EXPR_PAR,
1734
- :tINTEGER, 3, EXPR_NUM,
1735
- :tRCURLY, "}", EXPR_ENDARG)
1915
+ :tLCURLY, "{", EXPR_PAR,
1916
+ :tINTEGER, 3, EXPR_NUM,
1917
+ :tRCURLY, "}", EXPR_END)
1736
1918
  end
1737
1919
 
1738
1920
  def test_yylex_open_curly_bracket_block
@@ -1741,8 +1923,8 @@ class TestRubyLexer < Minitest::Test
1741
1923
  assert_lex3("{ 4 }",
1742
1924
  nil,
1743
1925
  :tLBRACE_ARG, "{", EXPR_BEG,
1744
- :tINTEGER, 4, EXPR_NUM,
1745
- :tRCURLY, "}", EXPR_ENDARG)
1926
+ :tINTEGER, 4, EXPR_NUM,
1927
+ :tRCURLY, "}", EXPR_END)
1746
1928
  end
1747
1929
 
1748
1930
  def test_yylex_open_square_bracket_arg
@@ -1751,32 +1933,32 @@ class TestRubyLexer < Minitest::Test
1751
1933
  assert_lex3("m [ 3 ]",
1752
1934
  nil,
1753
1935
  :tIDENTIFIER, "m", EXPR_CMDARG,
1754
- :tLBRACK, "[", EXPR_PAR,
1755
- :tINTEGER, 3, EXPR_NUM,
1756
- :tRBRACK, "]", EXPR_ENDARG)
1936
+ :tLBRACK, "[", EXPR_PAR,
1937
+ :tINTEGER, 3, EXPR_NUM,
1938
+ :tRBRACK, "]", EXPR_END)
1757
1939
  end
1758
1940
 
1759
1941
  def test_yylex_open_square_bracket_ary
1760
1942
  assert_lex3("[1, 2, 3]",
1761
1943
  nil,
1762
1944
  :tLBRACK, "[", EXPR_PAR,
1763
- :tINTEGER, 1, EXPR_NUM, :tCOMMA, ",", EXPR_PAR,
1764
- :tINTEGER, 2, EXPR_NUM, :tCOMMA, ",", EXPR_PAR,
1945
+ :tINTEGER, 1, EXPR_NUM, :tCOMMA, ",", EXPR_PAR,
1946
+ :tINTEGER, 2, EXPR_NUM, :tCOMMA, ",", EXPR_PAR,
1765
1947
  :tINTEGER, 3, EXPR_NUM,
1766
- :tRBRACK, "]", EXPR_ENDARG)
1948
+ :tRBRACK, "]", EXPR_END)
1767
1949
  end
1768
1950
 
1769
1951
  def test_yylex_open_square_bracket_meth
1770
1952
  assert_lex3("m[3]",
1771
1953
  nil,
1772
1954
  :tIDENTIFIER, "m", EXPR_CMDARG,
1773
- :tLBRACK2, "[", EXPR_PAR,
1774
- :tINTEGER, 3, EXPR_NUM,
1775
- :tRBRACK, "]", EXPR_ENDARG)
1955
+ :tLBRACK2, "[", EXPR_PAR,
1956
+ :tINTEGER, 3, EXPR_NUM,
1957
+ :tRBRACK, "]", EXPR_END)
1776
1958
  end
1777
1959
 
1778
1960
  def test_yylex_or
1779
- assert_lex3("|", nil, :tPIPE, "|", EXPR_PAR)
1961
+ assert_lex3("|", nil, :tPIPE, "|", EXPR_PAR)
1780
1962
  end
1781
1963
 
1782
1964
  def test_yylex_or2
@@ -1791,12 +1973,85 @@ class TestRubyLexer < Minitest::Test
1791
1973
  assert_lex3("|=", nil, :tOP_ASGN, "|", EXPR_BEG)
1792
1974
  end
1793
1975
 
1976
+ def test_yylex_paren_string_interpolated_regexp
1977
+ setup_lexer('%( #{(/abcd/)} )',
1978
+ s(:dstr, " ", s(:evstr, s(:lit, /abcd/)), s(:str, " ")))
1979
+
1980
+ assert_next_lexeme :tSTRING_BEG, "%)", EXPR_BEG, 0, 0
1981
+ assert_next_lexeme :tSTRING_CONTENT, " ", EXPR_BEG, 0, 0
1982
+ assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
1983
+
1984
+ emulate_string_interpolation do
1985
+ assert_next_lexeme :tLPAREN, "(", EXPR_PAR, 1, 0
1986
+ assert_next_lexeme :tREGEXP_BEG, "/", EXPR_PAR, 1, 0
1987
+ assert_next_lexeme :tSTRING_CONTENT, "abcd", EXPR_PAR, 1, 0
1988
+ assert_next_lexeme :tREGEXP_END, "", EXPR_LIT, 1, 0
1989
+ assert_next_lexeme :tRPAREN, ")", EXPR_ENDFN, 0, 0
1990
+ end
1991
+
1992
+ assert_next_lexeme :tSTRING_CONTENT, " ", EXPR_BEG, 0, 0
1993
+ assert_next_lexeme :tSTRING_END, ")", EXPR_LIT, 0, 0
1994
+
1995
+ refute_lexeme
1996
+ end
1997
+
1998
+ def test_yylex_paren_string_parens_interpolated
1999
+ setup_lexer('%((#{b}#{d}))',
2000
+ s(:dstr,
2001
+ "(",
2002
+ s(:evstr, s(:call, nil, :b)),
2003
+ s(:evstr, s(:call, nil, :d)),
2004
+ s(:str, ")")))
2005
+
2006
+ assert_next_lexeme :tSTRING_BEG, "%)", EXPR_BEG, 0, 0
2007
+ assert_next_lexeme :tSTRING_CONTENT, "(", EXPR_BEG, 0, 0
2008
+ assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
2009
+
2010
+ emulate_string_interpolation do
2011
+ assert_next_lexeme :tIDENTIFIER, "b", EXPR_CMDARG, 0, 0
2012
+ end
2013
+
2014
+ assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
2015
+
2016
+ emulate_string_interpolation do
2017
+ assert_next_lexeme :tIDENTIFIER, "d", EXPR_CMDARG, 0, 0
2018
+ end
2019
+
2020
+ assert_next_lexeme :tSTRING_CONTENT, ")", EXPR_BEG, 0, 0
2021
+ assert_next_lexeme :tSTRING_END, ")", EXPR_LIT, 0, 0
2022
+
2023
+ refute_lexeme
2024
+ end
2025
+
2026
+ def test_yylex_paren_string_parens_interpolated_regexp
2027
+ setup_lexer('%((#{(/abcd/)}))',
2028
+ s(:dstr, "(", s(:evstr, s(:lit, /abcd/)), s(:str, ")")))
2029
+
2030
+ assert_next_lexeme :tSTRING_BEG, "%)", EXPR_BEG, 0, 0
2031
+ assert_next_lexeme :tSTRING_CONTENT, "(", EXPR_BEG, 0, 0
2032
+
2033
+ assert_next_lexeme :tSTRING_DBEG, nil, EXPR_BEG, 0, 0
2034
+
2035
+ emulate_string_interpolation do
2036
+ assert_next_lexeme :tLPAREN, "(", EXPR_PAR, 1, 0
2037
+ assert_next_lexeme :tREGEXP_BEG, "/", EXPR_PAR, 1, 0
2038
+ assert_next_lexeme :tSTRING_CONTENT, "abcd", EXPR_PAR, 1, 0
2039
+ assert_next_lexeme :tREGEXP_END, "", EXPR_LIT, 1, 0
2040
+ assert_next_lexeme :tRPAREN, ")", EXPR_ENDFN, 0, 0
2041
+ end
2042
+
2043
+ assert_next_lexeme :tSTRING_CONTENT, ")", EXPR_BEG, 0, 0
2044
+ assert_next_lexeme :tSTRING_END, ")", EXPR_LIT, 0, 0
2045
+
2046
+ refute_lexeme
2047
+ end
2048
+
1794
2049
  def test_yylex_percent
1795
2050
  assert_lex3("a % 2",
1796
2051
  nil,
1797
2052
  :tIDENTIFIER, "a", EXPR_CMDARG,
1798
2053
  :tPERCENT, "%", EXPR_BEG,
1799
- :tINTEGER, 2, EXPR_NUM)
2054
+ :tINTEGER, 2, EXPR_NUM)
1800
2055
  end
1801
2056
 
1802
2057
  def test_yylex_percent_equals
@@ -1804,15 +2059,15 @@ class TestRubyLexer < Minitest::Test
1804
2059
  nil,
1805
2060
  :tIDENTIFIER, "a", EXPR_CMDARG,
1806
2061
  :tOP_ASGN, "%", EXPR_BEG,
1807
- :tINTEGER, 2, EXPR_NUM)
2062
+ :tINTEGER, 2, EXPR_NUM)
1808
2063
  end
1809
2064
 
1810
2065
  def test_yylex_plus
1811
2066
  assert_lex3("1 + 1", # TODO lex_state?
1812
2067
  nil,
1813
- :tINTEGER, 1, EXPR_NUM,
2068
+ :tINTEGER, 1, EXPR_NUM,
1814
2069
  :tPLUS, "+", EXPR_BEG,
1815
- :tINTEGER, 1, EXPR_NUM)
2070
+ :tINTEGER, 1, EXPR_NUM)
1816
2071
  end
1817
2072
 
1818
2073
  def test_yylex_plus_equals
@@ -1831,55 +2086,28 @@ class TestRubyLexer < Minitest::Test
1831
2086
  assert_lex3("+@", nil, :tUPLUS, "+@", EXPR_ARG)
1832
2087
  end
1833
2088
 
1834
- def test_yylex_not_unary_method
1835
- self.lex_state = EXPR_FNAME
1836
-
1837
- assert_lex3("!@", nil, :tUBANG, "!@", EXPR_ARG)
2089
+ def test_yylex_plus_unary_number
2090
+ assert_lex3("+42", nil, :tINTEGER, 42, EXPR_NUM)
1838
2091
  end
1839
2092
 
1840
- def test_yylex_numbers
1841
- assert_lex3("0b10", nil, :tINTEGER, 2, EXPR_NUM)
1842
- assert_lex3("0B10", nil, :tINTEGER, 2, EXPR_NUM)
1843
-
1844
- assert_lex3("0d10", nil, :tINTEGER, 10, EXPR_NUM)
1845
- assert_lex3("0D10", nil, :tINTEGER, 10, EXPR_NUM)
1846
-
1847
- assert_lex3("0x10", nil, :tINTEGER, 16, EXPR_NUM)
1848
- assert_lex3("0X10", nil, :tINTEGER, 16, EXPR_NUM)
1849
-
1850
- assert_lex3("0o10", nil, :tINTEGER, 8, EXPR_NUM)
1851
- assert_lex3("0O10", nil, :tINTEGER, 8, EXPR_NUM)
1852
-
1853
- assert_lex3("0o", nil, :tINTEGER, 0, EXPR_NUM)
1854
- assert_lex3("0O", nil, :tINTEGER, 0, EXPR_NUM)
1855
-
1856
- assert_lex3("0", nil, :tINTEGER, 0, EXPR_NUM)
1857
-
1858
- refute_lex "0x"
1859
- refute_lex "0X"
1860
- refute_lex "0b"
1861
- refute_lex "0B"
1862
- refute_lex "0d"
1863
- refute_lex "0D"
2093
+ def test_yylex_question_bad_eos
2094
+ refute_lex "?"
2095
+ end
1864
2096
 
1865
- refute_lex "08"
1866
- refute_lex "09"
1867
- refute_lex "0o8"
1868
- refute_lex "0o9"
1869
- refute_lex "0O8"
1870
- refute_lex "0O9"
2097
+ def test_yylex_question_eh_a__20
2098
+ setup_lexer_class RubyParser::V20
1871
2099
 
1872
- refute_lex "1_e1"
1873
- refute_lex "1_.1"
1874
- refute_lex "1__1"
2100
+ assert_lex3("?a", nil, :tSTRING, "a", EXPR_END)
1875
2101
  end
1876
2102
 
1877
- def test_yylex_plus_unary_number
1878
- assert_lex3("+42", nil, :tINTEGER, 42, EXPR_NUM)
2103
+ def test_yylex_question_eh_escape_M_escape_C__20
2104
+ setup_lexer_class RubyParser::V20
2105
+
2106
+ assert_lex3("?\\M-\\C-a", nil, :tSTRING, "\M-\C-a", EXPR_END)
1879
2107
  end
1880
2108
 
1881
- def test_yylex_question_bad_eos
1882
- refute_lex "?"
2109
+ def test_yylex_question_control_escape
2110
+ assert_lex3('?\C-\]', nil, :tSTRING, ?\C-\], EXPR_END)
1883
2111
  end
1884
2112
 
1885
2113
  def test_yylex_question_ws
@@ -1903,11 +2131,11 @@ class TestRubyLexer < Minitest::Test
1903
2131
  end
1904
2132
 
1905
2133
  def test_yylex_rbracket
1906
- assert_lex3("]", nil, :tRBRACK, "]", EXPR_ENDARG)
2134
+ assert_lex3("]", nil, :tRBRACK, "]", EXPR_END)
1907
2135
  end
1908
2136
 
1909
2137
  def test_yylex_rcurly
1910
- assert_lex("}", nil, :tRCURLY, "}", EXPR_ENDARG, 0, 1) do
2138
+ assert_lex("}", nil, :tRCURLY, "}", EXPR_END, 0, 1) do
1911
2139
  lexer.brace_nest += 2
1912
2140
  end
1913
2141
  end
@@ -1917,7 +2145,7 @@ class TestRubyLexer < Minitest::Test
1917
2145
  nil,
1918
2146
  :tREGEXP_BEG, "/", EXPR_BEG,
1919
2147
  :tSTRING_CONTENT, "regexp", EXPR_BEG,
1920
- :tREGEXP_END, "", EXPR_END)
2148
+ :tREGEXP_END, "", EXPR_LIT)
1921
2149
  end
1922
2150
 
1923
2151
  def test_yylex_regexp_ambiguous
@@ -1926,7 +2154,7 @@ class TestRubyLexer < Minitest::Test
1926
2154
  :tIDENTIFIER, "method", EXPR_CMDARG,
1927
2155
  :tREGEXP_BEG, "/", EXPR_CMDARG,
1928
2156
  :tSTRING_CONTENT, "regexp", EXPR_CMDARG,
1929
- :tREGEXP_END, "", EXPR_END)
2157
+ :tREGEXP_END, "", EXPR_LIT)
1930
2158
  end
1931
2159
 
1932
2160
  def test_yylex_regexp_bad
@@ -1940,7 +2168,7 @@ class TestRubyLexer < Minitest::Test
1940
2168
  nil,
1941
2169
  :tREGEXP_BEG, "/", EXPR_BEG,
1942
2170
  :tSTRING_CONTENT, "regex\\C-x", EXPR_BEG,
1943
- :tREGEXP_END, "", EXPR_END)
2171
+ :tREGEXP_END, "", EXPR_LIT)
1944
2172
  end
1945
2173
 
1946
2174
  def test_yylex_regexp_escape_C_M
@@ -1948,7 +2176,7 @@ class TestRubyLexer < Minitest::Test
1948
2176
  nil,
1949
2177
  :tREGEXP_BEG, "/", EXPR_BEG,
1950
2178
  :tSTRING_CONTENT, "regex\\C-\\M-x", EXPR_BEG,
1951
- :tREGEXP_END, "", EXPR_END)
2179
+ :tREGEXP_END, "", EXPR_LIT)
1952
2180
  end
1953
2181
 
1954
2182
  def test_yylex_regexp_escape_C_M_craaaazy
@@ -1956,7 +2184,7 @@ class TestRubyLexer < Minitest::Test
1956
2184
  nil,
1957
2185
  :tREGEXP_BEG, "/", EXPR_BEG,
1958
2186
  :tSTRING_CONTENT, "regex\\C-\\M-x", EXPR_BEG,
1959
- :tREGEXP_END, "", EXPR_END)
2187
+ :tREGEXP_END, "", EXPR_LIT)
1960
2188
  end
1961
2189
 
1962
2190
  def test_yylex_regexp_escape_C_bad_dash
@@ -1984,7 +2212,7 @@ class TestRubyLexer < Minitest::Test
1984
2212
  nil,
1985
2213
  :tREGEXP_BEG, "/", EXPR_BEG,
1986
2214
  :tSTRING_CONTENT, "regex\\M-x", EXPR_BEG,
1987
- :tREGEXP_END, "", EXPR_END)
2215
+ :tREGEXP_END, "", EXPR_LIT)
1988
2216
  end
1989
2217
 
1990
2218
  def test_yylex_regexp_escape_M_C
@@ -1992,7 +2220,7 @@ class TestRubyLexer < Minitest::Test
1992
2220
  nil,
1993
2221
  :tREGEXP_BEG, "/", EXPR_BEG,
1994
2222
  :tSTRING_CONTENT, "regex\\M-\\C-x", EXPR_BEG,
1995
- :tREGEXP_END, "", EXPR_END)
2223
+ :tREGEXP_END, "", EXPR_LIT)
1996
2224
  end
1997
2225
 
1998
2226
  def test_yylex_regexp_escape_M_bad_dash
@@ -2016,7 +2244,7 @@ class TestRubyLexer < Minitest::Test
2016
2244
  nil,
2017
2245
  :tREGEXP_BEG, "/", EXPR_BEG,
2018
2246
  :tSTRING_CONTENT, "\\/", EXPR_BEG,
2019
- :tREGEXP_END, "", EXPR_END)
2247
+ :tREGEXP_END, "", EXPR_LIT)
2020
2248
  end
2021
2249
 
2022
2250
  def test_yylex_regexp_escape_backslash_terminator
@@ -2024,15 +2252,7 @@ class TestRubyLexer < Minitest::Test
2024
2252
  nil,
2025
2253
  :tREGEXP_BEG, "%r\000", EXPR_BEG,
2026
2254
  :tSTRING_CONTENT, "blah\\%blah", EXPR_BEG,
2027
- :tREGEXP_END, "", EXPR_END)
2028
- end
2029
-
2030
- def test_yylex_regexp_escaped_delim
2031
- assert_lex3("%r!blah(?\\!blah)!",
2032
- nil,
2033
- :tREGEXP_BEG, "%r\000", EXPR_BEG,
2034
- :tSTRING_CONTENT, "blah(?!blah)", EXPR_BEG,
2035
- :tREGEXP_END, "", EXPR_END)
2255
+ :tREGEXP_END, "", EXPR_LIT)
2036
2256
  end
2037
2257
 
2038
2258
  def test_yylex_regexp_escape_backslash_terminator_meta1
@@ -2040,7 +2260,7 @@ class TestRubyLexer < Minitest::Test
2040
2260
  nil,
2041
2261
  :tREGEXP_BEG, "%r{", EXPR_BEG, # FIX ?!?
2042
2262
  :tSTRING_CONTENT, "blah\\}blah", EXPR_BEG,
2043
- :tREGEXP_END, "", EXPR_END)
2263
+ :tREGEXP_END, "", EXPR_LIT)
2044
2264
  end
2045
2265
 
2046
2266
  def test_yylex_regexp_escape_backslash_terminator_meta2
@@ -2048,7 +2268,7 @@ class TestRubyLexer < Minitest::Test
2048
2268
  nil,
2049
2269
  :tREGEXP_BEG, "%r\000", EXPR_BEG,
2050
2270
  :tSTRING_CONTENT, "blah\\/blah", EXPR_BEG,
2051
- :tREGEXP_END, "", EXPR_END)
2271
+ :tREGEXP_END, "", EXPR_LIT)
2052
2272
  end
2053
2273
 
2054
2274
  def test_yylex_regexp_escape_backslash_terminator_meta3
@@ -2056,7 +2276,7 @@ class TestRubyLexer < Minitest::Test
2056
2276
  nil,
2057
2277
  :tREGEXP_BEG, "%r\000", EXPR_BEG,
2058
2278
  :tSTRING_CONTENT, "blah\\%blah", EXPR_BEG,
2059
- :tREGEXP_END, "", EXPR_END)
2279
+ :tREGEXP_END, "", EXPR_LIT)
2060
2280
  end
2061
2281
 
2062
2282
  def test_yylex_regexp_escape_bad_eos
@@ -2068,7 +2288,7 @@ class TestRubyLexer < Minitest::Test
2068
2288
  nil,
2069
2289
  :tREGEXP_BEG, "/", EXPR_BEG,
2070
2290
  :tSTRING_CONTENT, "regex\\\\regex", EXPR_BEG,
2071
- :tREGEXP_END, "", EXPR_END)
2291
+ :tREGEXP_END, "", EXPR_LIT)
2072
2292
  end
2073
2293
 
2074
2294
  def test_yylex_regexp_escape_c
@@ -2076,7 +2296,7 @@ class TestRubyLexer < Minitest::Test
2076
2296
  nil,
2077
2297
  :tREGEXP_BEG, "/", EXPR_BEG,
2078
2298
  :tSTRING_CONTENT, "regex\\cxxx", EXPR_BEG,
2079
- :tREGEXP_END, "", EXPR_END)
2299
+ :tREGEXP_END, "", EXPR_LIT)
2080
2300
  end
2081
2301
 
2082
2302
  def test_yylex_regexp_escape_c_backslash
@@ -2084,7 +2304,7 @@ class TestRubyLexer < Minitest::Test
2084
2304
  nil,
2085
2305
  :tREGEXP_BEG, "/", EXPR_BEG,
2086
2306
  :tSTRING_CONTENT, "regex\\c\\n", EXPR_BEG,
2087
- :tREGEXP_END, "", EXPR_END)
2307
+ :tREGEXP_END, "", EXPR_LIT)
2088
2308
  end
2089
2309
 
2090
2310
  def test_yylex_regexp_escape_chars
@@ -2092,7 +2312,7 @@ class TestRubyLexer < Minitest::Test
2092
2312
  nil,
2093
2313
  :tREGEXP_BEG, "/", EXPR_BEG,
2094
2314
  :tSTRING_CONTENT, "re\\tge\\nxp", EXPR_BEG,
2095
- :tREGEXP_END, "", EXPR_END)
2315
+ :tREGEXP_END, "", EXPR_LIT)
2096
2316
  end
2097
2317
 
2098
2318
  def test_yylex_regexp_escape_double_backslash
@@ -2101,7 +2321,7 @@ class TestRubyLexer < Minitest::Test
2101
2321
  nil,
2102
2322
  :tREGEXP_BEG, "/", EXPR_BEG,
2103
2323
  :tSTRING_CONTENT, "[\\/\\\\]$", EXPR_BEG,
2104
- :tREGEXP_END, "", EXPR_END)
2324
+ :tREGEXP_END, "", EXPR_LIT)
2105
2325
  end
2106
2326
 
2107
2327
  def test_yylex_regexp_escape_hex
@@ -2109,7 +2329,7 @@ class TestRubyLexer < Minitest::Test
2109
2329
  nil,
2110
2330
  :tREGEXP_BEG, "/", EXPR_BEG,
2111
2331
  :tSTRING_CONTENT, "regex\\x61xp", EXPR_BEG,
2112
- :tREGEXP_END, "", EXPR_END)
2332
+ :tREGEXP_END, "", EXPR_LIT)
2113
2333
  end
2114
2334
 
2115
2335
  def test_yylex_regexp_escape_hex_bad
@@ -2121,7 +2341,7 @@ class TestRubyLexer < Minitest::Test
2121
2341
  nil,
2122
2342
  :tREGEXP_BEG, "/", EXPR_BEG,
2123
2343
  :tSTRING_CONTENT, "^[\\xd\\xa]{2}", EXPR_BEG,
2124
- :tREGEXP_END, "on", EXPR_END)
2344
+ :tREGEXP_END, "on", EXPR_LIT)
2125
2345
  end
2126
2346
 
2127
2347
  def test_yylex_regexp_escape_oct1
@@ -2129,7 +2349,7 @@ class TestRubyLexer < Minitest::Test
2129
2349
  nil,
2130
2350
  :tREGEXP_BEG, "/", EXPR_BEG,
2131
2351
  :tSTRING_CONTENT, "regex\\0xp", EXPR_BEG,
2132
- :tREGEXP_END, "", EXPR_END)
2352
+ :tREGEXP_END, "", EXPR_LIT)
2133
2353
  end
2134
2354
 
2135
2355
  def test_yylex_regexp_escape_oct2
@@ -2137,7 +2357,7 @@ class TestRubyLexer < Minitest::Test
2137
2357
  nil,
2138
2358
  :tREGEXP_BEG, "/", EXPR_BEG,
2139
2359
  :tSTRING_CONTENT, "regex\\07xp", EXPR_BEG,
2140
- :tREGEXP_END, "", EXPR_END)
2360
+ :tREGEXP_END, "", EXPR_LIT)
2141
2361
  end
2142
2362
 
2143
2363
  def test_yylex_regexp_escape_oct3
@@ -2145,7 +2365,7 @@ class TestRubyLexer < Minitest::Test
2145
2365
  nil,
2146
2366
  :tREGEXP_BEG, "/", EXPR_BEG,
2147
2367
  :tSTRING_CONTENT, "regex\\10142", EXPR_BEG,
2148
- :tREGEXP_END, "", EXPR_END)
2368
+ :tREGEXP_END, "", EXPR_LIT)
2149
2369
  end
2150
2370
 
2151
2371
  def test_yylex_regexp_escape_return
@@ -2153,7 +2373,15 @@ class TestRubyLexer < Minitest::Test
2153
2373
  nil,
2154
2374
  :tREGEXP_BEG, "/", EXPR_BEG,
2155
2375
  :tSTRING_CONTENT, "regexregex", EXPR_BEG,
2156
- :tREGEXP_END, "", EXPR_END)
2376
+ :tREGEXP_END, "", EXPR_LIT)
2377
+ end
2378
+
2379
+ def test_yylex_regexp_escaped_delim
2380
+ assert_lex3("%r!blah(?\\!blah)!",
2381
+ nil,
2382
+ :tREGEXP_BEG, "%r\000", EXPR_BEG,
2383
+ :tSTRING_CONTENT, "blah(?!blah)", EXPR_BEG,
2384
+ :tREGEXP_END, "", EXPR_LIT)
2157
2385
  end
2158
2386
 
2159
2387
  def test_yylex_regexp_nm
@@ -2161,7 +2389,20 @@ class TestRubyLexer < Minitest::Test
2161
2389
  nil,
2162
2390
  :tREGEXP_BEG, "/", EXPR_BEG,
2163
2391
  :tSTRING_CONTENT, ".*", EXPR_BEG,
2164
- :tREGEXP_END, "nm", EXPR_END)
2392
+ :tREGEXP_END, "nm", EXPR_LIT)
2393
+ end
2394
+
2395
+ def test_yylex_required_kwarg_no_value_22
2396
+ setup_lexer_class RubyParser::V22
2397
+
2398
+ assert_lex3("def foo a:, b:\nend",
2399
+ nil,
2400
+ :kDEF, "def", EXPR_FNAME,
2401
+ :tIDENTIFIER, "foo", EXPR_ENDFN,
2402
+ :tLABEL, "a", EXPR_LAB,
2403
+ :tCOMMA, ",", EXPR_PAR,
2404
+ :tLABEL, "b", EXPR_LAB,
2405
+ :kEND, "end", EXPR_END)
2165
2406
  end
2166
2407
 
2167
2408
  def test_yylex_rparen
@@ -2173,7 +2414,7 @@ class TestRubyLexer < Minitest::Test
2173
2414
  nil,
2174
2415
  :tIDENTIFIER, "a", EXPR_CMDARG,
2175
2416
  :tRSHFT, ">>", EXPR_BEG,
2176
- :tINTEGER, 2, EXPR_NUM)
2417
+ :tINTEGER, 2, EXPR_NUM)
2177
2418
  end
2178
2419
 
2179
2420
  def test_yylex_rshft_equals
@@ -2181,7 +2422,7 @@ class TestRubyLexer < Minitest::Test
2181
2422
  nil,
2182
2423
  :tIDENTIFIER, "a", EXPR_CMDARG,
2183
2424
  :tOP_ASGN, ">>", EXPR_BEG,
2184
- :tINTEGER, 2, EXPR_NUM)
2425
+ :tINTEGER, 2, EXPR_NUM)
2185
2426
  end
2186
2427
 
2187
2428
  def test_yylex_star
@@ -2249,11 +2490,11 @@ class TestRubyLexer < Minitest::Test
2249
2490
  end
2250
2491
 
2251
2492
  def test_yylex_string_bad_eos
2252
- refute_lex('%', :tSTRING_BEG, '%')
2493
+ refute_lex("%", :tSTRING_BEG, "%")
2253
2494
  end
2254
2495
 
2255
2496
  def test_yylex_string_bad_eos_quote
2256
- refute_lex('%{nest', :tSTRING_BEG, '%}')
2497
+ refute_lex("%{nest", :tSTRING_BEG, "%}")
2257
2498
  end
2258
2499
 
2259
2500
  def test_yylex_string_double
@@ -2269,7 +2510,7 @@ class TestRubyLexer < Minitest::Test
2269
2510
  nil,
2270
2511
  :tSTRING_BEG, "\"", EXPR_BEG,
2271
2512
  :tSTRING_CONTENT, "\034", EXPR_BEG,
2272
- :tSTRING_END, "\"", EXPR_END)
2513
+ :tSTRING_END, "\"", EXPR_LIT)
2273
2514
  end
2274
2515
 
2275
2516
  def test_yylex_string_double_escape_C_escape
@@ -2277,106 +2518,25 @@ class TestRubyLexer < Minitest::Test
2277
2518
  nil,
2278
2519
  :tSTRING_BEG, "\"", EXPR_BEG,
2279
2520
  :tSTRING_CONTENT, "\201", EXPR_BEG,
2280
- :tSTRING_END, "\"", EXPR_END)
2521
+ :tSTRING_END, "\"", EXPR_LIT)
2281
2522
  end
2282
2523
 
2283
2524
  def test_yylex_string_double_escape_C_question
2284
2525
  assert_lex3("\"\\C-?\"", nil, :tSTRING, "\177", EXPR_END)
2285
2526
  end
2286
2527
 
2287
- def test_yylex_string_utf8_simple
2288
- chr = [0x3024].pack("U")
2289
-
2290
- assert_lex3('"\u{3024}"',
2291
- s(:str, chr),
2292
- :tSTRING, chr, EXPR_END)
2293
- end
2294
-
2295
- def test_yylex_string_utf8_trailing_hex
2296
- chr = [0x3024].pack("U")
2297
- str = "#{chr}abz"
2298
-
2299
- assert_lex3('"\u3024abz"',
2300
- s(:str, str),
2301
- :tSTRING, str, EXPR_END)
2302
- end
2303
-
2304
- def test_yylex_string_utf8_missing_hex
2305
- refute_lex('"\u3zzz"')
2306
- refute_lex('"\u30zzz"')
2307
- refute_lex('"\u302zzz"')
2308
- end
2309
-
2310
- def test_yylex_string_utf8_complex
2311
- chr = [0x3024].pack("U")
2312
-
2313
- assert_lex3('"#@a\u{3024}"',
2314
- s(:dstr, "", s(:evstr, s(:ivar, :@a)), s(:str, chr)),
2315
- :tSTRING_BEG, '"', EXPR_BEG,
2316
- :tSTRING_DVAR, nil, EXPR_BEG,
2317
- :tSTRING_CONTENT, "@a"+chr, EXPR_BEG,
2318
- :tSTRING_END, '"', EXPR_END)
2319
- end
2320
-
2321
- def test_yylex_string_utf8_complex_trailing_hex
2322
- chr = [0x3024].pack("U")
2323
- str = "#{chr}abz"
2324
-
2325
- assert_lex3('"#@a\u3024abz"',
2326
- s(:dstr, "", s(:evstr, s(:ivar, :@a)), s(:str, str)),
2327
- :tSTRING_BEG, '"', EXPR_BEG,
2328
- :tSTRING_DVAR, nil, EXPR_BEG,
2329
- :tSTRING_CONTENT, "@a"+str, EXPR_BEG,
2330
- :tSTRING_END, '"', EXPR_END)
2331
- end
2332
-
2333
- def test_yylex_string_utf8_complex_missing_hex
2334
- chr = [0x302].pack("U")
2335
- str = "#{chr}zzz"
2336
-
2337
- refute_lex('"#@a\u302zzz"',
2338
- :tSTRING_BEG, '"',
2339
- :tSTRING_DVAR, nil,
2340
- :tSTRING_CONTENT, "@a"+str,
2341
- :tSTRING_END, '"')
2342
-
2343
- chr = [0x30].pack("U")
2344
- str = "#{chr}zzz"
2345
-
2346
- refute_lex('"#@a\u30zzz"',
2347
- :tSTRING_BEG, '"',
2348
- :tSTRING_DVAR, nil,
2349
- :tSTRING_CONTENT, "@a"+str,
2350
- :tSTRING_END, '"')
2351
-
2352
- chr = [0x3].pack("U")
2353
- str = "#{chr}zzz"
2354
-
2355
- refute_lex('"#@a\u3zzz"',
2356
- :tSTRING_BEG, '"',
2357
- :tSTRING_DVAR, nil,
2358
- :tSTRING_CONTENT, "@a"+str,
2359
- :tSTRING_END, '"')
2360
- end
2361
-
2362
2528
  def test_yylex_string_double_escape_M
2363
2529
  chr = "\341"
2364
2530
 
2365
2531
  assert_lex3("\"\\M-a\"", nil, :tSTRING, chr, EXPR_END)
2366
2532
  end
2367
2533
 
2368
- def test_why_does_ruby_hate_me?
2369
- assert_lex3("\"Nl%\\000\\000A\\000\\999\"", # you should be ashamed
2370
- nil,
2371
- :tSTRING, ["Nl%","\x00","\x00","A","\x00","999"].join, EXPR_END)
2372
- end
2373
-
2374
2534
  def test_yylex_string_double_escape_M_backslash
2375
2535
  assert_lex3("\"\\M-\\\\\"",
2376
2536
  nil,
2377
2537
  :tSTRING_BEG, "\"", EXPR_BEG,
2378
2538
  :tSTRING_CONTENT, "\334", EXPR_BEG,
2379
- :tSTRING_END, "\"", EXPR_END)
2539
+ :tSTRING_END, "\"", EXPR_LIT)
2380
2540
  end
2381
2541
 
2382
2542
  def test_yylex_string_double_escape_M_escape
@@ -2384,7 +2544,7 @@ class TestRubyLexer < Minitest::Test
2384
2544
  nil,
2385
2545
  :tSTRING_BEG, "\"", EXPR_BEG,
2386
2546
  :tSTRING_CONTENT, "\201", EXPR_BEG,
2387
- :tSTRING_END, "\"", EXPR_END)
2547
+ :tSTRING_END, "\"", EXPR_LIT)
2388
2548
  end
2389
2549
 
2390
2550
  def test_yylex_string_double_escape_bs1
@@ -2400,11 +2560,7 @@ class TestRubyLexer < Minitest::Test
2400
2560
  end
2401
2561
 
2402
2562
  def test_yylex_string_double_escape_c_backslash
2403
- assert_lex3("\"\\c\\\"",
2404
- nil,
2405
- :tSTRING_BEG, "\"", EXPR_BEG,
2406
- :tSTRING_CONTENT, "\034", EXPR_BEG,
2407
- :tSTRING_END, "\"", EXPR_END)
2563
+ refute_lex("\"\\c\\\"", :tSTRING_BEG, '"')
2408
2564
  end
2409
2565
 
2410
2566
  def test_yylex_string_double_escape_c_escape
@@ -2412,7 +2568,7 @@ class TestRubyLexer < Minitest::Test
2412
2568
  nil,
2413
2569
  :tSTRING_BEG, "\"", EXPR_BEG,
2414
2570
  :tSTRING_CONTENT, "\201", EXPR_BEG,
2415
- :tSTRING_END, "\"", EXPR_END)
2571
+ :tSTRING_END, "\"", EXPR_LIT)
2416
2572
  end
2417
2573
 
2418
2574
  def test_yylex_string_double_escape_c_question
@@ -2446,15 +2602,7 @@ class TestRubyLexer < Minitest::Test
2446
2602
  :tSTRING_CONTENT, "$b c ", EXPR_BEG,
2447
2603
  :tSTRING_DBEG, nil, EXPR_BEG,
2448
2604
  :tSTRING_CONTENT, "3} # ", EXPR_BEG,
2449
- :tSTRING_END, "\"", EXPR_END)
2450
- end
2451
-
2452
- def test_yylex_string_double_pound_dollar_bad
2453
- assert_lex3('"#$%"', nil,
2454
-
2455
- :tSTRING_BEG, "\"", EXPR_BEG,
2456
- :tSTRING_CONTENT, '#$%', EXPR_BEG,
2457
- :tSTRING_END, "\"", EXPR_END)
2605
+ :tSTRING_END, "\"", EXPR_LIT)
2458
2606
  end
2459
2607
 
2460
2608
  def test_yylex_string_double_nested_curlies
@@ -2462,7 +2610,7 @@ class TestRubyLexer < Minitest::Test
2462
2610
  nil,
2463
2611
  :tSTRING_BEG, "%}", EXPR_BEG,
2464
2612
  :tSTRING_CONTENT, "nest{one{two}one}nest", EXPR_BEG,
2465
- :tSTRING_END, "}", EXPR_END)
2613
+ :tSTRING_END, "}", EXPR_LIT)
2466
2614
  end
2467
2615
 
2468
2616
  def test_yylex_string_double_no_interp
@@ -2470,25 +2618,33 @@ class TestRubyLexer < Minitest::Test
2470
2618
  assert_lex3("\"blah # blah\"", nil, :tSTRING, "blah # blah", EXPR_END)
2471
2619
  end
2472
2620
 
2621
+ def test_yylex_string_double_pound_dollar_bad
2622
+ assert_lex3('"#$%"', nil,
2623
+
2624
+ :tSTRING_BEG, "\"", EXPR_BEG,
2625
+ :tSTRING_CONTENT, "#\$%", EXPR_BEG,
2626
+ :tSTRING_END, "\"", EXPR_LIT)
2627
+ end
2628
+
2473
2629
  def test_yylex_string_escape_x_single
2474
2630
  assert_lex3("\"\\x0\"", nil, :tSTRING, "\000", EXPR_END)
2475
2631
  end
2476
2632
 
2477
- def test_yylex_string_pct_i
2478
- assert_lex3("%i[s1 s2\ns3]",
2633
+ def test_yylex_string_pct_I
2634
+ assert_lex3("%I[s1 s2\ns3]",
2479
2635
  nil,
2480
- :tQSYMBOLS_BEG, "%i[", EXPR_BEG,
2636
+ :tSYMBOLS_BEG, "%I[", EXPR_BEG,
2481
2637
  :tSTRING_CONTENT, "s1", EXPR_BEG,
2482
2638
  :tSPACE, nil, EXPR_BEG,
2483
2639
  :tSTRING_CONTENT, "s2", EXPR_BEG,
2484
2640
  :tSPACE, nil, EXPR_BEG,
2485
2641
  :tSTRING_CONTENT, "s3", EXPR_BEG,
2486
2642
  :tSPACE, nil, EXPR_BEG,
2487
- :tSTRING_END, nil, EXPR_END)
2643
+ :tSTRING_END, nil, EXPR_LIT)
2488
2644
  end
2489
2645
 
2490
- def test_yylex_string_pct_I
2491
- assert_lex3("%I[s1 s2\ns3]",
2646
+ def test_yylex_string_pct_I_extra_space
2647
+ assert_lex3("%I[ s1 s2\ns3 ]",
2492
2648
  nil,
2493
2649
  :tSYMBOLS_BEG, "%I[", EXPR_BEG,
2494
2650
  :tSTRING_CONTENT, "s1", EXPR_BEG,
@@ -2497,11 +2653,67 @@ class TestRubyLexer < Minitest::Test
2497
2653
  :tSPACE, nil, EXPR_BEG,
2498
2654
  :tSTRING_CONTENT, "s3", EXPR_BEG,
2499
2655
  :tSPACE, nil, EXPR_BEG,
2500
- :tSTRING_END, nil, EXPR_END)
2656
+ :tSTRING_END, nil, EXPR_LIT)
2501
2657
  end
2502
2658
 
2503
- def test_yylex_string_pct_i_extra_space
2504
- assert_lex3("%i[ s1 s2\ns3 ]",
2659
+ def test_yylex_string_pct_Q
2660
+ assert_lex3("%Q[s1 s2]",
2661
+ nil,
2662
+ :tSTRING_BEG, "%Q[", EXPR_BEG,
2663
+ :tSTRING_CONTENT, "s1 s2", EXPR_BEG,
2664
+ :tSTRING_END, "]", EXPR_LIT)
2665
+ end
2666
+
2667
+ def test_yylex_string_pct_Q_null_wtf?
2668
+ assert_lex3("%Q\0s1 s2\0",
2669
+ nil,
2670
+ :tSTRING_BEG, "%Q\0", EXPR_BEG,
2671
+ :tSTRING_CONTENT, "s1 s2", EXPR_BEG,
2672
+ :tSTRING_END, "\0", EXPR_LIT)
2673
+ end
2674
+
2675
+ def test_yylex_string_pct_Q_bang
2676
+ assert_lex3("%Q!s1 s2!",
2677
+ nil,
2678
+ :tSTRING_BEG, "%Q\0", EXPR_BEG,
2679
+ :tSTRING_CONTENT, "s1 s2", EXPR_BEG,
2680
+ :tSTRING_END, "!", EXPR_LIT)
2681
+ end
2682
+
2683
+ def test_yylex_string_pct_W
2684
+ assert_lex3("%W[s1 s2\ns3]", # TODO: add interpolation to these
2685
+ nil,
2686
+ :tWORDS_BEG, "%W[", EXPR_BEG,
2687
+ :tSTRING_CONTENT, "s1", EXPR_BEG,
2688
+ :tSPACE, nil, EXPR_BEG,
2689
+ :tSTRING_CONTENT, "s2", EXPR_BEG,
2690
+ :tSPACE, nil, EXPR_BEG,
2691
+ :tSTRING_CONTENT, "s3", EXPR_BEG,
2692
+ :tSPACE, nil, EXPR_BEG,
2693
+ :tSTRING_END, nil, EXPR_LIT)
2694
+ end
2695
+
2696
+ def test_yylex_string_pct_W_bs_nl
2697
+ assert_lex3("%W[s1 \\\ns2]", # TODO: add interpolation to these
2698
+ nil,
2699
+ :tWORDS_BEG, "%W[", EXPR_BEG,
2700
+ :tSTRING_CONTENT, "s1", EXPR_BEG,
2701
+ :tSPACE, nil, EXPR_BEG,
2702
+ :tSTRING_CONTENT, "\ns2", EXPR_BEG,
2703
+ :tSPACE, nil, EXPR_BEG,
2704
+ :tSTRING_END, nil, EXPR_LIT)
2705
+ end
2706
+
2707
+ def test_yylex_string_pct_angle
2708
+ assert_lex3("%<blah>",
2709
+ nil,
2710
+ :tSTRING_BEG, "%>", EXPR_BEG,
2711
+ :tSTRING_CONTENT, "blah", EXPR_BEG,
2712
+ :tSTRING_END, ">", EXPR_LIT)
2713
+ end
2714
+
2715
+ def test_yylex_string_pct_i
2716
+ assert_lex3("%i[s1 s2\ns3]",
2505
2717
  nil,
2506
2718
  :tQSYMBOLS_BEG, "%i[", EXPR_BEG,
2507
2719
  :tSTRING_CONTENT, "s1", EXPR_BEG,
@@ -2510,36 +2722,36 @@ class TestRubyLexer < Minitest::Test
2510
2722
  :tSPACE, nil, EXPR_BEG,
2511
2723
  :tSTRING_CONTENT, "s3", EXPR_BEG,
2512
2724
  :tSPACE, nil, EXPR_BEG,
2513
- :tSTRING_END, nil, EXPR_END)
2725
+ :tSTRING_END, nil, EXPR_LIT)
2514
2726
  end
2515
2727
 
2516
- def test_yylex_string_pct_I_extra_space
2517
- assert_lex3("%I[ s1 s2\ns3 ]",
2728
+ def test_yylex_string_pct_i_extra_space
2729
+ assert_lex3("%i[ s1 s2\ns3 ]",
2518
2730
  nil,
2519
- :tSYMBOLS_BEG, "%I[", EXPR_BEG,
2731
+ :tQSYMBOLS_BEG, "%i[", EXPR_BEG,
2520
2732
  :tSTRING_CONTENT, "s1", EXPR_BEG,
2521
2733
  :tSPACE, nil, EXPR_BEG,
2522
2734
  :tSTRING_CONTENT, "s2", EXPR_BEG,
2523
2735
  :tSPACE, nil, EXPR_BEG,
2524
2736
  :tSTRING_CONTENT, "s3", EXPR_BEG,
2525
2737
  :tSPACE, nil, EXPR_BEG,
2526
- :tSTRING_END, nil, EXPR_END)
2738
+ :tSTRING_END, nil, EXPR_LIT)
2527
2739
  end
2528
2740
 
2529
- def test_yylex_string_pct_q
2530
- assert_lex3("%q[s1 s2]",
2741
+ def test_yylex_string_pct_other
2742
+ assert_lex3("%%blah%",
2531
2743
  nil,
2532
- :tSTRING_BEG, "%q[", EXPR_BEG,
2533
- :tSTRING_CONTENT, "s1 s2", EXPR_BEG,
2534
- :tSTRING_END, "]", EXPR_END)
2744
+ :tSTRING_BEG, "%%", EXPR_BEG,
2745
+ :tSTRING_CONTENT, "blah", EXPR_BEG,
2746
+ :tSTRING_END, "%", EXPR_LIT)
2535
2747
  end
2536
2748
 
2537
- def test_yylex_string_pct_Q
2538
- assert_lex3("%Q[s1 s2]",
2749
+ def test_yylex_string_pct_q
2750
+ assert_lex3("%q[s1 s2]",
2539
2751
  nil,
2540
- :tSTRING_BEG, "%Q[", EXPR_BEG,
2752
+ :tSTRING_BEG, "%q[", EXPR_BEG,
2541
2753
  :tSTRING_CONTENT, "s1 s2", EXPR_BEG,
2542
- :tSTRING_END, "]", EXPR_END)
2754
+ :tSTRING_END, "]", EXPR_LIT)
2543
2755
  end
2544
2756
 
2545
2757
  def test_yylex_string_pct_s
@@ -2547,109 +2759,160 @@ class TestRubyLexer < Minitest::Test
2547
2759
  nil,
2548
2760
  :tSYMBEG, "%s[", EXPR_FNAME, # TODO: :tSYM_BEG ?
2549
2761
  :tSTRING_CONTENT, "s1 s2", EXPR_FNAME, # man... I don't like this
2550
- :tSTRING_END, "]", EXPR_END)
2762
+ :tSTRING_END, "]", EXPR_LIT)
2551
2763
  end
2552
2764
 
2553
- def test_yylex_string_pct_W
2554
- assert_lex3("%W[s1 s2\ns3]", # TODO: add interpolation to these
2555
- nil,
2556
- :tWORDS_BEG, "%W[", EXPR_BEG,
2557
- :tSTRING_CONTENT, "s1", EXPR_BEG,
2558
- :tSPACE, nil, EXPR_BEG,
2559
- :tSTRING_CONTENT, "s2", EXPR_BEG,
2560
- :tSPACE, nil, EXPR_BEG,
2561
- :tSTRING_CONTENT, "s3", EXPR_BEG,
2562
- :tSPACE, nil, EXPR_BEG,
2563
- :tSTRING_END, nil, EXPR_END)
2765
+ def test_yylex_string_pct_w
2766
+ refute_lex("%w[s1 s2 ",
2767
+ :tQWORDS_BEG, "%w[",
2768
+ :tSTRING_CONTENT, "s1",
2769
+ :tSPACE, nil,
2770
+ :tSTRING_CONTENT, "s2",
2771
+ :tSPACE, nil)
2564
2772
  end
2565
2773
 
2566
- def test_yylex_string_pct_W_bs_nl
2567
- assert_lex3("%W[s1 \\\ns2]", # TODO: add interpolation to these
2774
+ def test_yylex_string_pct_w_bs_nl
2775
+ assert_lex3("%w[s1 \\\ns2]",
2568
2776
  nil,
2569
- :tWORDS_BEG, "%W[", EXPR_BEG,
2777
+ :tQWORDS_BEG, "%w[", EXPR_BEG,
2570
2778
  :tSTRING_CONTENT, "s1", EXPR_BEG,
2571
2779
  :tSPACE, nil, EXPR_BEG,
2572
2780
  :tSTRING_CONTENT, "\ns2", EXPR_BEG,
2573
2781
  :tSPACE, nil, EXPR_BEG,
2574
- :tSTRING_END, nil, EXPR_END)
2782
+ :tSTRING_END, nil, EXPR_LIT)
2783
+ end
2784
+
2785
+ def test_yylex_string_pct_w_bs_sp
2786
+ assert_lex3("%w[s\\ 1 s\\ 2]",
2787
+ nil,
2788
+ :tQWORDS_BEG, "%w[", EXPR_BEG,
2789
+ :tSTRING_CONTENT, "s 1", EXPR_BEG,
2790
+ :tSPACE, nil, EXPR_BEG,
2791
+ :tSTRING_CONTENT, "s 2", EXPR_BEG,
2792
+ :tSPACE, nil, EXPR_BEG,
2793
+ :tSTRING_END, nil, EXPR_LIT)
2794
+ end
2795
+
2796
+ def test_yylex_string_single
2797
+ assert_lex3("'string'", nil, :tSTRING, "string", EXPR_END)
2798
+ end
2799
+
2800
+ def test_yylex_string_single_escape_chars
2801
+ assert_lex3("'s\\tri\\ng'", nil, :tSTRING, "s\\tri\\ng", EXPR_END)
2802
+ end
2803
+
2804
+ def test_yylex_string_single_escape_quote_and_backslash
2805
+ assert_lex3(":'foo\\'bar\\\\baz'", nil, :tSYMBOL, "foo'bar\\baz",
2806
+ EXPR_LIT)
2807
+ end
2808
+
2809
+ def test_yylex_string_single_escaped_quote
2810
+ assert_lex3("'foo\\'bar'", nil, :tSTRING, "foo'bar", EXPR_END)
2811
+ end
2812
+
2813
+ def test_yylex_string_single_nl
2814
+ assert_lex3("'blah\\\nblah'", nil, :tSTRING, "blah\\\nblah", EXPR_END)
2815
+ end
2816
+
2817
+ def test_yylex_string_utf8_complex
2818
+ chr = [0x3024].pack("U")
2819
+
2820
+ assert_lex3('"#@a\u{3024}"',
2821
+ s(:dstr, "", s(:evstr, s(:ivar, :@a)), s(:str, chr)),
2822
+ :tSTRING_BEG, '"', EXPR_BEG,
2823
+ :tSTRING_DVAR, nil, EXPR_BEG,
2824
+ :tSTRING_CONTENT, "@a"+chr, EXPR_BEG,
2825
+ :tSTRING_END, '"', EXPR_LIT)
2575
2826
  end
2576
2827
 
2577
- def test_yylex_string_pct_angle
2578
- assert_lex3("%<blah>",
2579
- nil,
2580
- :tSTRING_BEG, "%>", EXPR_BEG,
2581
- :tSTRING_CONTENT, "blah", EXPR_BEG,
2582
- :tSTRING_END, ">", EXPR_END)
2828
+ def test_yylex_string_utf8_complex_missing_hex
2829
+ chr = [0x302].pack("U")
2830
+ str = "#{chr}zzz"
2831
+
2832
+ refute_lex('"#@a\u302zzz"',
2833
+ :tSTRING_BEG, '"',
2834
+ :tSTRING_DVAR, nil,
2835
+ :tSTRING_CONTENT, "@a"+str,
2836
+ :tSTRING_END, '"')
2837
+
2838
+ chr = [0x30].pack("U")
2839
+ str = "#{chr}zzz"
2840
+
2841
+ refute_lex('"#@a\u30zzz"',
2842
+ :tSTRING_BEG, '"',
2843
+ :tSTRING_DVAR, nil,
2844
+ :tSTRING_CONTENT, "@a"+str,
2845
+ :tSTRING_END, '"')
2846
+
2847
+ chr = [0x3].pack("U")
2848
+ str = "#{chr}zzz"
2849
+
2850
+ refute_lex('"#@a\u3zzz"',
2851
+ :tSTRING_BEG, '"',
2852
+ :tSTRING_DVAR, nil,
2853
+ :tSTRING_CONTENT, "@a"+str,
2854
+ :tSTRING_END, '"')
2583
2855
  end
2584
2856
 
2585
- def test_yylex_string_pct_other
2586
- assert_lex3("%%blah%",
2587
- nil,
2588
- :tSTRING_BEG, "%%", EXPR_BEG,
2589
- :tSTRING_CONTENT, "blah", EXPR_BEG,
2590
- :tSTRING_END, "%", EXPR_END)
2591
- end
2857
+ def test_yylex_string_utf8_bad_encoding_with_escapes
2858
+ str = "\"\\xBADπ\""
2859
+ exp = "\xBADπ".b
2592
2860
 
2593
- def test_yylex_string_pct_w
2594
- refute_lex("%w[s1 s2 ",
2595
- :tQWORDS_BEG, "%w[",
2596
- :tSTRING_CONTENT, "s1",
2597
- :tSPACE, nil,
2598
- :tSTRING_CONTENT, "s2",
2599
- :tSPACE, nil)
2861
+ assert_lex(str,
2862
+ s(:str, exp),
2863
+ :tSTRING, exp, EXPR_END)
2600
2864
  end
2601
2865
 
2602
- def test_yylex_string_pct_w_bs_nl
2603
- assert_lex3("%w[s1 \\\ns2]",
2604
- nil,
2605
- :tQWORDS_BEG, "%w[", EXPR_BEG,
2606
- :tSTRING_CONTENT, "s1", EXPR_BEG,
2607
- :tSPACE, nil, EXPR_BEG,
2608
- :tSTRING_CONTENT, "\ns2", EXPR_BEG,
2609
- :tSPACE, nil, EXPR_BEG,
2610
- :tSTRING_END, nil, EXPR_END)
2611
- end
2866
+ def test_yylex_string_utf8_complex_trailing_hex
2867
+ chr = [0x3024].pack("U")
2868
+ str = "#{chr}abz"
2612
2869
 
2613
- def test_yylex_string_pct_w_bs_sp
2614
- assert_lex3("%w[s\\ 1 s\\ 2]",
2615
- nil,
2616
- :tQWORDS_BEG, "%w[", EXPR_BEG,
2617
- :tSTRING_CONTENT, "s 1", EXPR_BEG,
2618
- :tSPACE, nil, EXPR_BEG,
2619
- :tSTRING_CONTENT, "s 2", EXPR_BEG,
2620
- :tSPACE, nil, EXPR_BEG,
2621
- :tSTRING_END, nil, EXPR_END)
2870
+ assert_lex3('"#@a\u3024abz"',
2871
+ s(:dstr, "", s(:evstr, s(:ivar, :@a)), s(:str, str)),
2872
+ :tSTRING_BEG, '"', EXPR_BEG,
2873
+ :tSTRING_DVAR, nil, EXPR_BEG,
2874
+ :tSTRING_CONTENT, "@a"+str, EXPR_BEG,
2875
+ :tSTRING_END, '"', EXPR_LIT)
2622
2876
  end
2623
2877
 
2624
- def test_yylex_string_single
2625
- assert_lex3("'string'", nil, :tSTRING, "string", EXPR_END)
2878
+ def test_yylex_string_utf8_missing_hex
2879
+ refute_lex('"\u3zzz"')
2880
+ refute_lex('"\u30zzz"')
2881
+ refute_lex('"\u302zzz"')
2626
2882
  end
2627
2883
 
2628
- def test_yylex_string_single_escape_chars
2629
- assert_lex3("'s\\tri\\ng'", nil, :tSTRING, "s\\tri\\ng", EXPR_END)
2630
- end
2884
+ def test_yylex_string_utf8_simple
2885
+ chr = [0x3024].pack("U")
2631
2886
 
2632
- def test_yylex_string_single_nl
2633
- assert_lex3("'blah\\\nblah'", nil, :tSTRING, "blah\\\nblah", EXPR_END)
2887
+ assert_lex3('"\u{3024}"',
2888
+ s(:str, chr),
2889
+ :tSTRING, chr, EXPR_END)
2634
2890
  end
2635
2891
 
2636
- def test_yylex_string_single_escaped_quote
2637
- assert_lex3("'foo\\'bar'", nil, :tSTRING, "foo'bar", EXPR_END)
2892
+ def test_yylex_string_utf8_trailing_hex
2893
+ chr = [0x3024].pack("U")
2894
+ str = "#{chr}abz"
2895
+
2896
+ assert_lex3('"\u3024abz"',
2897
+ s(:str, str),
2898
+ :tSTRING, str, EXPR_END)
2638
2899
  end
2639
2900
 
2640
- def test_yylex_symbol
2641
- assert_lex3(":symbol", nil, :tSYMBOL, "symbol", EXPR_END)
2901
+ def test_yylex_sym_quoted
2902
+ assert_lex(":'a'",
2903
+ s(:lit, :a),
2904
+
2905
+ :tSYMBOL, "a", EXPR_LIT, 0, 0)
2642
2906
  end
2643
2907
 
2644
- def test_yylex_symbol_zero_byte
2645
- assert_lex(":\"symbol\0\"", nil,
2646
- :tSYMBOL, "symbol\0", EXPR_END)
2908
+ def test_yylex_symbol
2909
+ assert_lex3(":symbol", nil, :tSYMBOL, "symbol", EXPR_LIT)
2647
2910
  end
2648
2911
 
2649
2912
  def test_yylex_symbol_double
2650
2913
  assert_lex3(":\"symbol\"",
2651
2914
  nil,
2652
- :tSYMBOL, "symbol", EXPR_END)
2915
+ :tSYMBOL, "symbol", EXPR_LIT)
2653
2916
  end
2654
2917
 
2655
2918
  def test_yylex_symbol_double_interp
@@ -2659,29 +2922,30 @@ class TestRubyLexer < Minitest::Test
2659
2922
  :tSTRING_CONTENT, "symbol", EXPR_FNAME,
2660
2923
  :tSTRING_DBEG, nil, EXPR_FNAME,
2661
2924
  :tSTRING_CONTENT, "1+1}", EXPR_FNAME, # HUH? this is BS
2662
- :tSTRING_END, "\"", EXPR_END)
2925
+ :tSTRING_END, "\"", EXPR_LIT)
2663
2926
  end
2664
2927
 
2665
2928
  def test_yylex_symbol_single
2666
2929
  assert_lex3(":'symbol'",
2667
2930
  nil,
2668
- :tSYMBOL, "symbol", EXPR_END)
2931
+ :tSYMBOL, "symbol", EXPR_LIT)
2669
2932
  end
2670
2933
 
2671
- def test_yylex_symbol_single_noninterp
2672
- assert_lex3(':\'symbol#{1+1}\'',
2934
+ def test_yylex_symbol_single_escape_chars
2935
+ assert_lex3(":'s\\tri\\ng'",
2673
2936
  nil,
2674
- :tSYMBOL, 'symbol#{1+1}', EXPR_END)
2937
+ :tSYMBOL, "s\\tri\\ng", EXPR_LIT)
2675
2938
  end
2676
2939
 
2677
- def test_yylex_symbol_single_escape_chars
2678
- assert_lex3(":'s\\tri\\ng'",
2940
+ def test_yylex_symbol_single_noninterp
2941
+ assert_lex3(':\'symbol#{1+1}\'',
2679
2942
  nil,
2680
- :tSYMBOL, "s\\tri\\ng", EXPR_END)
2943
+ :tSYMBOL, 'symbol#{1+1}', EXPR_LIT)
2681
2944
  end
2682
2945
 
2683
- def test_yylex_string_single_escape_quote_and_backslash
2684
- assert_lex3(":'foo\\'bar\\\\baz'", nil, :tSYMBOL, "foo'bar\\baz", EXPR_END)
2946
+ def test_yylex_symbol_zero_byte
2947
+ assert_lex(":\"symbol\0\"", nil,
2948
+ :tSYMBOL, "symbol\0", EXPR_LIT)
2685
2949
  end
2686
2950
 
2687
2951
  def test_yylex_ternary1
@@ -2703,7 +2967,7 @@ class TestRubyLexer < Minitest::Test
2703
2967
 
2704
2968
  assert_lex3("42 ?",
2705
2969
  nil,
2706
- :tINTEGER, 42, EXPR_NUM,
2970
+ :tINTEGER, 42, EXPR_NUM,
2707
2971
  :tEH, "?", EXPR_BEG)
2708
2972
  end
2709
2973
 
@@ -2746,14 +3010,14 @@ class TestRubyLexer < Minitest::Test
2746
3010
  nil,
2747
3011
  :kDEF, "def", EXPR_FNAME,
2748
3012
  :tIDENTIFIER, "initialize", EXPR_ENDFN,
2749
- :tLPAREN2, "(", EXPR_PAR,
3013
+ :tLPAREN2, "(", EXPR_PAR,
2750
3014
  :tIDENTIFIER, "u", EXPR_ARG,
2751
3015
  :tEQL, "=", EXPR_BEG,
2752
- :tFLOAT, 0.0, EXPR_NUM,
2753
- :tCOMMA, ",", EXPR_PAR,
3016
+ :tFLOAT, 0.0, EXPR_NUM,
3017
+ :tCOMMA, ",", EXPR_PAR,
2754
3018
  :tIDENTIFIER, "s", EXPR_ARG,
2755
3019
  :tEQL, "=", EXPR_BEG,
2756
- :tFLOAT, 0.0, EXPR_NUM)
3020
+ :tFLOAT, 0.0, EXPR_NUM)
2757
3021
  end
2758
3022
 
2759
3023
  def test_zbug_id_equals
@@ -2761,7 +3025,7 @@ class TestRubyLexer < Minitest::Test
2761
3025
  nil,
2762
3026
  :tIDENTIFIER, "a", EXPR_CMDARG,
2763
3027
  :tEQL, "=", EXPR_BEG,
2764
- :tFLOAT, 0.0, EXPR_NUM)
3028
+ :tFLOAT, 0.0, EXPR_NUM)
2765
3029
  end
2766
3030
 
2767
3031
  def test_zbug_no_spaces_in_decl
@@ -2769,190 +3033,13 @@ class TestRubyLexer < Minitest::Test
2769
3033
  nil,
2770
3034
  :kDEF, "def", EXPR_FNAME,
2771
3035
  :tIDENTIFIER, "initialize", EXPR_ENDFN,
2772
- :tLPAREN2, "(", EXPR_PAR,
3036
+ :tLPAREN2, "(", EXPR_PAR,
2773
3037
  :tIDENTIFIER, "u", EXPR_ARG,
2774
3038
  :tEQL, "=", EXPR_BEG,
2775
- :tFLOAT, 0.0, EXPR_NUM,
2776
- :tCOMMA, ",", EXPR_PAR,
3039
+ :tFLOAT, 0.0, EXPR_NUM,
3040
+ :tCOMMA, ",", EXPR_PAR,
2777
3041
  :tIDENTIFIER, "s", EXPR_ARG,
2778
3042
  :tEQL, "=", EXPR_BEG,
2779
- :tFLOAT, 0.0, EXPR_NUM)
2780
- end
2781
-
2782
- def test_pct_w_backslashes
2783
- ["\t", "\n", "\r", "\v", "\f"].each do |char|
2784
- next if !RubyLexer::HAS_ENC and char == "\v"
2785
-
2786
- assert_lex("%w[foo#{char}bar]",
2787
- s(:array, s(:str, "foo"), s(:str, "bar")),
2788
-
2789
- :tQWORDS_BEG, "%w[", EXPR_BEG, 0, 0,
2790
- :tSTRING_CONTENT, "foo", EXPR_BEG, 0, 0,
2791
- :tSPACE, nil, EXPR_BEG, 0, 0,
2792
- :tSTRING_CONTENT, "bar", EXPR_BEG, 0, 0,
2793
- :tSPACE, nil, EXPR_BEG, 0, 0,
2794
- :tSTRING_END, nil, EXPR_END, 0, 0)
2795
- end
2796
- end
2797
-
2798
- def test_yylex_sym_quoted
2799
- assert_lex(":'a'",
2800
- s(:lit, :a),
2801
-
2802
- :tSYMBOL, "a", EXPR_END, 0, 0)
2803
- end
2804
-
2805
- def test_yylex_hash_colon
2806
- assert_lex("{a:1}",
2807
- s(:hash, s(:lit, :a), s(:lit, 1)),
2808
-
2809
- :tLBRACE, "{", EXPR_PAR, 0, 1,
2810
- :tLABEL, "a", EXPR_LAB, 0, 1,
2811
- :tINTEGER, 1, EXPR_NUM, 0, 1,
2812
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
2813
- end
2814
-
2815
- def test_yylex_hash_colon_quoted_22
2816
- setup_lexer_class RubyParser::V22
2817
-
2818
- assert_lex("{'a':1}",
2819
- s(:hash, s(:lit, :a), s(:lit, 1)),
2820
-
2821
- :tLBRACE, "{", EXPR_PAR, 0, 1,
2822
- :tLABEL, "a", EXPR_LAB, 0, 1,
2823
- :tINTEGER, 1, EXPR_NUM, 0, 1,
2824
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
2825
- end
2826
-
2827
- def test_yylex_hash_colon_quoted_symbol_22
2828
- setup_lexer_class RubyParser::V22
2829
-
2830
- assert_lex("{'abc': :b}",
2831
- s(:hash, s(:lit, :abc), s(:lit, :b)),
2832
-
2833
- :tLBRACE, "{", EXPR_PAR, 0, 1,
2834
- :tLABEL, "abc", EXPR_LAB, 0, 1,
2835
- :tSYMBOL, "b", EXPR_END, 0, 1,
2836
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
2837
- end
2838
-
2839
- def test_yylex_hash_colon_double_quoted_symbol_22
2840
- setup_lexer_class RubyParser::V22
2841
-
2842
- assert_lex('{"abc": :b}',
2843
- s(:hash, s(:lit, :abc), s(:lit, :b)),
2844
-
2845
- :tLBRACE, "{", EXPR_PAR, 0, 1,
2846
- :tLABEL, "abc", EXPR_LAB, 0, 1,
2847
- :tSYMBOL, "b", EXPR_END, 0, 1,
2848
- :tRCURLY, "}", EXPR_ENDARG, 0, 0)
2849
- end
2850
-
2851
- def test_yylex_required_kwarg_no_value_22
2852
- setup_lexer_class RubyParser::V22
2853
-
2854
- assert_lex3("def foo a:, b:\nend",
2855
- nil,
2856
- :kDEF, "def", EXPR_FNAME,
2857
- :tIDENTIFIER, "foo", EXPR_ENDFN,
2858
- :tLABEL, "a", EXPR_LAB,
2859
- :tCOMMA, ",", EXPR_PAR,
2860
- :tLABEL, "b", EXPR_LAB,
2861
- :kEND, "end", EXPR_END)
2862
- end
2863
-
2864
- def test_yylex_hash_colon_double_quoted_with_escapes
2865
- setup_lexer_class RubyParser::V22
2866
-
2867
- assert_lex3("{\"s\\tr\\i\\ng\\\\foo\\'bar\":1}",
2868
- nil,
2869
-
2870
- :tLBRACE, "{", EXPR_PAR,
2871
- :tLABEL, "s\tr\i\ng\\foo'bar", EXPR_LAB,
2872
- :tINTEGER, 1, EXPR_NUM,
2873
- :tRCURLY, "}", EXPR_ENDARG)
2874
- end
2875
-
2876
- def test_yylex_hash_colon_quoted_with_escapes
2877
- setup_lexer_class RubyParser::V22
2878
-
2879
- assert_lex3("{'s\\tr\\i\\ng\\\\foo\\'bar':1}",
2880
- nil,
2881
-
2882
- :tLBRACE, "{", EXPR_PAR,
2883
- :tLABEL, "s\\tr\\i\\ng\\foo'bar", EXPR_LAB,
2884
- :tINTEGER, 1, EXPR_NUM,
2885
- :tRCURLY, "}", EXPR_ENDARG)
2886
- end
2887
-
2888
- def test_ruby21_rational_literal
2889
- setup_lexer_class RubyParser::V21
2890
-
2891
- assert_lex3("10r", nil, :tRATIONAL, Rational(10), EXPR_NUM)
2892
- assert_lex3("0x10r", nil, :tRATIONAL, Rational(16), EXPR_NUM)
2893
- assert_lex3("0o10r", nil, :tRATIONAL, Rational(8), EXPR_NUM)
2894
- assert_lex3("0or", nil, :tRATIONAL, Rational(0), EXPR_NUM)
2895
- assert_lex3("0b10r", nil, :tRATIONAL, Rational(2), EXPR_NUM)
2896
- assert_lex3("1.5r", nil, :tRATIONAL, Rational(15, 10), EXPR_NUM)
2897
- assert_lex3("15e3r", nil, :tRATIONAL, Rational(15000), EXPR_NUM)
2898
- assert_lex3("15e-3r", nil, :tRATIONAL, Rational(15, 1000), EXPR_NUM)
2899
- assert_lex3("1.5e3r", nil, :tRATIONAL, Rational(1500), EXPR_NUM)
2900
- assert_lex3("1.5e-3r", nil, :tRATIONAL, Rational(15, 10000), EXPR_NUM)
2901
-
2902
- assert_lex3("-10r", nil,
2903
- :tUMINUS_NUM, "-", EXPR_BEG,
2904
- :tRATIONAL, Rational(10), EXPR_NUM)
2905
- end
2906
-
2907
- def test_ruby21_imaginary_literal
2908
- setup_lexer_class RubyParser::V21
2909
-
2910
- assert_lex3("1i", nil, :tIMAGINARY, Complex(0, 1), EXPR_NUM)
2911
- assert_lex3("0x10i", nil, :tIMAGINARY, Complex(0, 16), EXPR_NUM)
2912
- assert_lex3("0o10i", nil, :tIMAGINARY, Complex(0, 8), EXPR_NUM)
2913
- assert_lex3("0oi", nil, :tIMAGINARY, Complex(0, 0), EXPR_NUM)
2914
- assert_lex3("0b10i", nil, :tIMAGINARY, Complex(0, 2), EXPR_NUM)
2915
- assert_lex3("1.5i", nil, :tIMAGINARY, Complex(0, 1.5), EXPR_NUM)
2916
- assert_lex3("15e3i", nil, :tIMAGINARY, Complex(0, 15000), EXPR_NUM)
2917
- assert_lex3("15e-3i", nil, :tIMAGINARY, Complex(0, 0.015), EXPR_NUM)
2918
- assert_lex3("1.5e3i", nil, :tIMAGINARY, Complex(0, 1500), EXPR_NUM)
2919
- assert_lex3("1.5e-3i", nil, :tIMAGINARY, Complex(0, 0.0015), EXPR_NUM)
2920
-
2921
- assert_lex3("-10i", nil,
2922
- :tUMINUS_NUM, "-", EXPR_BEG,
2923
- :tIMAGINARY, Complex(0, 10), EXPR_NUM)
2924
- end
2925
-
2926
- def test_ruby21_rational_imaginary_literal
2927
- setup_lexer_class RubyParser::V21
2928
-
2929
- assert_lex3 "1ri", nil, :tIMAGINARY, Complex(0, Rational(1)), EXPR_NUM
2930
- assert_lex3 "0x10ri", nil, :tIMAGINARY, Complex(0, Rational(16)), EXPR_NUM
2931
- assert_lex3 "0o10ri", nil, :tIMAGINARY, Complex(0, Rational(8)), EXPR_NUM
2932
- assert_lex3 "0ori", nil, :tIMAGINARY, Complex(0, Rational(0)), EXPR_NUM
2933
- assert_lex3 "0b10ri", nil, :tIMAGINARY, Complex(0, Rational(2)), EXPR_NUM
2934
- assert_lex3 "1.5ri", nil, :tIMAGINARY, Complex(0, Rational("1.5")), EXPR_NUM
2935
- assert_lex3 "15e3ri", nil, :tIMAGINARY, Complex(0, Rational("15e3")), EXPR_NUM
2936
- assert_lex3 "15e-3ri", nil, :tIMAGINARY, Complex(0, Rational("15e-3")), EXPR_NUM
2937
- assert_lex3 "1.5e3ri", nil, :tIMAGINARY, Complex(0, Rational("1.5e3")), EXPR_NUM
2938
- assert_lex3 "1.5e-3ri", nil, :tIMAGINARY, Complex(0, Rational("1.5e-3")), EXPR_NUM
2939
-
2940
- assert_lex3("-10ri", nil,
2941
- :tUMINUS_NUM, "-", EXPR_BEG,
2942
- :tIMAGINARY, Complex(0, Rational(10)), EXPR_NUM)
2943
- end
2944
-
2945
- def test_ruby21_imaginary_literal_with_succeeding_keyword
2946
- setup_lexer_class RubyParser::V21
2947
-
2948
- # 2/4 scenarios are syntax errors on all tested versions so I
2949
- # deleted them.
2950
-
2951
- assert_lex3("1if", nil,
2952
- :tINTEGER, 1, EXPR_NUM,
2953
- :kIF_MOD, "if", EXPR_PAR)
2954
- assert_lex3("1.0if", nil,
2955
- :tFLOAT, 1.0, EXPR_NUM,
2956
- :kIF_MOD, "if", EXPR_PAR)
3043
+ :tFLOAT, 0.0, EXPR_NUM)
2957
3044
  end
2958
3045
  end