ruby_parser 3.13.0 → 3.15.0

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