parser 0.9.alpha1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -3
  3. data/AST_FORMAT.md +1338 -0
  4. data/README.md +58 -3
  5. data/Rakefile +32 -12
  6. data/bin/benchmark +47 -0
  7. data/bin/explain-parse +14 -0
  8. data/bin/parse +6 -0
  9. data/lib/parser.rb +84 -0
  10. data/lib/parser/all.rb +2 -0
  11. data/lib/parser/ast/node.rb +11 -0
  12. data/lib/parser/ast/processor.rb +8 -0
  13. data/lib/parser/base.rb +116 -0
  14. data/lib/parser/builders/default.rb +654 -0
  15. data/lib/parser/compatibility/ruby1_8.rb +13 -0
  16. data/lib/parser/diagnostic.rb +44 -0
  17. data/lib/parser/diagnostic/engine.rb +44 -0
  18. data/lib/parser/lexer.rl +335 -245
  19. data/lib/parser/lexer/explanation.rb +37 -0
  20. data/lib/parser/{lexer_literal.rb → lexer/literal.rb} +22 -12
  21. data/lib/parser/lexer/stack_state.rb +38 -0
  22. data/lib/parser/ruby18.y +1957 -0
  23. data/lib/parser/ruby19.y +2154 -0
  24. data/lib/parser/source/buffer.rb +78 -0
  25. data/lib/parser/source/map.rb +20 -0
  26. data/lib/parser/source/map/operator.rb +15 -0
  27. data/lib/parser/source/map/variable_assignment.rb +15 -0
  28. data/lib/parser/source/range.rb +66 -0
  29. data/lib/parser/static_environment.rb +12 -6
  30. data/parser.gemspec +23 -13
  31. data/test/helper.rb +45 -0
  32. data/test/parse_helper.rb +204 -0
  33. data/test/racc_coverage_helper.rb +130 -0
  34. data/test/test_diagnostic.rb +47 -0
  35. data/test/test_diagnostic_engine.rb +58 -0
  36. data/test/test_lexer.rb +601 -357
  37. data/test/test_lexer_stack_state.rb +69 -0
  38. data/test/test_parse_helper.rb +74 -0
  39. data/test/test_parser.rb +3654 -0
  40. data/test/test_source_buffer.rb +80 -0
  41. data/test/test_source_range.rb +51 -0
  42. data/test/test_static_environment.rb +1 -4
  43. metadata +137 -12
@@ -0,0 +1,130 @@
1
+ require 'racc/grammarfileparser'
2
+
3
+ # Unfortunately, Ruby's Coverage module ignores module_eval statements,
4
+ # which Racc uses to map `parser.y` locations in the generated
5
+ # `parser.rb`.
6
+ module RaccCoverage
7
+ @coverage = {}
8
+ @base_path = nil
9
+ @trace = nil
10
+
11
+ def self.start(parsers, base_path)
12
+ @base_path = base_path
13
+
14
+ parsers.each do |parser|
15
+ @coverage[parser] = extract_interesting_lines(parser, base_path)
16
+ end
17
+
18
+ @trace = TracePoint.trace(:line) do |trace|
19
+ lineno = trace.lineno - 1
20
+
21
+ if (line_coverage = @coverage[trace.path])
22
+ if line_coverage[lineno]
23
+ line_coverage[lineno] += 1
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def self.stop
30
+ @trace.disable
31
+ end
32
+
33
+ # Ruby's TracePoint#lineno will point only on "interesting" lines,
34
+ # i.e.: only code (no comments or empty lines), no `end` keywords,
35
+ # and for multi-line statements, only the first line of the statement.
36
+ #
37
+ # This method implements a very dumb Ruby parser, which skips empty lines
38
+ # or lines with just comments, `end` keywords, and correctly handles
39
+ # multi-line statements of the following form:
40
+ #
41
+ # * All lines of the statement except the last must end with `,`, `.` or `(`.
42
+ #
43
+ # Coverage can be disabled for code regions with annotations :nocov: and :cov:.
44
+ #
45
+ # Also, for best results, all actions should be delimited by at least
46
+ # one non-action line.
47
+ #
48
+ def self.extract_interesting_lines(parser, base_path)
49
+ grammar_source = File.join(@base_path, parser)
50
+ grammar_file = Racc::GrammarFileParser.parse_file(grammar_source)
51
+
52
+ ruby_sources = [
53
+ # Header and footer aren't passed through module_eval
54
+ # in Racc-generated file, so the location info is lost.
55
+ *grammar_file.params.inner,
56
+ ].compact
57
+
58
+ grammar_file.grammar.each_rule do |rule|
59
+ source = rule.action.source
60
+ next if source.nil?
61
+
62
+ ruby_sources << source
63
+ end
64
+
65
+ lines = []
66
+
67
+ ruby_sources.each do |source|
68
+ first_line = source.lineno
69
+
70
+ state = :first_line
71
+
72
+ source.text.each_line.with_index do |line, index|
73
+ line = line.strip
74
+
75
+ continues = line.end_with?(',') ||
76
+ line.end_with?('(') ||
77
+ line.end_with?('.')
78
+
79
+ case state
80
+ when :first_line
81
+ if line =~ /:nocov/
82
+ state = :nocov
83
+ next
84
+ elsif line.empty? ||
85
+ line == 'end' ||
86
+ line.start_with?('#')
87
+ next
88
+ elsif continues
89
+ state = :mid_line
90
+ end
91
+
92
+ lines[first_line + index - 1] = 0
93
+
94
+ when :mid_line
95
+ unless continues
96
+ state = :first_line
97
+ end
98
+
99
+ when :nocov
100
+ if line =~ /:cov:/
101
+ state = :first_line
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ lines
108
+ end
109
+
110
+ def self.result
111
+ result =
112
+ @coverage.map do |parser, coverage|
113
+ [File.join(@base_path, parser), coverage]
114
+ end
115
+
116
+ Hash[result]
117
+ end
118
+ end
119
+
120
+ class << SimpleCov
121
+ def result_with_racc_coverage
122
+ @result ||= SimpleCov::Result.new(
123
+ Coverage.result.merge(RaccCoverage.result))
124
+
125
+ result_without_racc_coverage
126
+ end
127
+
128
+ alias result_without_racc_coverage result
129
+ alias result result_with_racc_coverage
130
+ end
@@ -0,0 +1,47 @@
1
+ require 'helper'
2
+
3
+ class TestDiagnostic < MiniTest::Unit::TestCase
4
+ def setup
5
+ @buffer = Parser::Source::Buffer.new('(string)')
6
+ @buffer.source = "if (this is some bad code + bugs)"
7
+
8
+ @range1 = Parser::Source::Range.new(@buffer, 0, 1) # if
9
+ @range2 = Parser::Source::Range.new(@buffer, 4, 7) # this
10
+ end
11
+
12
+ def test_verifies_levels
13
+ assert_raises ArgumentError, /level/ do
14
+ Parser::Diagnostic.new(:foobar, "foo", @range1)
15
+ end
16
+ end
17
+
18
+ def test_freezes
19
+ string = "foo"
20
+ highlights = [@range2]
21
+
22
+ diag = Parser::Diagnostic.new(:error, string, @range1, highlights)
23
+ assert diag.frozen?
24
+ assert diag.message.frozen?
25
+ assert diag.highlights.frozen?
26
+
27
+ refute string.frozen?
28
+ refute highlights.frozen?
29
+ end
30
+
31
+ def test_render
32
+ location = Parser::Source::Range.new(@buffer, 26, 26)
33
+
34
+ highlights = [
35
+ Parser::Source::Range.new(@buffer, 21, 24),
36
+ Parser::Source::Range.new(@buffer, 28, 31)
37
+ ]
38
+
39
+ diag = Parser::Diagnostic.new(:error, "code far too bad",
40
+ location, highlights)
41
+ assert_equal([
42
+ "(string):1:27: error: code far too bad",
43
+ "if (this is some bad code + bugs)",
44
+ " ~~~~ ^ ~~~~ "
45
+ ], diag.render)
46
+ end
47
+ end
@@ -0,0 +1,58 @@
1
+ require 'helper'
2
+
3
+ class TestDiagnosticEngine < MiniTest::Unit::TestCase
4
+ def setup
5
+ @buffer = Parser::Source::Buffer.new('(source)')
6
+ @buffer.source = 'foobar'
7
+
8
+ @engine = Parser::Diagnostic::Engine.new
9
+
10
+ @queue = []
11
+ @engine.consumer = lambda { |diag| @queue << diag }
12
+ end
13
+
14
+ def test_process_warnings
15
+ warn = Parser::Diagnostic.new(:warning, "foo", @buffer, 1..2)
16
+ @engine.process(warn)
17
+
18
+ assert_equal [warn], @queue
19
+ end
20
+
21
+ def test_ignore_warnings
22
+ @engine.ignore_warnings = true
23
+
24
+ warn = Parser::Diagnostic.new(:warning, "foo", @buffer, 1..2)
25
+ @engine.process(warn)
26
+
27
+ assert_equal [], @queue
28
+ end
29
+
30
+ def test_all_errors_are_fatal
31
+ @engine.all_errors_are_fatal = true
32
+
33
+ error = Parser::Diagnostic.new(:error, "foo", @buffer, 1..2)
34
+
35
+ assert_raises Parser::SyntaxError do
36
+ @engine.process(error)
37
+ end
38
+
39
+ assert_equal [error], @queue
40
+ end
41
+
42
+ def test_all_errors_are_collected
43
+ error = Parser::Diagnostic.new(:error, "foo", @buffer, 1..2)
44
+ @engine.process(error)
45
+
46
+ assert_equal [error], @queue
47
+ end
48
+
49
+ def test_fatal_error
50
+ fatal = Parser::Diagnostic.new(:fatal, "foo", @buffer, 1..2)
51
+
52
+ assert_raises Parser::SyntaxError do
53
+ @engine.process(fatal)
54
+ end
55
+
56
+ assert_equal [fatal], @queue
57
+ end
58
+ end
@@ -1,28 +1,38 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- require 'minitest/autorun'
4
- require 'parser/lexer'
3
+ require 'helper'
5
4
 
6
5
  class TestLexer < MiniTest::Unit::TestCase
7
- def setup_lexer version
6
+ def setup_lexer(version)
8
7
  @lex = Parser::Lexer.new(version)
8
+
9
+ @lex.diagnostics = Parser::Diagnostic::Engine.new
10
+ @lex.diagnostics.all_errors_are_fatal = true
11
+ # @lex.diagnostics.consumer = lambda { |diag| $stderr.puts "", diag.render }
9
12
  end
10
13
 
11
14
  def setup
12
15
  setup_lexer 18
13
16
  end
14
17
 
15
- def util_bad_token s, *args
18
+ #
19
+ # Additional matchers
20
+ #
21
+
22
+ def util_bad_token(s, *args)
16
23
  assert_raises Parser::SyntaxError do
17
- util_lex_token s, *args
24
+ util_lex_token(s, *args)
18
25
  end
19
26
  end
20
27
 
21
- def util_escape expected, input
28
+ def util_escape(expected, input)
29
+ source_buffer = Parser::Source::Buffer.new('(util_escape)')
30
+ source_buffer.source = "%Q[\\#{input}]"
31
+
22
32
  @lex.reset
23
- @lex.source = "%Q[\\#{input}]"
33
+ @lex.source_buffer = source_buffer
24
34
 
25
- lex_token, lex_value = @lex.advance
35
+ lex_token, (lex_value, *) = @lex.advance
26
36
 
27
37
  if lex_value.respond_to?(:force_encoding)
28
38
  lex_value.force_encoding('ASCII-8BIT')
@@ -30,47 +40,44 @@ class TestLexer < MiniTest::Unit::TestCase
30
40
 
31
41
  assert_equal [:tSTRING, expected],
32
42
  [lex_token, lex_value],
33
- @lex.source
43
+ source_buffer.source
34
44
  end
35
45
 
36
- def util_escape_bad input
46
+ def util_escape_bad(input)
37
47
  assert_raises Parser::SyntaxError do
38
48
  @lex.state = :expr_beg
39
49
  util_lex_token "%Q[\\#{input}]"
40
50
  end
41
51
  end
42
52
 
43
- def util_lex_fname name, type, end_state = :expr_end
44
- util_lex_token("def #{name} ", :kDEF, "def", type, name)
53
+ def util_lex_fname(name, type, end_state = :expr_end)
54
+ util_lex_token("def #{name} ", :kDEF, 'def', type, name)
45
55
 
46
56
  assert_equal end_state, @lex.state
47
57
  end
48
58
 
49
- def util_lex_token input, *args
59
+ def util_lex_token(input, *args)
60
+ source_buffer = Parser::Source::Buffer.new('(util_lex_token)')
61
+ source_buffer.source = input
62
+
50
63
  @lex.reset(false)
51
- @lex.source = input
64
+ @lex.source_buffer = source_buffer
52
65
 
53
66
  until args.empty? do
54
67
  token, value = args.shift(2)
55
68
 
56
- lex_token, lex_value = @lex.advance
57
- assert lex_token, "no more tokens"
69
+ lex_token, (lex_value, *) = @lex.advance
70
+ assert lex_token, 'no more tokens'
58
71
  assert_equal [token, value], [lex_token, lex_value], input
59
72
  end
60
73
 
61
- lex_token, lex_value = @lex.advance
74
+ lex_token, (lex_value, *) = @lex.advance
62
75
  refute lex_token, "must be empty, but had #{[lex_token, lex_value].inspect}"
63
76
  end
64
77
 
65
- def test_advance
66
- @lex.source = "blah"
67
-
68
- token, = @lex.advance
69
- assert token # blah
70
-
71
- token, = @lex.advance
72
- refute token # nada
73
- end
78
+ #
79
+ # Tests
80
+ #
74
81
 
75
82
  def test_read_escape
76
83
  util_escape "\\", "\\"
@@ -121,19 +128,23 @@ class TestLexer < MiniTest::Unit::TestCase
121
128
  end
122
129
 
123
130
  def test_read_escape_unicode__19
124
- util_escape "\xc4\xa3", 'u0123'
131
+ if RUBY_VERSION >= '1.9'
132
+ util_escape "\xc4\xa3", 'u0123'
125
133
 
126
- util_escape "\xc4\xa3\xc3\xb0\xeb\x84\xa3", 'u{123 f0 B123}'
134
+ util_escape "\xc4\xa3\xc3\xb0\xeb\x84\xa3", 'u{123 f0 B123}'
135
+ end
127
136
  end
128
137
 
129
138
  def test_read_escape_unicode_bad__19
130
- util_escape_bad 'u123'
131
- util_escape_bad 'u{}'
132
- util_escape_bad 'u{123 f0h}'
133
- util_escape_bad 'u{123 f0'
139
+ if RUBY_VERSION >= '1.9'
140
+ util_escape_bad 'u123'
141
+ util_escape_bad 'u{}'
142
+ util_escape_bad 'u{123 f0h}'
143
+ util_escape_bad 'u{123 f0'
144
+ end
134
145
  end
135
146
 
136
- def test_yylex_ambiguous_uminus
147
+ def test_ambiguous_uminus
137
148
  util_lex_token("m -3",
138
149
  :tIDENTIFIER, "m",
139
150
  :tUMINUS_NUM, "-",
@@ -141,30 +152,30 @@ class TestLexer < MiniTest::Unit::TestCase
141
152
  # TODO: verify warning
142
153
  end
143
154
 
144
- def test_yylex_ambiguous_uplus
155
+ def test_ambiguous_uplus
145
156
  util_lex_token("m +3",
146
157
  :tIDENTIFIER, "m",
147
158
  :tINTEGER, 3)
148
159
  # TODO: verify warning
149
160
  end
150
161
 
151
- def test_yylex_and
162
+ def test_and
152
163
  util_lex_token "&", :tAMPER, "&"
153
164
  end
154
165
 
155
- def test_yylex_and2
166
+ def test_and2
156
167
  @lex.state = :expr_end
157
168
 
158
169
  util_lex_token "&&", :tANDOP, "&&"
159
170
  end
160
171
 
161
- def test_yylex_and2_equals
172
+ def test_and2_equals
162
173
  @lex.state = :expr_end
163
174
 
164
175
  util_lex_token "&&=", :tOP_ASGN, "&&"
165
176
  end
166
177
 
167
- def test_yylex_and_arg
178
+ def test_and_arg
168
179
  @lex.state = :expr_arg
169
180
 
170
181
  util_lex_token(" &y",
@@ -172,13 +183,13 @@ class TestLexer < MiniTest::Unit::TestCase
172
183
  :tIDENTIFIER, "y")
173
184
  end
174
185
 
175
- def test_yylex_and_equals
186
+ def test_and_equals
176
187
  @lex.state = :expr_end
177
188
 
178
189
  util_lex_token "&=", :tOP_ASGN, "&"
179
190
  end
180
191
 
181
- def test_yylex_and_expr
192
+ def test_and_expr
182
193
  @lex.state = :expr_arg
183
194
 
184
195
  util_lex_token("x & y",
@@ -187,22 +198,22 @@ class TestLexer < MiniTest::Unit::TestCase
187
198
  :tIDENTIFIER, "y")
188
199
  end
189
200
 
190
- def test_yylex_and_meth
201
+ def test_and_meth
191
202
  util_lex_fname "&", :tAMPER2
192
203
  end
193
204
 
194
- def test_yylex_assoc
205
+ def test_assoc
195
206
  util_lex_token "=>", :tASSOC, "=>"
196
207
  end
197
208
 
198
- def test_yylex_label__18
209
+ def test_label__18
199
210
  util_lex_token("{a:b",
200
211
  :tLBRACE, "{",
201
212
  :tIDENTIFIER, "a",
202
213
  :tSYMBOL, "b")
203
214
  end
204
215
 
205
- def test_yylex_label_in_params__18
216
+ def test_label_in_params__18
206
217
  util_lex_token("foo(a:b",
207
218
  :tIDENTIFIER, "foo",
208
219
  :tLPAREN2, "(",
@@ -210,7 +221,7 @@ class TestLexer < MiniTest::Unit::TestCase
210
221
  :tSYMBOL, "b")
211
222
  end
212
223
 
213
- def test_yylex_label__19
224
+ def test_label__19
214
225
  setup_lexer 19
215
226
 
216
227
  util_lex_token("{a:b",
@@ -219,7 +230,7 @@ class TestLexer < MiniTest::Unit::TestCase
219
230
  :tIDENTIFIER, "b")
220
231
  end
221
232
 
222
- def test_yylex_label_in_params__19
233
+ def test_label_in_params__19
223
234
  setup_lexer 19
224
235
 
225
236
  util_lex_token("foo(a:b",
@@ -229,7 +240,7 @@ class TestLexer < MiniTest::Unit::TestCase
229
240
  :tIDENTIFIER, "b")
230
241
  end
231
242
 
232
- def test_yylex_command_start__19
243
+ def test_command_start__19
233
244
  setup_lexer 19
234
245
 
235
246
  %w[case elsif for in until when while
@@ -244,7 +255,7 @@ class TestLexer < MiniTest::Unit::TestCase
244
255
  end
245
256
  end
246
257
 
247
- def test_yylex_mod_not_command_start__19
258
+ def test_mod_not_command_start__19
248
259
  setup_lexer 19
249
260
 
250
261
  %w[if unless while until rescue].each do |keyword|
@@ -258,43 +269,43 @@ class TestLexer < MiniTest::Unit::TestCase
258
269
  end
259
270
  end
260
271
 
261
- def test_yylex_back_ref
272
+ def test_back_ref
262
273
  util_lex_token("[$&, $`, $', $+]",
263
274
  :tLBRACK, "[",
264
- :tBACK_REF, :"&", :tCOMMA, ",",
265
- :tBACK_REF, :"`", :tCOMMA, ",",
266
- :tBACK_REF, :"'", :tCOMMA, ",",
267
- :tBACK_REF, :"+",
275
+ :tBACK_REF, "$&", :tCOMMA, ",",
276
+ :tBACK_REF, "$`", :tCOMMA, ",",
277
+ :tBACK_REF, "$'", :tCOMMA, ",",
278
+ :tBACK_REF, "$+",
268
279
  :tRBRACK, "]")
269
280
  end
270
281
 
271
- def test_yylex_backslash
282
+ def test_backslash
272
283
  util_lex_token("1 \\\n+ 2",
273
284
  :tINTEGER, 1,
274
285
  :tPLUS, "+",
275
286
  :tINTEGER, 2)
276
287
  end
277
288
 
278
- def test_yylex_backslash_bad
289
+ def test_backslash_bad
279
290
  util_bad_token("1 \\ + 2",
280
291
  :tINTEGER, 1)
281
292
  end
282
293
 
283
- def test_yylex_backtick
294
+ def test_backtick
284
295
  util_lex_token("`ls`",
285
296
  :tXSTRING_BEG, "`",
286
297
  :tSTRING_CONTENT, "ls",
287
298
  :tSTRING_END, "`")
288
299
  end
289
300
 
290
- def test_yylex_backtick_cmdarg
301
+ def test_backtick_cmdarg
291
302
  @lex.state = :expr_dot
292
303
  util_lex_token("\n`", :tBACK_REF2, "`") # \n ensures expr_cmd
293
304
 
294
305
  assert_equal :expr_arg, @lex.state
295
306
  end
296
307
 
297
- def test_yylex_backtick_dot
308
+ def test_backtick_dot
298
309
  @lex.state = :expr_dot
299
310
  util_lex_token("a.`(3)",
300
311
  :tIDENTIFIER, "a",
@@ -305,54 +316,64 @@ class TestLexer < MiniTest::Unit::TestCase
305
316
  :tRPAREN, ")")
306
317
  end
307
318
 
308
- def test_yylex_backtick_method
319
+ def test_backtick_method
309
320
  @lex.state = :expr_fname
310
321
  util_lex_token("`", :tBACK_REF2, "`")
311
322
  assert_equal :expr_end, @lex.state
312
323
  end
313
324
 
314
- def test_yylex_bad_char
325
+ def test_bad_char
315
326
  util_bad_token(" \010 ")
316
327
  end
317
328
 
318
- def test_yylex_bang
329
+ def test_bang
319
330
  util_lex_token "!", :tBANG, "!"
320
331
  end
321
332
 
322
- def test_yylex_bang_equals
333
+ def test_bang_equals
323
334
  util_lex_token "!=", :tNEQ, "!="
324
335
  end
325
336
 
326
- def test_yylex_bang_tilde
337
+ def test_bang_tilde
327
338
  util_lex_token "!~", :tNMATCH, "!~"
328
339
  end
329
340
 
330
- def test_yylex_carat
341
+ def test_carat
331
342
  util_lex_token "^", :tCARET, "^"
332
343
  end
333
344
 
334
- def test_yylex_carat_equals
345
+ def test_carat_equals
335
346
  util_lex_token "^=", :tOP_ASGN, "^"
336
347
  end
337
348
 
338
- def test_yylex_colon2
349
+ def test_colon2
339
350
  util_lex_token("A::B",
340
351
  :tCONSTANT, "A",
341
352
  :tCOLON2, "::",
342
353
  :tCONSTANT, "B")
354
+
355
+ @lex.state = :expr_arg
356
+ util_lex_token("::Array",
357
+ :tCOLON2, "::",
358
+ :tCONSTANT, "Array")
343
359
  end
344
360
 
345
- def test_yylex_colon3
361
+ def test_colon3
346
362
  util_lex_token("::Array",
347
363
  :tCOLON3, "::",
348
364
  :tCONSTANT, "Array")
365
+
366
+ @lex.state = :expr_arg
367
+ util_lex_token(" ::Array",
368
+ :tCOLON3, "::",
369
+ :tCONSTANT, "Array")
349
370
  end
350
371
 
351
- def test_yylex_comma
372
+ def test_comma
352
373
  util_lex_token ",", :tCOMMA, ","
353
374
  end
354
375
 
355
- def test_yylex_comment
376
+ def test_comment
356
377
  util_lex_token("1 # one\n# two\n2",
357
378
  :tINTEGER, 1,
358
379
  :tNL, nil,
@@ -360,18 +381,23 @@ class TestLexer < MiniTest::Unit::TestCase
360
381
  assert_equal "# one\n# two\n", @lex.comments
361
382
  end
362
383
 
363
- def test_yylex_comment_begin
384
+ def test_comment_expr_beg
385
+ util_lex_token("{#1\n}",
386
+ :tLBRACE, "{",
387
+ :tRCURLY, "}")
388
+ end
389
+
390
+ def test_comment_begin
364
391
  util_lex_token("=begin\nblah\nblah\n=end\n42",
365
392
  :tINTEGER, 42)
366
393
  assert_equal "=begin\nblah\nblah\n=end\n", @lex.comments
367
394
  end
368
395
 
369
- def test_yylex_comment_begin_bad
396
+ def test_comment_begin_bad
370
397
  util_bad_token("=begin\nblah\nblah\n")
371
- assert_equal "", @lex.comments
372
398
  end
373
399
 
374
- def test_yylex_comment_begin_not_comment
400
+ def test_comment_begin_not_comment
375
401
  util_lex_token("beginfoo = 5\np x \\\n=beginfoo",
376
402
  :tIDENTIFIER, "beginfoo",
377
403
  :tEQL, "=",
@@ -383,54 +409,54 @@ class TestLexer < MiniTest::Unit::TestCase
383
409
  :tIDENTIFIER, "beginfoo")
384
410
  end
385
411
 
386
- def test_yylex_comment_begin_space
412
+ def test_comment_begin_space
387
413
  util_lex_token("=begin blah\nblah\n=end\n")
388
414
  assert_equal "=begin blah\nblah\n=end\n", @lex.comments
389
415
  end
390
416
 
391
- def test_yylex_comment_end_space_and_text
417
+ def test_comment_end_space_and_text
392
418
  util_lex_token("=begin blah\nblah\n=end blab\n")
393
419
  assert_equal "=begin blah\nblah\n=end blab\n", @lex.comments
394
420
  end
395
421
 
396
- def test_yylex_comment_eos
422
+ def test_comment_eos
397
423
  util_lex_token("# comment")
398
424
  end
399
425
 
400
- def test_yylex_constant
426
+ def test_constant
401
427
  util_lex_token("ArgumentError",
402
428
  :tCONSTANT, "ArgumentError")
403
429
  end
404
430
 
405
- def test_yylex_constant_semi
431
+ def test_constant_semi
406
432
  util_lex_token("ArgumentError;",
407
433
  :tCONSTANT, "ArgumentError",
408
434
  :tSEMI, ";")
409
435
  end
410
436
 
411
- def test_yylex_cvar
437
+ def test_cvar
412
438
  util_lex_token "@@blah", :tCVAR, "@@blah"
413
439
  end
414
440
 
415
- def test_yylex_cvar_bad
441
+ def test_cvar_bad
416
442
  util_bad_token "@@1"
417
443
  end
418
444
 
419
- def test_yylex_div
445
+ def test_div
420
446
  util_lex_token("a / 2",
421
447
  :tIDENTIFIER, "a",
422
448
  :tDIVIDE, "/",
423
449
  :tINTEGER, 2)
424
450
  end
425
451
 
426
- def test_yylex_div_equals
452
+ def test_div_equals
427
453
  util_lex_token("a /= 2",
428
454
  :tIDENTIFIER, "a",
429
455
  :tOP_ASGN, "/",
430
456
  :tINTEGER, 2)
431
457
  end
432
458
 
433
- def test_yylex_do
459
+ def test_do
434
460
  util_lex_token("x do 42 end",
435
461
  :tIDENTIFIER, "x",
436
462
  :kDO, "do",
@@ -438,7 +464,17 @@ class TestLexer < MiniTest::Unit::TestCase
438
464
  :kEND, "end")
439
465
  end
440
466
 
441
- def test_yylex_do_block
467
+ def test_do_cond
468
+ @lex.cond.push(true)
469
+
470
+ util_lex_token("x do 42 end",
471
+ :tIDENTIFIER, "x",
472
+ :kDO_COND, "do",
473
+ :tINTEGER, 42,
474
+ :kEND, "end")
475
+ end
476
+
477
+ def test_do_block
442
478
  @lex.state = :expr_endarg
443
479
 
444
480
  util_lex_token("do 42 end",
@@ -448,7 +484,7 @@ class TestLexer < MiniTest::Unit::TestCase
448
484
  end
449
485
 
450
486
  # TODO
451
- # def test_yylex_do_cond
487
+ # def test_do_cond
452
488
  # @lex.cond.push true
453
489
 
454
490
  # util_lex_token("x do 42 end",
@@ -458,156 +494,149 @@ class TestLexer < MiniTest::Unit::TestCase
458
494
  # :kEND, "end")
459
495
  # end
460
496
 
461
- def test_yylex_dot
497
+ def test_dot
462
498
  util_lex_token ".", :tDOT, "."
463
499
  end
464
500
 
465
- def test_yylex_dot2
501
+ def test_dot2
466
502
  util_lex_token "..", :tDOT2, ".."
467
503
  end
468
504
 
469
- def test_yylex_dot3
505
+ def test_dot3
470
506
  util_lex_token "...", :tDOT3, "..."
471
507
  end
472
508
 
473
- def test_yylex_equals
509
+ def test_equals
474
510
  util_lex_token "=", :tEQL, "="
475
511
  end
476
512
 
477
- def test_yylex_equals2
513
+ def test_equals2
478
514
  util_lex_token "==", :tEQ, "=="
479
515
  end
480
516
 
481
- def test_yylex_equals3
517
+ def test_equals3
482
518
  util_lex_token "===", :tEQQ, "==="
483
519
  end
484
520
 
485
- def test_yylex_equals_tilde
521
+ def test_equals_tilde
486
522
  util_lex_token "=~", :tMATCH, "=~"
487
523
  end
488
524
 
489
- def test_yylex_float
525
+ def test_float
490
526
  util_lex_token "1.0", :tFLOAT, 1.0
491
527
  end
492
528
 
493
- def test_yylex_float_bad_no_underscores
529
+ def test_float_bad_no_underscores
494
530
  util_bad_token "1__0.0"
495
531
  end
496
532
 
497
- def test_yylex_float_bad_no_zero_leading
533
+ def test_float_bad_no_zero_leading
498
534
  util_bad_token ".0"
499
535
  end
500
536
 
501
- def test_yylex_float_bad_trailing_underscore
537
+ def test_float_bad_trailing_underscore
502
538
  util_bad_token "123_.0"
503
539
  end
504
540
 
505
- def test_yylex_float_call
541
+ def test_float_call
506
542
  util_lex_token("1.0.to_s",
507
543
  :tFLOAT, 1.0,
508
544
  :tDOT, ".",
509
545
  :tIDENTIFIER, "to_s")
510
546
  end
511
547
 
512
- def test_yylex_float_dot_E
548
+ def test_float_dot_E
513
549
  util_lex_token "1.0E10", :tFLOAT, 1.0e10
514
550
  end
515
551
 
516
- def test_yylex_float_dot_E_neg
552
+ def test_float_dot_E_neg
517
553
  util_lex_token("-1.0E10",
518
554
  :tUMINUS_NUM, "-",
519
555
  :tFLOAT, 1.0e10)
520
556
  end
521
557
 
522
- def test_yylex_float_dot_e
558
+ def test_float_dot_e
523
559
  util_lex_token "1.0e10", :tFLOAT, 1.0e10
524
560
  end
525
561
 
526
- def test_yylex_float_dot_e_neg
562
+ def test_float_dot_e_neg
527
563
  util_lex_token("-1.0e10",
528
564
  :tUMINUS_NUM, "-",
529
565
  :tFLOAT, 1.0e10)
530
566
  end
531
567
 
532
- def test_yylex_float_e
568
+ def test_float_e
533
569
  util_lex_token "1e10", :tFLOAT, 1e10
534
570
  end
535
571
 
536
- def test_yylex_float_e_bad_trailing_underscore
572
+ def test_float_e_bad_trailing_underscore
537
573
  util_bad_token "123_e10"
538
574
  end
539
575
 
540
- def test_yylex_float_e_minus
576
+ def test_float_e_minus
541
577
  util_lex_token "1e-10", :tFLOAT, 1e-10
542
578
  end
543
579
 
544
- def test_yylex_float_e_neg
580
+ def test_float_e_neg
545
581
  util_lex_token("-1e10",
546
582
  :tUMINUS_NUM, "-",
547
583
  :tFLOAT, 1e10)
548
584
  end
549
585
 
550
- def test_yylex_float_e_neg_minus
586
+ def test_float_e_neg_minus
551
587
  util_lex_token("-1e-10",
552
588
  :tUMINUS_NUM, "-",
553
589
  :tFLOAT, 1e-10)
554
590
  end
555
591
 
556
- def test_yylex_float_e_neg_plus
592
+ def test_float_e_neg_plus
557
593
  util_lex_token("-1e+10",
558
594
  :tUMINUS_NUM, "-",
559
595
  :tFLOAT, 1e10)
560
596
  end
561
597
 
562
- def test_yylex_float_e_plus
598
+ def test_float_e_plus
563
599
  util_lex_token "1e+10", :tFLOAT, 1e10
564
600
  end
565
601
 
566
- def test_yylex_float_e_zero
602
+ def test_float_e_zero
567
603
  util_lex_token "0e0", :tFLOAT, 0e0
568
604
  end
569
605
 
570
- def test_yylex_float_neg
606
+ def test_float_neg
571
607
  util_lex_token("-1.0",
572
608
  :tUMINUS_NUM, "-",
573
609
  :tFLOAT, 1.0)
574
610
  end
575
611
 
576
- def test_yylex_ge
612
+ def test_ge
577
613
  util_lex_token("a >= 2",
578
614
  :tIDENTIFIER, "a",
579
615
  :tGEQ, ">=",
580
616
  :tINTEGER, 2)
581
617
  end
582
618
 
583
- def test_yylex_global
619
+ def test_global
584
620
  util_lex_token("$blah", :tGVAR, "$blah")
585
621
  end
586
622
 
587
- def test_yylex_global_backref
588
- @lex.state = :expr_fname
589
- util_lex_token("$`", :tGVAR, "$`")
623
+ def test_global_backref
624
+ util_lex_token("$`", :tBACK_REF, "$`")
590
625
  end
591
626
 
592
- def test_yylex_global_dash_nothing
627
+ def test_global_dash_nothing
593
628
  util_lex_token("$- ", :tGVAR, "$-")
594
629
  end
595
630
 
596
- def test_yylex_global_dash_something
631
+ def test_global_dash_something
597
632
  util_lex_token("$-x", :tGVAR, "$-x")
598
633
  end
599
634
 
600
- def test_yylex_global_number
601
- @lex.state = :expr_fname
602
- util_lex_token("$1", :tGVAR, "$1")
603
- end
604
-
605
- def test_yylex_global_number_big
606
- @lex.state = :expr_fname
607
- util_lex_token("$1234", :tGVAR, "$1234")
635
+ def test_global_number
636
+ util_lex_token("$10", :tNTH_REF, 10)
608
637
  end
609
638
 
610
- def test_yylex_global_other
639
+ def test_global_other
611
640
  util_lex_token("[$~, $*, $$, $?, $!, $@, $/, $\\, $;, $,, $., $=, $:, $<, $>, $\"]",
612
641
  :tLBRACK, "[",
613
642
  :tGVAR, "$~", :tCOMMA, ",",
@@ -629,28 +658,28 @@ class TestLexer < MiniTest::Unit::TestCase
629
658
  :tRBRACK, "]")
630
659
  end
631
660
 
632
- def test_yylex_global_underscore
661
+ def test_global_underscore
633
662
  util_lex_token("$_",
634
663
  :tGVAR, "$_")
635
664
  end
636
665
 
637
- def test_yylex_global_wierd
666
+ def test_global_wierd
638
667
  util_lex_token("$__blah",
639
668
  :tGVAR, "$__blah")
640
669
  end
641
670
 
642
- def test_yylex_global_zero
671
+ def test_global_zero
643
672
  util_lex_token("$0", :tGVAR, "$0")
644
673
  end
645
674
 
646
- def test_yylex_gt
675
+ def test_gt
647
676
  util_lex_token("a > 2",
648
677
  :tIDENTIFIER, "a",
649
678
  :tGT, ">",
650
679
  :tINTEGER, 2)
651
680
  end
652
681
 
653
- def test_yylex_heredoc_backtick
682
+ def test_heredoc_backtick
654
683
  util_lex_token("a = <<`EOF`\n blah blah\nEOF\n",
655
684
  :tIDENTIFIER, "a",
656
685
  :tEQL, "=",
@@ -660,7 +689,7 @@ class TestLexer < MiniTest::Unit::TestCase
660
689
  :tNL, nil)
661
690
  end
662
691
 
663
- def test_yylex_heredoc_double
692
+ def test_heredoc_double
664
693
  util_lex_token("a = <<\"EOF\"\n blah blah\nEOF\n",
665
694
  :tIDENTIFIER, "a",
666
695
  :tEQL, "=",
@@ -670,7 +699,7 @@ class TestLexer < MiniTest::Unit::TestCase
670
699
  :tNL, nil)
671
700
  end
672
701
 
673
- def test_yylex_heredoc_double_dash
702
+ def test_heredoc_double_dash
674
703
  util_lex_token("a = <<-\"EOF\"\n blah blah\n EOF\n",
675
704
  :tIDENTIFIER, "a",
676
705
  :tEQL, "=",
@@ -680,21 +709,21 @@ class TestLexer < MiniTest::Unit::TestCase
680
709
  :tNL, nil)
681
710
  end
682
711
 
683
- def test_yylex_heredoc_double_eos
712
+ def test_heredoc_double_eos
684
713
  util_bad_token("a = <<\"EOF\"\nblah",
685
714
  :tIDENTIFIER, "a",
686
715
  :tEQL, "=",
687
716
  :tSTRING_BEG, "\"")
688
717
  end
689
718
 
690
- def test_yylex_heredoc_double_eos_nl
719
+ def test_heredoc_double_eos_nl
691
720
  util_bad_token("a = <<\"EOF\"\nblah\n",
692
721
  :tIDENTIFIER, "a",
693
722
  :tEQL, "=",
694
723
  :tSTRING_BEG, "\"")
695
724
  end
696
725
 
697
- def test_yylex_heredoc_double_interp
726
+ def test_heredoc_double_interp
698
727
  util_lex_token("a = <<\"EOF\"\n#x a \#@a b \#$b c \#{3} \nEOF\n",
699
728
  :tIDENTIFIER, "a",
700
729
  :tEQL, "=",
@@ -714,7 +743,7 @@ class TestLexer < MiniTest::Unit::TestCase
714
743
  :tNL, nil)
715
744
  end
716
745
 
717
- def test_yylex_heredoc_empty
746
+ def test_heredoc_empty
718
747
  util_lex_token("<<\"\"\n\#{x}\nblah2\n\n",
719
748
  :tSTRING_BEG, "\"",
720
749
  :tSTRING_DBEG, "\#{",
@@ -726,7 +755,7 @@ class TestLexer < MiniTest::Unit::TestCase
726
755
  :tNL, nil)
727
756
  end
728
757
 
729
- def test_yylex_heredoc_none
758
+ def test_heredoc_none
730
759
  util_lex_token("a = <<EOF\nblah\nblah\nEOF",
731
760
  :tIDENTIFIER, "a",
732
761
  :tEQL, "=",
@@ -737,7 +766,7 @@ class TestLexer < MiniTest::Unit::TestCase
737
766
  :tNL, nil)
738
767
  end
739
768
 
740
- def test_yylex_heredoc_none_dash
769
+ def test_heredoc_none_dash
741
770
  util_lex_token("a = <<-EOF\nblah\nblah\n EOF",
742
771
  :tIDENTIFIER, "a",
743
772
  :tEQL, "=",
@@ -748,7 +777,7 @@ class TestLexer < MiniTest::Unit::TestCase
748
777
  :tNL, nil)
749
778
  end
750
779
 
751
- def test_yylex_heredoc_single
780
+ def test_heredoc_single
752
781
  util_lex_token("a = <<'EOF'\n blah blah\nEOF\n",
753
782
  :tIDENTIFIER, "a",
754
783
  :tEQL, "=",
@@ -758,14 +787,14 @@ class TestLexer < MiniTest::Unit::TestCase
758
787
  :tNL, nil)
759
788
  end
760
789
 
761
- def test_yylex_heredoc_single_bad_eos_body
790
+ def test_heredoc_single_bad_eos_body
762
791
  util_bad_token("a = <<'EOF'\nblah",
763
792
  :tIDENTIFIER, "a",
764
793
  :tEQL, "=",
765
794
  :tSTRING_BEG, "'")
766
795
  end
767
796
 
768
- def test_yylex_heredoc_single_dash
797
+ def test_heredoc_single_dash
769
798
  util_lex_token("a = <<-'EOF'\n blah blah\n EOF\n",
770
799
  :tIDENTIFIER, "a",
771
800
  :tEQL, "=",
@@ -775,59 +804,64 @@ class TestLexer < MiniTest::Unit::TestCase
775
804
  :tNL, nil)
776
805
  end
777
806
 
778
- def test_yylex_identifier
807
+ def test_identifier
779
808
  util_lex_token("identifier", :tIDENTIFIER, "identifier")
780
809
  end
781
810
 
782
- def test_yylex_identifier_bang
783
- util_lex_token("identifier!", :tFID, "identifier!")
811
+ def test_identifier_bang
812
+ util_lex_token("identifier!",
813
+ :tFID, "identifier!")
814
+
815
+ util_lex_token("identifier!=",
816
+ :tFID, "identifier",
817
+ :tNEQ, "!=")
784
818
  end
785
819
 
786
- def test_yylex_identifier_cmp
820
+ def test_identifier_cmp
787
821
  util_lex_fname "<=>", :tCMP
788
822
  end
789
823
 
790
- def test_yylex_identifier_def
824
+ def test_identifier_def
791
825
  util_lex_fname "identifier", :tIDENTIFIER, :expr_end
792
826
  end
793
827
 
794
- def test_yylex_identifier_eh
828
+ def test_identifier_eh
795
829
  util_lex_token("identifier?", :tFID, "identifier?")
796
830
  end
797
831
 
798
- def test_yylex_identifier_equals_arrow
832
+ def test_identifier_equals_arrow
799
833
  util_lex_token(":blah==>",
800
834
  :tSYMBOL, "blah=",
801
835
  :tASSOC, "=>")
802
836
  end
803
837
 
804
- def test_yylex_identifier_equals3
838
+ def test_identifier_equals3
805
839
  util_lex_token(":a===b",
806
840
  :tSYMBOL, "a",
807
841
  :tEQQ, "===",
808
842
  :tIDENTIFIER, "b")
809
843
  end
810
844
 
811
- def test_yylex_identifier_equals_equals_arrow
845
+ def test_identifier_equals_equals_arrow
812
846
  util_lex_token(":a==>b",
813
847
  :tSYMBOL, "a=",
814
848
  :tASSOC, "=>",
815
849
  :tIDENTIFIER, "b")
816
850
  end
817
851
 
818
- def test_yylex_identifier_equals_caret
852
+ def test_identifier_equals_caret
819
853
  util_lex_fname "^", :tCARET
820
854
  end
821
855
 
822
- def test_yylex_identifier_equals_def
856
+ def test_identifier_equals_def
823
857
  util_lex_fname "identifier=", :tIDENTIFIER, :expr_end
824
858
  end
825
859
 
826
- def test_yylex_identifier_equals_def2
860
+ def test_identifier_equals_def2
827
861
  util_lex_fname "==", :tEQ
828
862
  end
829
863
 
830
- def test_yylex_identifier_equals_expr
864
+ def test_identifier_equals_expr
831
865
  @lex.state = :expr_dot
832
866
  util_lex_token("y = arg",
833
867
  :tIDENTIFIER, "y",
@@ -837,193 +871,193 @@ class TestLexer < MiniTest::Unit::TestCase
837
871
  assert_equal :expr_arg, @lex.state
838
872
  end
839
873
 
840
- def test_yylex_identifier_equals_or
874
+ def test_identifier_equals_or
841
875
  util_lex_fname "|", :tPIPE
842
876
  end
843
877
 
844
- def test_yylex_identifier_equals_slash
878
+ def test_identifier_equals_slash
845
879
  util_lex_fname "/", :tDIVIDE
846
880
  end
847
881
 
848
- def test_yylex_identifier_equals_tilde
882
+ def test_identifier_equals_tilde
849
883
  @lex.state = :expr_fname # can only set via parser's defs
850
884
  util_lex_token("identifier=~",
851
885
  :tIDENTIFIER, "identifier",
852
886
  :tMATCH, "=~")
853
887
  end
854
888
 
855
- def test_yylex_identifier_gt
889
+ def test_identifier_gt
856
890
  util_lex_fname ">", :tGT
857
891
  end
858
892
 
859
- def test_yylex_identifier_le
893
+ def test_identifier_le
860
894
  util_lex_fname "<=", :tLEQ
861
895
  end
862
896
 
863
- def test_yylex_identifier_lt
897
+ def test_identifier_lt
864
898
  util_lex_fname "<", :tLT
865
899
  end
866
900
 
867
- def test_yylex_identifier_tilde
901
+ def test_identifier_tilde
868
902
  util_lex_fname "~", :tTILDE
869
903
  end
870
904
 
871
- def test_yylex_index
905
+ def test_index
872
906
  util_lex_fname "[]", :tAREF
873
907
  end
874
908
 
875
- def test_yylex_index_equals
909
+ def test_index_equals
876
910
  util_lex_fname "[]=", :tASET
877
911
  end
878
912
 
879
- def test_yylex_integer
913
+ def test_integer
880
914
  util_lex_token "42", :tINTEGER, 42
881
915
  end
882
916
 
883
- def test_yylex_integer_bin
917
+ def test_integer_bin
884
918
  util_lex_token "0b101010", :tINTEGER, 42
885
919
  end
886
920
 
887
- def test_yylex_integer_bin_bad_none
921
+ def test_integer_bin_bad_none
888
922
  util_bad_token "0b "
889
923
  end
890
924
 
891
- def test_yylex_integer_bin_bad_underscores
925
+ def test_integer_bin_bad_underscores
892
926
  util_bad_token "0b10__01"
893
927
  end
894
928
 
895
- def test_yylex_integer_dec
929
+ def test_integer_dec
896
930
  util_lex_token "42", :tINTEGER, 42
897
931
  end
898
932
 
899
- def test_yylex_integer_dec_bad_underscores
933
+ def test_integer_dec_bad_underscores
900
934
  util_bad_token "42__24"
901
935
  end
902
936
 
903
- def test_yylex_integer_dec_d
937
+ def test_integer_dec_d
904
938
  util_lex_token "0d42", :tINTEGER, 42
905
939
  end
906
940
 
907
- def test_yylex_integer_dec_d_bad_none
941
+ def test_integer_dec_d_bad_none
908
942
  util_bad_token "0d"
909
943
  end
910
944
 
911
- def test_yylex_integer_dec_d_bad_underscores
945
+ def test_integer_dec_d_bad_underscores
912
946
  util_bad_token "0d42__24"
913
947
  end
914
948
 
915
- def test_yylex_question_eh_a__18
949
+ def test_question_eh_a__18
916
950
  setup_lexer 18
917
951
 
918
952
  util_lex_token "?a", :tINTEGER, 97
919
953
  end
920
954
 
921
- def test_yylex_question_eh_a__19
955
+ def test_question_eh_a__19
922
956
  setup_lexer 19
923
957
 
924
958
  util_lex_token '?a', :tSTRING, "a"
925
959
  end
926
960
 
927
- def test_yylex_question_eh_escape_M_escape_C__18
961
+ def test_question_eh_escape_M_escape_C__18
928
962
  setup_lexer 18
929
963
 
930
964
  util_lex_token '?\M-\C-a', :tINTEGER, 129
931
965
  end
932
966
 
933
- def test_yylex_question_eh_escape_M_escape_C__19
967
+ def test_question_eh_escape_M_escape_C__19
934
968
  setup_lexer 19
935
969
 
936
970
  util_lex_token '?\M-\C-a', :tSTRING, "\M-\C-a"
937
971
  end
938
972
 
939
- def test_yylex_integer_hex
973
+ def test_integer_hex
940
974
  util_lex_token "0x2a", :tINTEGER, 42
941
975
  end
942
976
 
943
- def test_yylex_integer_hex_bad_none
977
+ def test_integer_hex_bad_none
944
978
  util_bad_token "0x "
945
979
  end
946
980
 
947
- def test_yylex_integer_hex_bad_underscores
981
+ def test_integer_hex_bad_underscores
948
982
  util_bad_token "0xab__cd"
949
983
  end
950
984
 
951
- def test_yylex_integer_oct
985
+ def test_integer_oct
952
986
  util_lex_token "052", :tINTEGER, 42
953
987
  end
954
988
 
955
- def test_yylex_integer_oct_bad_range
989
+ def test_integer_oct_bad_range
956
990
  util_bad_token "08"
957
991
  end
958
992
 
959
- def test_yylex_integer_oct_bad_underscores
993
+ def test_integer_oct_bad_underscores
960
994
  util_bad_token "01__23"
961
995
  end
962
996
 
963
- def test_yylex_integer_oct_O
997
+ def test_integer_oct_O
964
998
  util_lex_token "0O52", :tINTEGER, 42
965
999
  end
966
1000
 
967
- def test_yylex_integer_oct_O_bad_range
968
- util_bad_token "0O8"
1001
+ def test_integer_oct_O_bad_range
1002
+ util_bad_token "0O1238"
969
1003
  end
970
1004
 
971
- def test_yylex_integer_oct_O_bad_underscores
1005
+ def test_integer_oct_O_bad_underscores
972
1006
  util_bad_token "0O1__23"
973
1007
  end
974
1008
 
975
- def test_yylex_integer_oct_O_not_bad_none
1009
+ def test_integer_oct_O_not_bad_none
976
1010
  util_lex_token "0O ", :tINTEGER, 0
977
1011
  end
978
1012
 
979
- def test_yylex_integer_oct_o
1013
+ def test_integer_oct_o
980
1014
  util_lex_token "0o52", :tINTEGER, 42
981
1015
  end
982
1016
 
983
- def test_yylex_integer_oct_o_bad_range
984
- util_bad_token "0o8"
1017
+ def test_integer_oct_o_bad_range
1018
+ util_bad_token "0o1283"
985
1019
  end
986
1020
 
987
- def test_yylex_integer_oct_o_bad_underscores
1021
+ def test_integer_oct_o_bad_underscores
988
1022
  util_bad_token "0o1__23"
989
1023
  end
990
1024
 
991
- def test_yylex_integer_oct_o_not_bad_none
1025
+ def test_integer_oct_o_not_bad_none
992
1026
  util_lex_token "0o ", :tINTEGER, 0
993
1027
  end
994
1028
 
995
- def test_yylex_integer_trailing
1029
+ def test_integer_trailing
996
1030
  util_lex_token("1.to_s",
997
1031
  :tINTEGER, 1,
998
1032
  :tDOT, '.',
999
1033
  :tIDENTIFIER, 'to_s')
1000
1034
  end
1001
1035
 
1002
- def test_yylex_integer_underscore
1036
+ def test_integer_underscore
1003
1037
  util_lex_token "4_2", :tINTEGER, 42
1004
1038
  end
1005
1039
 
1006
- def test_yylex_integer_underscore_bad
1040
+ def test_integer_underscore_bad
1007
1041
  util_bad_token "4__2"
1008
1042
  end
1009
1043
 
1010
- def test_yylex_integer_zero
1044
+ def test_integer_zero
1011
1045
  util_lex_token "0", :tINTEGER, 0
1012
1046
  end
1013
1047
 
1014
- def test_yylex_ivar
1048
+ def test_ivar
1015
1049
  util_lex_token "@blah", :tIVAR, "@blah"
1016
1050
  end
1017
1051
 
1018
- def test_yylex_ivar_bad
1052
+ def test_ivar_bad
1019
1053
  util_bad_token "@1"
1020
1054
  end
1021
1055
 
1022
- def test_yylex_ivar_bad_0_length
1056
+ def test_ivar_bad_0_length
1023
1057
  util_bad_token "1+@\n", :tINTEGER, 1, :tPLUS, "+"
1024
1058
  end
1025
1059
 
1026
- def test_yylex_keyword_expr
1060
+ def test_keyword_expr
1027
1061
  @lex.state = :expr_endarg
1028
1062
 
1029
1063
  util_lex_token("if", :kIF_MOD, "if")
@@ -1031,11 +1065,11 @@ class TestLexer < MiniTest::Unit::TestCase
1031
1065
  assert_equal :expr_beg, @lex.state
1032
1066
  end
1033
1067
 
1034
- def test_yylex_lt
1068
+ def test_lt
1035
1069
  util_lex_token "<", :tLT, "<"
1036
1070
  end
1037
1071
 
1038
- def test_yylex_lt2
1072
+ def test_lt2
1039
1073
  util_lex_token("a <\< b",
1040
1074
  :tIDENTIFIER, "a",
1041
1075
  :tLSHFT, "<\<",
@@ -1043,81 +1077,75 @@ class TestLexer < MiniTest::Unit::TestCase
1043
1077
 
1044
1078
  end
1045
1079
 
1046
- def test_yylex_lt2_equals
1080
+ def test_lt2_equals
1047
1081
  util_lex_token("a <\<= b",
1048
1082
  :tIDENTIFIER, "a",
1049
1083
  :tOP_ASGN, "<\<",
1050
1084
  :tIDENTIFIER, "b")
1051
1085
  end
1052
1086
 
1053
- def test_yylex_lt_equals
1087
+ def test_lt_equals
1054
1088
  util_lex_token "<=", :tLEQ, "<="
1055
1089
  end
1056
1090
 
1057
- def test_yylex_minus
1091
+ def test_minus
1058
1092
  util_lex_token("1 - 2",
1059
1093
  :tINTEGER, 1,
1060
1094
  :tMINUS, "-",
1061
1095
  :tINTEGER, 2)
1062
1096
  end
1063
1097
 
1064
- def test_yylex_minus_equals
1098
+ def test_minus_equals
1065
1099
  @lex.state = :expr_end
1066
1100
 
1067
1101
  util_lex_token "-=", :tOP_ASGN, "-"
1068
1102
  end
1069
1103
 
1070
- def test_yylex_minus_method
1104
+ def test_minus_method
1071
1105
  @lex.state = :expr_fname
1072
1106
  util_lex_token "-", :tMINUS, "-"
1073
1107
  end
1074
1108
 
1075
- def test_yylex_minus_unary_method
1109
+ def test_minus_unary_method
1076
1110
  @lex.state = :expr_fname
1077
1111
  util_lex_token "-@", :tUMINUS, "-@"
1078
1112
  end
1079
1113
 
1080
- def test_yylex_minus_unary_number
1114
+ def test_minus_unary_number
1081
1115
  util_lex_token("-42",
1082
1116
  :tUMINUS_NUM, "-",
1083
1117
  :tINTEGER, 42)
1084
1118
  end
1085
1119
 
1086
- def test_yylex_nth_ref
1087
- util_lex_token('[$1, $2, $3, $4, $5, $6, $7, $8, $9]',
1120
+ def test_nth_ref
1121
+ util_lex_token('[$1, $2, $3]',
1088
1122
  :tLBRACK, "[",
1089
1123
  :tNTH_REF, 1, :tCOMMA, ",",
1090
1124
  :tNTH_REF, 2, :tCOMMA, ",",
1091
- :tNTH_REF, 3, :tCOMMA, ",",
1092
- :tNTH_REF, 4, :tCOMMA, ",",
1093
- :tNTH_REF, 5, :tCOMMA, ",",
1094
- :tNTH_REF, 6, :tCOMMA, ",",
1095
- :tNTH_REF, 7, :tCOMMA, ",",
1096
- :tNTH_REF, 8, :tCOMMA, ",",
1097
- :tNTH_REF, 9,
1125
+ :tNTH_REF, 3,
1098
1126
  :tRBRACK, "]")
1099
1127
  end
1100
1128
 
1101
- def test_yylex_open_bracket
1129
+ def test_open_bracket
1102
1130
  util_lex_token("(", :tLPAREN, "(")
1103
1131
  end
1104
1132
 
1105
- def test_yylex_open_bracket_cmdarg
1133
+ def test_open_bracket_cmdarg
1106
1134
  util_lex_token("m (", :tIDENTIFIER, "m",
1107
1135
  :tLPAREN_ARG, "(")
1108
1136
  end
1109
1137
 
1110
- def test_yylex_open_bracket_exprarg
1138
+ def test_open_bracket_exprarg
1111
1139
  util_lex_token("m(", :tIDENTIFIER, "m",
1112
1140
  :tLPAREN2, "(")
1113
1141
  end
1114
1142
 
1115
- def test_yylex_open_curly_bracket
1143
+ def test_open_curly_bracket
1116
1144
  util_lex_token("{",
1117
1145
  :tLBRACE, "{")
1118
1146
  end
1119
1147
 
1120
- def test_yylex_open_curly_bracket_arg
1148
+ def test_open_curly_bracket_arg
1121
1149
  util_lex_token("m { 3 }",
1122
1150
  :tIDENTIFIER, "m",
1123
1151
  :tLCURLY, "{",
@@ -1125,7 +1153,7 @@ class TestLexer < MiniTest::Unit::TestCase
1125
1153
  :tRCURLY, "}")
1126
1154
  end
1127
1155
 
1128
- def test_yylex_open_curly_bracket_block
1156
+ def test_open_curly_bracket_block
1129
1157
  @lex.state = :expr_endarg # seen m(3)
1130
1158
 
1131
1159
  util_lex_token("{ 4 }",
@@ -1134,7 +1162,7 @@ class TestLexer < MiniTest::Unit::TestCase
1134
1162
  :tRCURLY, "}")
1135
1163
  end
1136
1164
 
1137
- def test_yylex_open_square_bracket_arg
1165
+ def test_open_square_bracket_arg
1138
1166
  util_lex_token("m [ 3 ]",
1139
1167
  :tIDENTIFIER, "m",
1140
1168
  :tLBRACK, "[",
@@ -1142,7 +1170,7 @@ class TestLexer < MiniTest::Unit::TestCase
1142
1170
  :tRBRACK, "]")
1143
1171
  end
1144
1172
 
1145
- def test_yylex_open_square_bracket_ary
1173
+ def test_open_square_bracket_ary
1146
1174
  util_lex_token("[1, 2, 3]",
1147
1175
  :tLBRACK, "[",
1148
1176
  :tINTEGER, 1,
@@ -1153,7 +1181,7 @@ class TestLexer < MiniTest::Unit::TestCase
1153
1181
  :tRBRACK, "]")
1154
1182
  end
1155
1183
 
1156
- def test_yylex_open_square_bracket_meth
1184
+ def test_open_square_bracket_meth
1157
1185
  util_lex_token("m[3]",
1158
1186
  :tIDENTIFIER, "m",
1159
1187
  :tLBRACK2, "[",
@@ -1161,60 +1189,60 @@ class TestLexer < MiniTest::Unit::TestCase
1161
1189
  :tRBRACK, "]")
1162
1190
  end
1163
1191
 
1164
- def test_yylex_or
1192
+ def test_or
1165
1193
  util_lex_token "|", :tPIPE, "|"
1166
1194
  end
1167
1195
 
1168
- def test_yylex_or2
1196
+ def test_or2
1169
1197
  util_lex_token "||", :tOROP, "||"
1170
1198
  end
1171
1199
 
1172
- def test_yylex_or2_equals
1200
+ def test_or2_equals
1173
1201
  util_lex_token "||=", :tOP_ASGN, "||"
1174
1202
  end
1175
1203
 
1176
- def test_yylex_or_equals
1204
+ def test_or_equals
1177
1205
  util_lex_token "|=", :tOP_ASGN, "|"
1178
1206
  end
1179
1207
 
1180
- def test_yylex_percent
1208
+ def test_percent
1181
1209
  util_lex_token("a % 2",
1182
1210
  :tIDENTIFIER, "a",
1183
1211
  :tPERCENT, "%",
1184
1212
  :tINTEGER, 2)
1185
1213
  end
1186
1214
 
1187
- def test_yylex_percent_equals
1215
+ def test_percent_equals
1188
1216
  util_lex_token("a %= 2",
1189
1217
  :tIDENTIFIER, "a",
1190
1218
  :tOP_ASGN, "%",
1191
1219
  :tINTEGER, 2)
1192
1220
  end
1193
1221
 
1194
- def test_yylex_plus
1222
+ def test_plus
1195
1223
  util_lex_token("1 + 1", # TODO state?
1196
1224
  :tINTEGER, 1,
1197
1225
  :tPLUS, "+",
1198
1226
  :tINTEGER, 1)
1199
1227
  end
1200
1228
 
1201
- def test_yylex_plus_equals
1229
+ def test_plus_equals
1202
1230
  @lex.state = :expr_end
1203
1231
 
1204
1232
  util_lex_token "+=", :tOP_ASGN, "+"
1205
1233
  end
1206
1234
 
1207
- def test_yylex_plus_method
1235
+ def test_plus_method
1208
1236
  @lex.state = :expr_fname
1209
1237
  util_lex_token "+", :tPLUS, "+"
1210
1238
  end
1211
1239
 
1212
- def test_yylex_plus_unary_method
1240
+ def test_plus_unary_method
1213
1241
  @lex.state = :expr_fname
1214
1242
  util_lex_token "+@", :tUPLUS, "+@"
1215
1243
  end
1216
1244
 
1217
- def test_yylex_numbers
1245
+ def test_numbers
1218
1246
  util_lex_token "0b10", :tINTEGER, 2
1219
1247
  util_lex_token "0B10", :tINTEGER, 2
1220
1248
 
@@ -1253,28 +1281,28 @@ class TestLexer < MiniTest::Unit::TestCase
1253
1281
  util_bad_token "1__1"
1254
1282
  end
1255
1283
 
1256
- def test_yylex_plus_unary_number
1284
+ def test_plus_unary_number
1257
1285
  util_lex_token("+42",
1258
1286
  :tINTEGER, 42)
1259
1287
  end
1260
1288
 
1261
- def test_yylex_question__18
1289
+ def test_question__18
1262
1290
  setup_lexer 18
1263
1291
 
1264
1292
  util_lex_token "?*", :tINTEGER, 42
1265
1293
  end
1266
1294
 
1267
- def test_yylex_question__19
1295
+ def test_question__19
1268
1296
  setup_lexer 19
1269
1297
 
1270
1298
  util_lex_token "?*", :tSTRING, "*"
1271
1299
  end
1272
1300
 
1273
- def test_yylex_question_bad_eos
1301
+ def test_question_bad_eos
1274
1302
  util_bad_token "?"
1275
1303
  end
1276
1304
 
1277
- def test_yylex_question_bad_ws
1305
+ def test_question_bad_ws
1278
1306
  util_lex_token "? ", :tEH, "?"
1279
1307
  util_lex_token "?\n", :tEH, "?"
1280
1308
  util_lex_token "?\t", :tEH, "?"
@@ -1283,7 +1311,7 @@ class TestLexer < MiniTest::Unit::TestCase
1283
1311
  util_lex_token "?\f", :tEH, "?"
1284
1312
  end
1285
1313
 
1286
- def test_yylex_question_ws_backslashed__18
1314
+ def test_question_ws_backslashed__18
1287
1315
  setup_lexer 18
1288
1316
 
1289
1317
  @lex.state = :expr_beg
@@ -1300,7 +1328,7 @@ class TestLexer < MiniTest::Unit::TestCase
1300
1328
  util_lex_token "?\\f", :tINTEGER, 12
1301
1329
  end
1302
1330
 
1303
- def test_yylex_question_ws_backslashed__19
1331
+ def test_question_ws_backslashed__19
1304
1332
  setup_lexer 19
1305
1333
 
1306
1334
  @lex.state = :expr_beg
@@ -1317,15 +1345,15 @@ class TestLexer < MiniTest::Unit::TestCase
1317
1345
  util_lex_token "?\\f", :tSTRING, "\f"
1318
1346
  end
1319
1347
 
1320
- def test_yylex_rbracket
1348
+ def test_rbracket
1321
1349
  util_lex_token "]", :tRBRACK, "]"
1322
1350
  end
1323
1351
 
1324
- def test_yylex_rcurly
1352
+ def test_rcurly
1325
1353
  util_lex_token "}", :tRCURLY, "}"
1326
1354
  end
1327
1355
 
1328
- def test_yylex_regexp
1356
+ def test_regexp
1329
1357
  util_lex_token("/regexp/",
1330
1358
  :tREGEXP_BEG, "/",
1331
1359
  :tSTRING_CONTENT, "regexp",
@@ -1333,7 +1361,7 @@ class TestLexer < MiniTest::Unit::TestCase
1333
1361
  :tREGEXP_OPT, "")
1334
1362
  end
1335
1363
 
1336
- def test_yylex_regexp_ambiguous
1364
+ def test_regexp_ambiguous
1337
1365
  util_lex_token("method /regexp/",
1338
1366
  :tIDENTIFIER, "method",
1339
1367
  :tREGEXP_BEG, "/",
@@ -1342,13 +1370,14 @@ class TestLexer < MiniTest::Unit::TestCase
1342
1370
  :tREGEXP_OPT, "")
1343
1371
  end
1344
1372
 
1345
- def test_yylex_regexp_bad
1373
+ def test_regexp_bad
1346
1374
  util_bad_token("/.*/xyz",
1347
- :tREGEXP_BEG, "/",
1348
- :tSTRING_CONTENT, ".*")
1375
+ :tREGEXP_BEG, "/",
1376
+ :tSTRING_CONTENT, ".*",
1377
+ :tSTRING_END, "/")
1349
1378
  end
1350
1379
 
1351
- def test_yylex_regexp_escape_C
1380
+ def test_regexp_escape_C
1352
1381
  util_lex_token('/regex\\C-x/',
1353
1382
  :tREGEXP_BEG, "/",
1354
1383
  :tSTRING_CONTENT, "regex\\C-x",
@@ -1356,7 +1385,7 @@ class TestLexer < MiniTest::Unit::TestCase
1356
1385
  :tREGEXP_OPT, "")
1357
1386
  end
1358
1387
 
1359
- def test_yylex_regexp_escape_C_M
1388
+ def test_regexp_escape_C_M
1360
1389
  util_lex_token('/regex\\C-\\M-x/',
1361
1390
  :tREGEXP_BEG, "/",
1362
1391
  :tSTRING_CONTENT, "regex\\C-\\M-x",
@@ -1364,7 +1393,7 @@ class TestLexer < MiniTest::Unit::TestCase
1364
1393
  :tREGEXP_OPT, "")
1365
1394
  end
1366
1395
 
1367
- def test_yylex_regexp_escape_C_M_craaaazy
1396
+ def test_regexp_escape_C_M_craaaazy
1368
1397
  util_lex_token("/regex\\C-\\\n\\M-x/",
1369
1398
  :tREGEXP_BEG, "/",
1370
1399
  :tSTRING_CONTENT, "regex\\C-\\M-x",
@@ -1372,27 +1401,27 @@ class TestLexer < MiniTest::Unit::TestCase
1372
1401
  :tREGEXP_OPT, "")
1373
1402
  end
1374
1403
 
1375
- def test_yylex_regexp_escape_C_bad_dash
1404
+ def test_regexp_escape_C_bad_dash
1376
1405
  util_bad_token '/regex\\Cx/', :tREGEXP_BEG, "/"
1377
1406
  end
1378
1407
 
1379
- def test_yylex_regexp_escape_C_bad_dash_eos
1408
+ def test_regexp_escape_C_bad_dash_eos
1380
1409
  util_bad_token '/regex\\C-/', :tREGEXP_BEG, "/"
1381
1410
  end
1382
1411
 
1383
- def test_yylex_regexp_escape_C_bad_dash_eos2
1412
+ def test_regexp_escape_C_bad_dash_eos2
1384
1413
  util_bad_token '/regex\\C-', :tREGEXP_BEG, "/"
1385
1414
  end
1386
1415
 
1387
- def test_yylex_regexp_escape_C_bad_eos
1416
+ def test_regexp_escape_C_bad_eos
1388
1417
  util_bad_token '/regex\\C/', :tREGEXP_BEG, "/"
1389
1418
  end
1390
1419
 
1391
- def test_yylex_regexp_escape_C_bad_eos2
1420
+ def test_regexp_escape_C_bad_eos2
1392
1421
  util_bad_token '/regex\\c', :tREGEXP_BEG, "/"
1393
1422
  end
1394
1423
 
1395
- def test_yylex_regexp_escape_M
1424
+ def test_regexp_escape_M
1396
1425
  util_lex_token('/regex\\M-x/',
1397
1426
  :tREGEXP_BEG, "/",
1398
1427
  :tSTRING_CONTENT, "regex\\M-x",
@@ -1400,7 +1429,7 @@ class TestLexer < MiniTest::Unit::TestCase
1400
1429
  :tREGEXP_OPT, "")
1401
1430
  end
1402
1431
 
1403
- def test_yylex_regexp_escape_M_C
1432
+ def test_regexp_escape_M_C
1404
1433
  util_lex_token('/regex\\M-\\C-x/',
1405
1434
  :tREGEXP_BEG, "/",
1406
1435
  :tSTRING_CONTENT, "regex\\M-\\C-x",
@@ -1408,23 +1437,23 @@ class TestLexer < MiniTest::Unit::TestCase
1408
1437
  :tREGEXP_OPT, "")
1409
1438
  end
1410
1439
 
1411
- def test_yylex_regexp_escape_M_bad_dash
1440
+ def test_regexp_escape_M_bad_dash
1412
1441
  util_bad_token '/regex\\Mx/', :tREGEXP_BEG, "/"
1413
1442
  end
1414
1443
 
1415
- def test_yylex_regexp_escape_M_bad_dash_eos
1444
+ def test_regexp_escape_M_bad_dash_eos
1416
1445
  util_bad_token '/regex\\M-/', :tREGEXP_BEG, "/"
1417
1446
  end
1418
1447
 
1419
- def test_yylex_regexp_escape_M_bad_dash_eos2
1448
+ def test_regexp_escape_M_bad_dash_eos2
1420
1449
  util_bad_token '/regex\\M-', :tREGEXP_BEG, "/"
1421
1450
  end
1422
1451
 
1423
- def test_yylex_regexp_escape_M_bad_eos
1452
+ def test_regexp_escape_M_bad_eos
1424
1453
  util_bad_token '/regex\\M/', :tREGEXP_BEG, "/"
1425
1454
  end
1426
1455
 
1427
- def test_yylex_regexp_escape_backslash_slash
1456
+ def test_regexp_escape_backslash_slash
1428
1457
  util_lex_token('/\\//',
1429
1458
  :tREGEXP_BEG, "/",
1430
1459
  :tSTRING_CONTENT, '\\/',
@@ -1432,43 +1461,43 @@ class TestLexer < MiniTest::Unit::TestCase
1432
1461
  :tREGEXP_OPT, "")
1433
1462
  end
1434
1463
 
1435
- def test_yylex_regexp_escape_backslash_terminator
1464
+ def test_regexp_escape_backslash_terminator
1436
1465
  util_lex_token('%r%blah\\%blah%',
1437
- :tREGEXP_BEG, "%r",
1466
+ :tREGEXP_BEG, "%r%",
1438
1467
  :tSTRING_CONTENT, "blah\\%blah",
1439
1468
  :tSTRING_END, "%",
1440
1469
  :tREGEXP_OPT, "")
1441
1470
  end
1442
1471
 
1443
- def test_yylex_regexp_escape_backslash_terminator_meta1
1472
+ def test_regexp_escape_backslash_terminator_meta1
1444
1473
  util_lex_token('%r{blah\\}blah}',
1445
- :tREGEXP_BEG, "%r",
1474
+ :tREGEXP_BEG, "%r{",
1446
1475
  :tSTRING_CONTENT, "blah\\}blah",
1447
1476
  :tSTRING_END, "}",
1448
1477
  :tREGEXP_OPT, "")
1449
1478
  end
1450
1479
 
1451
- def test_yylex_regexp_escape_backslash_terminator_meta2
1480
+ def test_regexp_escape_backslash_terminator_meta2
1452
1481
  util_lex_token('%r/blah\\/blah/',
1453
- :tREGEXP_BEG, "%r",
1482
+ :tREGEXP_BEG, "%r/",
1454
1483
  :tSTRING_CONTENT, "blah\\/blah",
1455
1484
  :tSTRING_END, "/",
1456
1485
  :tREGEXP_OPT, "")
1457
1486
  end
1458
1487
 
1459
- def test_yylex_regexp_escape_backslash_terminator_meta3
1488
+ def test_regexp_escape_backslash_terminator_meta3
1460
1489
  util_lex_token('%r/blah\\%blah/',
1461
- :tREGEXP_BEG, "%r",
1490
+ :tREGEXP_BEG, "%r/",
1462
1491
  :tSTRING_CONTENT, "blah\\%blah",
1463
1492
  :tSTRING_END, "/",
1464
1493
  :tREGEXP_OPT, "")
1465
1494
  end
1466
1495
 
1467
- def test_yylex_regexp_escape_bad_eos
1496
+ def test_regexp_escape_bad_eos
1468
1497
  util_bad_token '/regex\\', :tREGEXP_BEG, "/"
1469
1498
  end
1470
1499
 
1471
- def test_yylex_regexp_escape_bs
1500
+ def test_regexp_escape_bs
1472
1501
  util_lex_token('/regex\\\\regex/',
1473
1502
  :tREGEXP_BEG, "/",
1474
1503
  :tSTRING_CONTENT, "regex\\\\regex",
@@ -1476,7 +1505,7 @@ class TestLexer < MiniTest::Unit::TestCase
1476
1505
  :tREGEXP_OPT, "")
1477
1506
  end
1478
1507
 
1479
- def test_yylex_regexp_escape_c
1508
+ def test_regexp_escape_c
1480
1509
  util_lex_token('/regex\\cxxx/',
1481
1510
  :tREGEXP_BEG, "/",
1482
1511
  :tSTRING_CONTENT, "regex\\cxxx",
@@ -1484,7 +1513,7 @@ class TestLexer < MiniTest::Unit::TestCase
1484
1513
  :tREGEXP_OPT, "")
1485
1514
  end
1486
1515
 
1487
- def test_yylex_regexp_escape_c_backslash
1516
+ def test_regexp_escape_c_backslash
1488
1517
  util_lex_token('/regex\\c\\n/',
1489
1518
  :tREGEXP_BEG, "/",
1490
1519
  :tSTRING_CONTENT, "regex\\c\\n",
@@ -1492,7 +1521,7 @@ class TestLexer < MiniTest::Unit::TestCase
1492
1521
  :tREGEXP_OPT, "")
1493
1522
  end
1494
1523
 
1495
- def test_yylex_regexp_escape_chars
1524
+ def test_regexp_escape_chars
1496
1525
  util_lex_token('/re\\tge\\nxp/',
1497
1526
  :tREGEXP_BEG, "/",
1498
1527
  :tSTRING_CONTENT, "re\\tge\\nxp",
@@ -1500,7 +1529,7 @@ class TestLexer < MiniTest::Unit::TestCase
1500
1529
  :tREGEXP_OPT, "")
1501
1530
  end
1502
1531
 
1503
- def test_yylex_regexp_escape_double_backslash
1532
+ def test_regexp_escape_double_backslash
1504
1533
  regexp = '/[\\/\\\\]$/'
1505
1534
  util_lex_token(regexp,
1506
1535
  :tREGEXP_BEG, "/",
@@ -1509,7 +1538,7 @@ class TestLexer < MiniTest::Unit::TestCase
1509
1538
  :tREGEXP_OPT, "")
1510
1539
  end
1511
1540
 
1512
- def test_yylex_regexp_escape_hex
1541
+ def test_regexp_escape_hex
1513
1542
  util_lex_token('/regex\\x61xp/',
1514
1543
  :tREGEXP_BEG, "/",
1515
1544
  :tSTRING_CONTENT, "regex\\x61xp",
@@ -1517,11 +1546,11 @@ class TestLexer < MiniTest::Unit::TestCase
1517
1546
  :tREGEXP_OPT, "")
1518
1547
  end
1519
1548
 
1520
- def test_yylex_regexp_escape_hex_bad
1549
+ def test_regexp_escape_hex_bad
1521
1550
  util_bad_token '/regex\\xzxp/', :tREGEXP_BEG, "/"
1522
1551
  end
1523
1552
 
1524
- def test_yylex_regexp_escape_hex_one
1553
+ def test_regexp_escape_hex_one
1525
1554
  util_lex_token('/^[\\xd\\xa]{2}/on',
1526
1555
  :tREGEXP_BEG, '/',
1527
1556
  :tSTRING_CONTENT, '^[\\xd\\xa]{2}',
@@ -1529,7 +1558,7 @@ class TestLexer < MiniTest::Unit::TestCase
1529
1558
  :tREGEXP_OPT, 'on')
1530
1559
  end
1531
1560
 
1532
- def test_yylex_regexp_escape_oct1
1561
+ def test_regexp_escape_oct1
1533
1562
  util_lex_token('/regex\\0xp/',
1534
1563
  :tREGEXP_BEG, "/",
1535
1564
  :tSTRING_CONTENT, "regex\\0xp",
@@ -1537,7 +1566,7 @@ class TestLexer < MiniTest::Unit::TestCase
1537
1566
  :tREGEXP_OPT, "")
1538
1567
  end
1539
1568
 
1540
- def test_yylex_regexp_escape_oct2
1569
+ def test_regexp_escape_oct2
1541
1570
  util_lex_token('/regex\\07xp/',
1542
1571
  :tREGEXP_BEG, "/",
1543
1572
  :tSTRING_CONTENT, "regex\\07xp",
@@ -1545,7 +1574,7 @@ class TestLexer < MiniTest::Unit::TestCase
1545
1574
  :tREGEXP_OPT, "")
1546
1575
  end
1547
1576
 
1548
- def test_yylex_regexp_escape_oct3
1577
+ def test_regexp_escape_oct3
1549
1578
  util_lex_token('/regex\\10142/',
1550
1579
  :tREGEXP_BEG, "/",
1551
1580
  :tSTRING_CONTENT, "regex\\10142",
@@ -1553,7 +1582,7 @@ class TestLexer < MiniTest::Unit::TestCase
1553
1582
  :tREGEXP_OPT, "")
1554
1583
  end
1555
1584
 
1556
- def test_yylex_regexp_escape_return
1585
+ def test_regexp_escape_return
1557
1586
  util_lex_token("/regex\\\nregex/",
1558
1587
  :tREGEXP_BEG, "/",
1559
1588
  :tSTRING_CONTENT, "regexregex",
@@ -1561,7 +1590,7 @@ class TestLexer < MiniTest::Unit::TestCase
1561
1590
  :tREGEXP_OPT, "")
1562
1591
  end
1563
1592
 
1564
- def test_yylex_regexp_nm
1593
+ def test_regexp_nm
1565
1594
  util_lex_token("/.*/nm",
1566
1595
  :tREGEXP_BEG, "/",
1567
1596
  :tSTRING_CONTENT, ".*",
@@ -1569,25 +1598,25 @@ class TestLexer < MiniTest::Unit::TestCase
1569
1598
  :tREGEXP_OPT, "nm")
1570
1599
  end
1571
1600
 
1572
- def test_yylex_rparen
1601
+ def test_rparen
1573
1602
  util_lex_token ")", :tRPAREN, ")"
1574
1603
  end
1575
1604
 
1576
- def test_yylex_rshft
1605
+ def test_rshft
1577
1606
  util_lex_token("a >> 2",
1578
1607
  :tIDENTIFIER, "a",
1579
1608
  :tRSHFT, ">>",
1580
1609
  :tINTEGER, 2)
1581
1610
  end
1582
1611
 
1583
- def test_yylex_rshft_equals
1612
+ def test_rshft_equals
1584
1613
  util_lex_token("a >>= 2",
1585
1614
  :tIDENTIFIER, "a",
1586
1615
  :tOP_ASGN, ">>",
1587
1616
  :tINTEGER, 2)
1588
1617
  end
1589
1618
 
1590
- def test_yylex_star
1619
+ def test_star
1591
1620
  util_lex_token("a * ",
1592
1621
  :tIDENTIFIER, "a",
1593
1622
  :tSTAR2, "*")
@@ -1595,7 +1624,7 @@ class TestLexer < MiniTest::Unit::TestCase
1595
1624
  assert_equal :expr_beg, @lex.state
1596
1625
  end
1597
1626
 
1598
- def test_yylex_star2
1627
+ def test_star2
1599
1628
  util_lex_token("a ** ",
1600
1629
  :tIDENTIFIER, "a",
1601
1630
  :tPOW, "**")
@@ -1603,7 +1632,7 @@ class TestLexer < MiniTest::Unit::TestCase
1603
1632
  assert_equal :expr_beg, @lex.state
1604
1633
  end
1605
1634
 
1606
- def test_yylex_star2_equals
1635
+ def test_star2_equals
1607
1636
  util_lex_token("a **= ",
1608
1637
  :tIDENTIFIER, "a",
1609
1638
  :tOP_ASGN, "**")
@@ -1611,7 +1640,7 @@ class TestLexer < MiniTest::Unit::TestCase
1611
1640
  assert_equal :expr_beg, @lex.state
1612
1641
  end
1613
1642
 
1614
- def test_yylex_star_arg
1643
+ def test_star_arg
1615
1644
  @lex.state = :expr_arg
1616
1645
 
1617
1646
  util_lex_token(" *a",
@@ -1621,7 +1650,7 @@ class TestLexer < MiniTest::Unit::TestCase
1621
1650
  assert_equal :expr_arg, @lex.state
1622
1651
  end
1623
1652
 
1624
- def test_yylex_star_arg_beg
1653
+ def test_star_arg_beg
1625
1654
  @lex.state = :expr_beg
1626
1655
 
1627
1656
  util_lex_token("*a",
@@ -1631,7 +1660,7 @@ class TestLexer < MiniTest::Unit::TestCase
1631
1660
  assert_equal :expr_arg, @lex.state
1632
1661
  end
1633
1662
 
1634
- def test_yylex_star_arg_beg_fname
1663
+ def test_star_arg_beg_fname
1635
1664
  @lex.state = :expr_fname
1636
1665
 
1637
1666
  util_lex_token("*a",
@@ -1641,7 +1670,7 @@ class TestLexer < MiniTest::Unit::TestCase
1641
1670
  assert_equal :expr_arg, @lex.state
1642
1671
  end
1643
1672
 
1644
- def test_yylex_star_equals
1673
+ def test_star_equals
1645
1674
  util_lex_token("a *= ",
1646
1675
  :tIDENTIFIER, "a",
1647
1676
  :tOP_ASGN, "*")
@@ -1649,97 +1678,97 @@ class TestLexer < MiniTest::Unit::TestCase
1649
1678
  assert_equal :expr_beg, @lex.state
1650
1679
  end
1651
1680
 
1652
- def test_yylex_string_bad_eos
1681
+ def test_string_bad_eos
1653
1682
  util_bad_token('%',
1654
1683
  :tSTRING_BEG, '%')
1655
1684
  end
1656
1685
 
1657
- def test_yylex_string_bad_eos_quote
1686
+ def test_string_bad_eos_quote
1658
1687
  util_bad_token('%{nest',
1659
1688
  :tSTRING_BEG, '%}')
1660
1689
  end
1661
1690
 
1662
- def test_yylex_string_double
1691
+ def test_string_double
1663
1692
  util_lex_token('"string"',
1664
1693
  :tSTRING, "string")
1665
1694
  end
1666
1695
 
1667
- def test_yylex_string_double_escape_C
1696
+ def test_string_double_escape_C
1668
1697
  util_lex_token('"\\C-a"',
1669
1698
  :tSTRING, "\001")
1670
1699
  end
1671
1700
 
1672
- def test_yylex_string_double_escape_C_backslash
1701
+ def test_string_double_escape_C_backslash
1673
1702
  util_lex_token('"\\C-\\\\"',
1674
1703
  :tSTRING, "\034")
1675
1704
  end
1676
1705
 
1677
- def test_yylex_string_double_escape_C_escape
1706
+ def test_string_double_escape_C_escape
1678
1707
  util_lex_token('"\\C-\\M-a"',
1679
1708
  :tSTRING, "\201")
1680
1709
  end
1681
1710
 
1682
- def test_yylex_string_double_escape_C_question
1711
+ def test_string_double_escape_C_question
1683
1712
  util_lex_token('"\\C-?"',
1684
1713
  :tSTRING, "\177")
1685
1714
  end
1686
1715
 
1687
- def test_yylex_string_double_escape_M
1716
+ def test_string_double_escape_M
1688
1717
  util_lex_token('"\\M-a"',
1689
1718
  :tSTRING, "\341")
1690
1719
  end
1691
1720
 
1692
- def test_yylex_string_double_escape_M_backslash
1721
+ def test_string_double_escape_M_backslash
1693
1722
  util_lex_token('"\\M-\\\\"',
1694
1723
  :tSTRING, "\334")
1695
1724
  end
1696
1725
 
1697
- def test_yylex_string_double_escape_M_escape
1726
+ def test_string_double_escape_M_escape
1698
1727
  util_lex_token('"\\M-\\C-a"',
1699
1728
  :tSTRING, "\201")
1700
1729
  end
1701
1730
 
1702
- def test_yylex_string_double_escape_bs1
1731
+ def test_string_double_escape_bs1
1703
1732
  util_lex_token('"a\\a\\a"',
1704
1733
  :tSTRING, "a\a\a")
1705
1734
  end
1706
1735
 
1707
- def test_yylex_string_double_escape_bs2
1736
+ def test_string_double_escape_bs2
1708
1737
  util_lex_token('"a\\\\a"',
1709
1738
  :tSTRING, "a\\a")
1710
1739
  end
1711
1740
 
1712
- def test_yylex_string_double_escape_c
1741
+ def test_string_double_escape_c
1713
1742
  util_lex_token('"\\ca"',
1714
1743
  :tSTRING, "\001")
1715
1744
  end
1716
1745
 
1717
- def test_yylex_string_double_escape_c_escape
1746
+ def test_string_double_escape_c_escape
1718
1747
  util_lex_token('"\\c\\M-a"',
1719
1748
  :tSTRING, "\201")
1720
1749
  end
1721
1750
 
1722
- def test_yylex_string_double_escape_c_question
1751
+ def test_string_double_escape_c_question
1723
1752
  util_lex_token('"\\c?"',
1724
1753
  :tSTRING, "\177")
1725
1754
  end
1726
1755
 
1727
- def test_yylex_string_double_escape_chars
1756
+ def test_string_double_escape_chars
1728
1757
  util_lex_token('"s\\tri\\ng"',
1729
1758
  :tSTRING, "s\tri\ng")
1730
1759
  end
1731
1760
 
1732
- def test_yylex_string_double_escape_hex
1761
+ def test_string_double_escape_hex
1733
1762
  util_lex_token('"n = \\x61\\x62\\x63"',
1734
1763
  :tSTRING, "n = abc")
1735
1764
  end
1736
1765
 
1737
- def test_yylex_string_double_escape_octal
1766
+ def test_string_double_escape_octal
1738
1767
  util_lex_token('"n = \\101\\102\\103"',
1739
1768
  :tSTRING, "n = ABC")
1740
1769
  end
1741
1770
 
1742
- def test_yylex_string_double_interp
1771
+ def test_string_double_interp
1743
1772
  util_lex_token("\"blah #x a \#@a b \#$b c \#{3} # \"",
1744
1773
  :tSTRING_BEG, "\"",
1745
1774
  :tSTRING_CONTENT, "blah #x a ",
@@ -1756,12 +1785,12 @@ class TestLexer < MiniTest::Unit::TestCase
1756
1785
  :tSTRING_END, "\"")
1757
1786
  end
1758
1787
 
1759
- def test_yylex_string_double_nested_curlies
1788
+ def test_string_double_nested_curlies
1760
1789
  util_lex_token('%{nest{one{two}one}nest}',
1761
1790
  :tSTRING, "nest{one{two}one}nest")
1762
1791
  end
1763
1792
 
1764
- def test_yylex_string_double_no_interp
1793
+ def test_string_double_no_interp
1765
1794
  util_lex_token("\"# blah\"", # pound first
1766
1795
  :tSTRING, "# blah")
1767
1796
 
@@ -1769,19 +1798,19 @@ class TestLexer < MiniTest::Unit::TestCase
1769
1798
  :tSTRING, "blah # blah")
1770
1799
  end
1771
1800
 
1772
- def test_yylex_string_escape_x_single
1801
+ def test_string_escape_x_single
1773
1802
  util_lex_token('"\\x0"',
1774
1803
  :tSTRING, "\000")
1775
1804
  end
1776
1805
 
1777
- def test_yylex_string_pct_Q
1806
+ def test_string_pct_Q
1778
1807
  util_lex_token("%Q[s1 s2]",
1779
1808
  :tSTRING, "s1 s2")
1780
1809
  end
1781
1810
 
1782
- def test_yylex_string_pct_W
1811
+ def test_string_pct_W
1783
1812
  util_lex_token("%W[s1 s2\ns3]", # TODO: add interpolation to these
1784
- :tWORDS_BEG, "%W",
1813
+ :tWORDS_BEG, "%W[",
1785
1814
  :tSTRING_CONTENT, "s1",
1786
1815
  :tSPACE, nil,
1787
1816
  :tSTRING_CONTENT, "s2",
@@ -1791,9 +1820,9 @@ class TestLexer < MiniTest::Unit::TestCase
1791
1820
  :tSTRING_END, ']')
1792
1821
  end
1793
1822
 
1794
- def test_yylex_string_pct_W_bs_nl
1823
+ def test_string_pct_W_bs_nl
1795
1824
  util_lex_token("%W[s1 \\\ns2]", # TODO: add interpolation to these
1796
- :tWORDS_BEG, "%W",
1825
+ :tWORDS_BEG, "%W[",
1797
1826
  :tSTRING_CONTENT, "s1",
1798
1827
  :tSPACE, nil,
1799
1828
  :tSTRING_CONTENT, "\ns2",
@@ -1801,28 +1830,28 @@ class TestLexer < MiniTest::Unit::TestCase
1801
1830
  :tSTRING_END, ']')
1802
1831
  end
1803
1832
 
1804
- def test_yylex_string_pct_angle
1833
+ def test_string_pct_angle
1805
1834
  util_lex_token("%<blah>",
1806
1835
  :tSTRING, "blah")
1807
1836
  end
1808
1837
 
1809
- def test_yylex_string_pct_other
1838
+ def test_string_pct_other
1810
1839
  util_lex_token("%%blah%",
1811
1840
  :tSTRING, "blah")
1812
1841
  end
1813
1842
 
1814
- def test_yylex_string_pct_w
1843
+ def test_string_pct_w
1815
1844
  util_bad_token("%w[s1 s2 ",
1816
- :tQWORDS_BEG, "%w",
1845
+ :tQWORDS_BEG, "%w[",
1817
1846
  :tSTRING_CONTENT, "s1",
1818
1847
  :tSPACE, nil,
1819
1848
  :tSTRING_CONTENT, "s2",
1820
1849
  :tSPACE, nil)
1821
1850
  end
1822
1851
 
1823
- def test_yylex_string_pct_w_bs_nl
1852
+ def test_string_pct_w_bs_nl
1824
1853
  util_lex_token("%w[s1 \\\ns2]",
1825
- :tQWORDS_BEG, "%w",
1854
+ :tQWORDS_BEG, "%w[",
1826
1855
  :tSTRING_CONTENT, "s1",
1827
1856
  :tSPACE, nil,
1828
1857
  :tSTRING_CONTENT, "\ns2",
@@ -1830,9 +1859,9 @@ class TestLexer < MiniTest::Unit::TestCase
1830
1859
  :tSTRING_END, ']')
1831
1860
  end
1832
1861
 
1833
- def test_yylex_string_pct_w_bs_sp
1862
+ def test_string_pct_w_bs_sp
1834
1863
  util_lex_token("%w[s\\ 1 s\\ 2]",
1835
- :tQWORDS_BEG, "%w",
1864
+ :tQWORDS_BEG, "%w[",
1836
1865
  :tSTRING_CONTENT, "s 1",
1837
1866
  :tSPACE, nil,
1838
1867
  :tSTRING_CONTENT, "s 2",
@@ -1840,9 +1869,9 @@ class TestLexer < MiniTest::Unit::TestCase
1840
1869
  :tSTRING_END, ']')
1841
1870
  end
1842
1871
 
1843
- def test_yylex_string_pct_w_tab
1872
+ def test_string_pct_w_tab
1844
1873
  util_lex_token("%w[abc\tdef]",
1845
- :tQWORDS_BEG, "%w",
1874
+ :tQWORDS_BEG, "%w[",
1846
1875
  :tSTRING_CONTENT, "abc",
1847
1876
  :tSPACE, nil,
1848
1877
  :tSTRING_CONTENT, "def",
@@ -1850,42 +1879,45 @@ class TestLexer < MiniTest::Unit::TestCase
1850
1879
  :tSTRING_END, ']')
1851
1880
  end
1852
1881
 
1853
- def test_yylex_string_single
1882
+ def test_string_single
1854
1883
  util_lex_token("'string'",
1855
1884
  :tSTRING, "string")
1856
1885
  end
1857
1886
 
1858
- def test_yylex_string_single_escape_chars
1887
+ def test_string_single_escape_chars
1859
1888
  util_lex_token("'s\\tri\\ng'",
1860
1889
  :tSTRING, "s\\tri\\ng")
1861
1890
  end
1862
1891
 
1863
- def test_yylex_string_single_nl
1892
+ def test_string_single_nl
1864
1893
  util_lex_token("'blah\\\nblah'",
1865
- :tSTRING, "blah\\\nblah")
1894
+ :tSTRING_BEG, "'",
1895
+ :tSTRING_CONTENT, "blah\\\n",
1896
+ :tSTRING_CONTENT, "blah",
1897
+ :tSTRING_END, "'")
1866
1898
  end
1867
1899
 
1868
- def test_yylex_symbol
1900
+ def test_symbol
1869
1901
  util_lex_token(":symbol",
1870
1902
  :tSYMBOL, "symbol")
1871
1903
  end
1872
1904
 
1873
- def test_yylex_symbol_bad_zero
1905
+ def test_symbol_bad_zero
1874
1906
  util_bad_token(":\"blah\0\"",
1875
1907
  :tSYMBEG, ":")
1876
1908
  end
1877
1909
 
1878
- def test_yylex_symbol_double
1910
+ def test_symbol_double
1879
1911
  util_lex_token(":\"symbol\"",
1880
1912
  :tSYMBOL, "symbol")
1881
1913
  end
1882
1914
 
1883
- def test_yylex_symbol_single
1915
+ def test_symbol_single
1884
1916
  util_lex_token(":'symbol'",
1885
1917
  :tSYMBOL, "symbol")
1886
1918
  end
1887
1919
 
1888
- def test_yylex_ternary
1920
+ def test_ternary
1889
1921
  util_lex_token("a ? b : c",
1890
1922
  :tIDENTIFIER, "a",
1891
1923
  :tEH, "?",
@@ -1911,39 +1943,42 @@ class TestLexer < MiniTest::Unit::TestCase
1911
1943
  :tEH, "?")
1912
1944
  end
1913
1945
 
1914
- def test_yylex_tilde
1946
+ def test_tilde
1915
1947
  util_lex_token "~", :tTILDE, "~"
1916
1948
  end
1917
1949
 
1918
- def test_yylex_tilde_unary
1950
+ def test_tilde_unary
1919
1951
  @lex.state = :expr_fname
1920
1952
  util_lex_token "~@", :tTILDE, "~@"
1921
1953
  end
1922
1954
 
1923
- def test_yylex_uminus
1955
+ def test_uminus
1924
1956
  util_lex_token("-blah",
1925
1957
  :tUMINUS, "-",
1926
1958
  :tIDENTIFIER, "blah")
1927
1959
  end
1928
1960
 
1929
- def test_yylex_underscore
1961
+ def test_underscore
1930
1962
  util_lex_token("_var", :tIDENTIFIER, "_var")
1931
1963
  end
1932
1964
 
1933
- def test_yylex_underscore_end
1934
- @lex.source = "__END__\n"
1965
+ def test_underscore_end
1966
+ source_buffer = Parser::Source::Buffer.new('(underscore_end)')
1967
+ source_buffer.source = "__END__\n"
1968
+
1969
+ @lex.source_buffer = source_buffer
1935
1970
 
1936
1971
  tok, = @lex.advance
1937
1972
  refute tok
1938
1973
  end
1939
1974
 
1940
- def test_yylex_uplus
1975
+ def test_uplus
1941
1976
  util_lex_token("+blah",
1942
1977
  :tUPLUS, "+",
1943
1978
  :tIDENTIFIER, "blah")
1944
1979
  end
1945
1980
 
1946
- def test_yylex_if_unless_mod
1981
+ def test_if_unless_mod
1947
1982
  util_lex_token("return if true unless false",
1948
1983
  :kRETURN, "return",
1949
1984
  :kIF_MOD, "if",
@@ -1952,7 +1987,7 @@ class TestLexer < MiniTest::Unit::TestCase
1952
1987
  :kFALSE, "false")
1953
1988
  end
1954
1989
 
1955
- def test_yylex_if_stmt
1990
+ def test_if_stmt
1956
1991
  util_lex_token("if true\n return end",
1957
1992
  :kIF, "if",
1958
1993
  :kTRUE, "true",
@@ -1961,9 +1996,9 @@ class TestLexer < MiniTest::Unit::TestCase
1961
1996
  :kEND, "end")
1962
1997
  end
1963
1998
 
1964
- def test_yylex_static_env
1999
+ def test_static_env
1965
2000
  env = Parser::StaticEnvironment.new
1966
- env.declare :a
2001
+ env.declare "a"
1967
2002
 
1968
2003
  @lex.static_env = env
1969
2004
 
@@ -1973,4 +2008,213 @@ class TestLexer < MiniTest::Unit::TestCase
1973
2008
  :tINTEGER, 42,
1974
2009
  :tRBRACK, "]")
1975
2010
  end
2011
+
2012
+ #
2013
+ # Tests for bugs.
2014
+ #
2015
+ # These tests should be moved from nursery and properly
2016
+ # categorized when it's clear how to do that.
2017
+ #
2018
+
2019
+ def test_bug_sclass_joined
2020
+ util_lex_token("class<<self",
2021
+ :kCLASS, "class",
2022
+ :tLSHFT, "<<",
2023
+ :kSELF, "self")
2024
+ end
2025
+
2026
+ def test_bug_expr_beg_div
2027
+ @lex.state = :expr_beg
2028
+ util_lex_token("/=/",
2029
+ :tREGEXP_BEG, "/",
2030
+ :tSTRING_CONTENT, "=",
2031
+ :tSTRING_END, "/",
2032
+ :tREGEXP_OPT, "")
2033
+
2034
+ @lex.state = :expr_beg
2035
+ util_lex_token("/ = /",
2036
+ :tREGEXP_BEG, "/",
2037
+ :tSTRING_CONTENT, " = ",
2038
+ :tSTRING_END, "/",
2039
+ :tREGEXP_OPT, "")
2040
+ end
2041
+
2042
+ def test_bug_expr_beg_percent
2043
+ @lex.state = :expr_beg
2044
+ util_lex_token("%=foo=",
2045
+ :tSTRING, "foo")
2046
+
2047
+ @lex.state = :expr_beg
2048
+ util_lex_token("% = ",
2049
+ :tSTRING, "=")
2050
+ end
2051
+
2052
+ def test_bug_expr_beg_document
2053
+ @lex.state = :expr_beg
2054
+ util_lex_token(" \n=begin\n=end\nend",
2055
+ :kEND, "end")
2056
+
2057
+ end
2058
+
2059
+ def test_bug_expr_beg_number
2060
+ @lex.state = :expr_beg
2061
+ util_lex_token("86400_000_000",
2062
+ :tINTEGER, 86400000000)
2063
+ end
2064
+
2065
+ def test_bug_expr_beg_backspace_nl
2066
+ @lex.state = :expr_beg
2067
+ util_lex_token("\n/foo/",
2068
+ :tREGEXP_BEG, "/",
2069
+ :tSTRING_CONTENT, "foo",
2070
+ :tSTRING_END, "/",
2071
+ :tREGEXP_OPT, "")
2072
+ end
2073
+
2074
+ def test_bug_expr_arg_percent
2075
+ @lex.state = :expr_arg
2076
+ util_lex_token("%[",
2077
+ :tPERCENT, "%",
2078
+ :tLBRACK, "[")
2079
+
2080
+ @lex.state = :expr_arg
2081
+ util_lex_token("%=1",
2082
+ :tOP_ASGN, "%",
2083
+ :tINTEGER, 1)
2084
+
2085
+ @lex.state = :expr_arg
2086
+ util_lex_token(" %[1]",
2087
+ :tSTRING, "1")
2088
+
2089
+ @lex.state = :expr_arg
2090
+ util_lex_token(" %=1=",
2091
+ :tOP_ASGN, "%",
2092
+ :tINTEGER, 1,
2093
+ :tEQL, "=")
2094
+ end
2095
+
2096
+ def test_bug_expr_arg_lt_lt
2097
+ @lex.state = :expr_arg
2098
+ util_lex_token("<<EOS\nEOS",
2099
+ :tLSHFT, "<<",
2100
+ :tCONSTANT, "EOS",
2101
+ :tNL, nil,
2102
+ :tCONSTANT, "EOS")
2103
+
2104
+ @lex.state = :expr_arg
2105
+ util_lex_token(" <<EOS\nEOS",
2106
+ :tSTRING_BEG, "\"",
2107
+ :tSTRING_END, "EOS",
2108
+ :tNL, nil)
2109
+ end
2110
+
2111
+ def test_bug_expr_arg_slash
2112
+ @lex.state = :expr_arg
2113
+ util_lex_token("/1",
2114
+ :tDIVIDE, "/",
2115
+ :tINTEGER, 1)
2116
+
2117
+ @lex.state = :expr_arg
2118
+ util_lex_token("/ 1",
2119
+ :tDIVIDE, "/",
2120
+ :tINTEGER, 1)
2121
+
2122
+ @lex.state = :expr_arg
2123
+ util_lex_token(" /1/",
2124
+ :tREGEXP_BEG, "/",
2125
+ :tSTRING_CONTENT, "1",
2126
+ :tSTRING_END, "/",
2127
+ :tREGEXP_OPT, "")
2128
+
2129
+ @lex.state = :expr_arg
2130
+ util_lex_token(" / 1",
2131
+ :tDIVIDE, "/",
2132
+ :tINTEGER, 1)
2133
+ end
2134
+
2135
+ def test_bug_heredoc_continuation
2136
+ @lex.state = :expr_arg
2137
+ util_lex_token(" <<EOS\nEOS\nend",
2138
+ :tSTRING_BEG, "\"",
2139
+ :tSTRING_END, "EOS",
2140
+ :tNL, nil,
2141
+ :kEND, "end")
2142
+ end
2143
+
2144
+ def test_bug_eh_symbol_no_newline
2145
+ util_lex_token("?\"\nfoo",
2146
+ :tINTEGER, 34,
2147
+ :tNL, nil,
2148
+ :tIDENTIFIER, "foo")
2149
+ end
2150
+
2151
+ def test_bug_expr_arg_newline
2152
+ @lex.state = :expr_arg
2153
+ util_lex_token("\nfoo",
2154
+ :tNL, nil,
2155
+ :tIDENTIFIER, "foo")
2156
+
2157
+ @lex.state = :expr_arg
2158
+ util_lex_token(" \nfoo",
2159
+ :tNL, nil,
2160
+ :tIDENTIFIER, "foo")
2161
+
2162
+ @lex.state = :expr_arg
2163
+ util_lex_token("#foo\nfoo",
2164
+ :tNL, nil,
2165
+ :tIDENTIFIER, "foo")
2166
+ end
2167
+
2168
+ def test_bug_heredoc_backspace_nl
2169
+ util_lex_token(" <<'XXX'\nf \\\nXXX\n",
2170
+ :tSTRING_BEG, "'",
2171
+ :tSTRING_CONTENT, "f \\\n",
2172
+ :tSTRING_END, "XXX",
2173
+ :tNL, nil)
2174
+ end
2175
+
2176
+ def test_bug_expr_dot_comment
2177
+ util_lex_token("foo. #bar\nbaz",
2178
+ :tIDENTIFIER, 'foo',
2179
+ :tDOT, '.',
2180
+ :tIDENTIFIER, 'baz')
2181
+ end
2182
+
2183
+ def test_bug_expr_mid_comment
2184
+ util_lex_token("rescue #bar\nprint",
2185
+ :kRESCUE, 'rescue',
2186
+ :tNL, nil,
2187
+ :tIDENTIFIER, 'print')
2188
+ end
2189
+
2190
+ def test_bug_expr_end_colon
2191
+ util_lex_token("'foo':'bar'",
2192
+ :tSTRING, 'foo',
2193
+ :tCOLON, ':',
2194
+ :tSTRING, 'bar')
2195
+ end
2196
+
2197
+ def test_bug_symbol_newline
2198
+ util_lex_token(":foo\n",
2199
+ :tSYMBOL, 'foo',
2200
+ :tNL, nil)
2201
+
2202
+ util_lex_token(":foo=\n",
2203
+ :tSYMBOL, 'foo=',
2204
+ :tNL, nil)
2205
+ end
2206
+
2207
+ def test_bug_ragel_stack
2208
+ util_lex_token("\"\#{$2 ? $2 : 1}\"",
2209
+ :tSTRING_BEG, "\"",
2210
+ :tSTRING_DBEG, "\#{",
2211
+ :tNTH_REF, 2,
2212
+ :tEH, "?",
2213
+ :tNTH_REF, 2,
2214
+ :tCOLON, ":",
2215
+ :tINTEGER, 1,
2216
+ :tRCURLY, "}",
2217
+ :tSTRING_END, "\"")
2218
+ end
2219
+
1976
2220
  end