parser 2.0.0.pre2 → 2.0.0.pre3
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.
- checksums.yaml +4 -4
- data/.yardopts +2 -2
- data/CHANGELOG.md +55 -0
- data/Gemfile +0 -2
- data/README.md +58 -4
- data/lib/gauntlet_parser.rb +121 -0
- data/lib/parser.rb +31 -24
- data/lib/parser/ast/node.rb +6 -4
- data/lib/parser/ast/processor.rb +3 -0
- data/lib/parser/base.rb +18 -17
- data/lib/parser/builders/default.rb +61 -9
- data/lib/parser/compatibility/ruby1_8.rb +7 -0
- data/lib/parser/diagnostic.rb +18 -5
- data/lib/parser/diagnostic/engine.rb +12 -11
- data/lib/parser/lexer.rl +288 -133
- data/lib/parser/lexer/explanation.rb +1 -1
- data/lib/parser/lexer/literal.rb +49 -17
- data/lib/parser/rewriter.rb +2 -0
- data/lib/parser/ruby18.y +1 -17
- data/lib/parser/ruby19.y +7 -18
- data/lib/parser/ruby20.y +9 -28
- data/lib/parser/ruby21.y +11 -34
- data/lib/parser/runner.rb +6 -1
- data/lib/parser/source/buffer.rb +44 -21
- data/lib/parser/source/comment.rb +35 -0
- data/lib/parser/source/comment/associator.rb +3 -0
- data/lib/parser/source/map.rb +2 -4
- data/lib/parser/source/range.rb +7 -0
- data/lib/parser/source/rewriter.rb +3 -0
- data/lib/parser/source/rewriter/action.rb +3 -0
- data/lib/parser/syntax_error.rb +7 -2
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +2 -0
- data/test/parse_helper.rb +5 -3
- data/test/test_encoding.rb +29 -0
- data/test/test_lexer.rb +780 -514
- data/test/test_parser.rb +185 -11
- metadata +17 -2
@@ -1,17 +1,29 @@
|
|
1
1
|
module Parser
|
2
2
|
module Source
|
3
3
|
|
4
|
+
##
|
5
|
+
# @api public
|
6
|
+
#
|
7
|
+
# @!attribute [r] text
|
8
|
+
# @return String
|
9
|
+
#
|
10
|
+
# @!attribute [r] location
|
11
|
+
# @return Parser::Source::Range
|
4
12
|
class Comment
|
5
13
|
attr_reader :text
|
6
14
|
|
7
15
|
attr_reader :location
|
8
16
|
alias_method :loc, :location
|
9
17
|
|
18
|
+
##
|
19
|
+
# @see Parser::Source::Comment::Associator
|
10
20
|
def self.associate(ast, comments)
|
11
21
|
associator = Associator.new(comments, ast)
|
12
22
|
associator.associate
|
13
23
|
end
|
14
24
|
|
25
|
+
##
|
26
|
+
# @param [Parser::Source::Range] location
|
15
27
|
def initialize(location)
|
16
28
|
@location = location
|
17
29
|
@text = location.source.freeze
|
@@ -19,6 +31,18 @@ module Parser
|
|
19
31
|
freeze
|
20
32
|
end
|
21
33
|
|
34
|
+
##
|
35
|
+
# Returns the type of this comment.
|
36
|
+
#
|
37
|
+
# * Inline comments correspond to `:inline`:
|
38
|
+
#
|
39
|
+
# # whatever
|
40
|
+
#
|
41
|
+
# * Block comments correspond to `:document`:
|
42
|
+
#
|
43
|
+
# =begin
|
44
|
+
# hi i am a document
|
45
|
+
# =end
|
22
46
|
def type
|
23
47
|
case text
|
24
48
|
when /^#/
|
@@ -28,14 +52,25 @@ module Parser
|
|
28
52
|
end
|
29
53
|
end
|
30
54
|
|
55
|
+
##
|
56
|
+
# @see [#type]
|
57
|
+
# @return [TrueClass|FalseClass]
|
31
58
|
def inline?
|
32
59
|
type == :inline
|
33
60
|
end
|
34
61
|
|
62
|
+
##
|
63
|
+
# @see [#type]
|
64
|
+
# @return [TrueClass|FalseClass]
|
35
65
|
def document?
|
36
66
|
type == :document
|
37
67
|
end
|
38
68
|
|
69
|
+
##
|
70
|
+
# Compares comments. Two comments are identical if they
|
71
|
+
# correspond to the same source range.
|
72
|
+
# @param [Object] other
|
73
|
+
# @return [TrueClass|FalseClass]
|
39
74
|
def ==(other)
|
40
75
|
other.is_a?(Source::Comment) &&
|
41
76
|
@location == other.location
|
data/lib/parser/source/map.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
module Parser
|
2
2
|
module Source
|
3
3
|
|
4
|
-
|
5
|
-
#
|
6
|
-
# ASTs; if it can be extracted from source given only the other
|
7
|
-
# stored information, don't store it.
|
4
|
+
##
|
5
|
+
# @api public
|
8
6
|
#
|
9
7
|
class Map
|
10
8
|
attr_reader :expression
|
data/lib/parser/source/range.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
module Parser
|
2
2
|
module Source
|
3
3
|
|
4
|
+
##
|
5
|
+
# @api public
|
6
|
+
#
|
4
7
|
class Range
|
5
8
|
attr_reader :source_buffer
|
6
9
|
attr_reader :begin_pos, :end_pos
|
@@ -64,6 +67,10 @@ module Parser
|
|
64
67
|
[@source_buffer.name, line, column + 1].join(':')
|
65
68
|
end
|
66
69
|
|
70
|
+
def resize(new_size)
|
71
|
+
Range.new(@source_buffer, @begin_pos, @begin_pos + new_size)
|
72
|
+
end
|
73
|
+
|
67
74
|
def join(other)
|
68
75
|
Range.new(@source_buffer,
|
69
76
|
[@begin_pos, other.begin_pos].min,
|
data/lib/parser/syntax_error.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
module Parser
|
2
2
|
##
|
3
|
-
# {Parser::SyntaxError} is raised whenever parser detects a syntax error
|
4
|
-
#
|
3
|
+
# {Parser::SyntaxError} is raised whenever parser detects a syntax error,
|
4
|
+
# similar to the standard SyntaxError class.
|
5
|
+
#
|
6
|
+
# @api public
|
7
|
+
#
|
8
|
+
# @!attribute [r] diagnostic
|
9
|
+
# @return [Parser::Diagnostic]
|
5
10
|
#
|
6
11
|
class SyntaxError < StandardError
|
7
12
|
attr_reader :diagnostic
|
data/lib/parser/version.rb
CHANGED
data/parser.gemspec
CHANGED
data/test/parse_helper.rb
CHANGED
@@ -74,9 +74,11 @@ module ParseHelper
|
|
74
74
|
begin
|
75
75
|
parsed_ast = parser.parse(source_file)
|
76
76
|
rescue => exc
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
backtrace = exc.backtrace
|
78
|
+
Exception.instance_method(:initialize).bind(exc).
|
79
|
+
call("(#{version}) #{exc.message}")
|
80
|
+
exc.set_backtrace(backtrace)
|
81
|
+
raise
|
80
82
|
end
|
81
83
|
|
82
84
|
assert_equal ast, parsed_ast,
|
data/test/test_encoding.rb
CHANGED
@@ -3,11 +3,15 @@
|
|
3
3
|
require 'helper'
|
4
4
|
|
5
5
|
class TestEncoding < Minitest::Test
|
6
|
+
include AST::Sexp
|
7
|
+
|
6
8
|
def recognize(string)
|
7
9
|
Parser::Source::Buffer.recognize_encoding(string)
|
8
10
|
end
|
9
11
|
|
10
12
|
if defined?(Encoding)
|
13
|
+
require 'parser/all'
|
14
|
+
|
11
15
|
def test_default
|
12
16
|
assert_equal nil, recognize('foobar')
|
13
17
|
end
|
@@ -45,5 +49,30 @@ class TestEncoding < Minitest::Test
|
|
45
49
|
assert_equal nil, recognize('# codingkoi8-r')
|
46
50
|
assert_equal nil, recognize('# coding koi8-r')
|
47
51
|
end
|
52
|
+
|
53
|
+
def test_utf8_mac
|
54
|
+
assert_equal Encoding::UTF8_MAC, recognize('# coding: utf8-mac')
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_suffix
|
58
|
+
assert_equal Encoding::UTF_8, recognize('# coding: utf-8-dos')
|
59
|
+
assert_equal Encoding::UTF_8, recognize('# coding: utf-8-unix')
|
60
|
+
assert_equal Encoding::UTF_8, recognize('# coding: utf-8-mac')
|
61
|
+
|
62
|
+
assert_raises(ArgumentError) do
|
63
|
+
assert_equal nil, recognize('# coding: utf-8-dicks')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_parse_18_invalid_enc
|
68
|
+
ast = Parser::Ruby18.parse("# encoding:feynman-diagram\n1")
|
69
|
+
assert_equal ast, s(:int, 1)
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_parse_19_invalid_enc
|
73
|
+
assert_raises(ArgumentError) do
|
74
|
+
Parser::Ruby19.parse("# encoding:feynman-diagram\n1")
|
75
|
+
end
|
76
|
+
end
|
48
77
|
end
|
49
78
|
end
|
data/test/test_lexer.rb
CHANGED
@@ -16,19 +16,36 @@ class TestLexer < Minitest::Test
|
|
16
16
|
setup_lexer 18
|
17
17
|
end
|
18
18
|
|
19
|
+
#
|
20
|
+
# Tools
|
21
|
+
#
|
22
|
+
|
23
|
+
def utf(str)
|
24
|
+
if str.respond_to?(:force_encoding)
|
25
|
+
str.force_encoding(Encoding::UTF_8)
|
26
|
+
else
|
27
|
+
str
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
19
31
|
#
|
20
32
|
# Additional matchers
|
21
33
|
#
|
22
34
|
|
23
|
-
def
|
35
|
+
def refute_scanned(s, *args)
|
24
36
|
assert_raises Parser::SyntaxError do
|
25
|
-
|
37
|
+
assert_scanned(s, *args)
|
26
38
|
end
|
27
39
|
end
|
28
40
|
|
29
|
-
def
|
30
|
-
source_buffer = Parser::Source::Buffer.new('(
|
31
|
-
|
41
|
+
def assert_escape(expected, input)
|
42
|
+
source_buffer = Parser::Source::Buffer.new('(assert_escape)')
|
43
|
+
|
44
|
+
if defined?(Encoding)
|
45
|
+
source_buffer.source = "\"\\#{input}\"".encode(input.encoding)
|
46
|
+
else
|
47
|
+
source_buffer.source = "\"\\#{input}\""
|
48
|
+
end
|
32
49
|
|
33
50
|
@lex.reset
|
34
51
|
@lex.source_buffer = source_buffer
|
@@ -36,7 +53,7 @@ class TestLexer < Minitest::Test
|
|
36
53
|
lex_token, (lex_value, *) = @lex.advance
|
37
54
|
|
38
55
|
if lex_value.respond_to?(:force_encoding)
|
39
|
-
lex_value.force_encoding(
|
56
|
+
lex_value.force_encoding(Encoding::BINARY)
|
40
57
|
end
|
41
58
|
|
42
59
|
assert_equal [:tSTRING, expected],
|
@@ -44,21 +61,21 @@ class TestLexer < Minitest::Test
|
|
44
61
|
source_buffer.source
|
45
62
|
end
|
46
63
|
|
47
|
-
def
|
64
|
+
def refute_escape(input)
|
48
65
|
assert_raises Parser::SyntaxError do
|
49
66
|
@lex.state = :expr_beg
|
50
|
-
|
67
|
+
assert_scanned "%Q[\\#{input}]"
|
51
68
|
end
|
52
69
|
end
|
53
70
|
|
54
|
-
def
|
55
|
-
|
71
|
+
def assert_lex_fname(name, type)
|
72
|
+
assert_scanned("def #{name} ", :kDEF, 'def', type, name)
|
56
73
|
|
57
74
|
assert_equal :expr_endfn, @lex.state
|
58
75
|
end
|
59
76
|
|
60
|
-
def
|
61
|
-
source_buffer = Parser::Source::Buffer.new('(
|
77
|
+
def assert_scanned(input, *args)
|
78
|
+
source_buffer = Parser::Source::Buffer.new('(assert_scanned)')
|
62
79
|
source_buffer.source = input
|
63
80
|
|
64
81
|
@lex.reset(false)
|
@@ -81,103 +98,107 @@ class TestLexer < Minitest::Test
|
|
81
98
|
#
|
82
99
|
|
83
100
|
def test_read_escape
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
101
|
+
assert_escape "\\", "\\"
|
102
|
+
assert_escape "\n", "n"
|
103
|
+
assert_escape "\t", "t"
|
104
|
+
assert_escape "\r", "r"
|
105
|
+
assert_escape "\f", "f"
|
106
|
+
assert_escape "\13", "v"
|
107
|
+
assert_escape "\0", "0"
|
108
|
+
assert_escape "\07", "a"
|
109
|
+
assert_escape "\007", "a"
|
110
|
+
assert_escape "\033", "e"
|
111
|
+
assert_escape "\377", "377"
|
112
|
+
assert_escape "\377", "xff"
|
113
|
+
assert_escape "\010", "b"
|
114
|
+
assert_escape " ", "s"
|
115
|
+
assert_escape "q", "q" # plain vanilla escape
|
99
116
|
end
|
100
117
|
|
101
118
|
def test_read_escape_c
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
119
|
+
assert_escape "\030", "C-x"
|
120
|
+
assert_escape "\030", "cx"
|
121
|
+
assert_escape "\230", 'C-\M-x'
|
122
|
+
assert_escape "\230", 'c\M-x'
|
106
123
|
|
107
|
-
|
108
|
-
|
124
|
+
assert_escape "\177", "C-?"
|
125
|
+
assert_escape "\177", "c?"
|
126
|
+
assert_escape "\r", "cM"
|
109
127
|
end
|
110
128
|
|
111
129
|
def test_read_escape_m
|
112
|
-
|
113
|
-
|
114
|
-
|
130
|
+
assert_escape "\370", "M-x"
|
131
|
+
assert_escape "\230", 'M-\C-x'
|
132
|
+
assert_escape "\230", 'M-\cx'
|
115
133
|
end
|
116
134
|
|
117
135
|
def test_read_escape_errors
|
118
|
-
|
136
|
+
refute_escape ""
|
119
137
|
|
120
|
-
|
121
|
-
|
122
|
-
|
138
|
+
refute_escape "M"
|
139
|
+
refute_escape "M-"
|
140
|
+
refute_escape "Mx"
|
123
141
|
|
124
|
-
|
125
|
-
|
126
|
-
|
142
|
+
refute_escape "Cx"
|
143
|
+
refute_escape "C"
|
144
|
+
refute_escape "C-"
|
127
145
|
|
128
|
-
|
146
|
+
refute_escape "c"
|
129
147
|
end
|
130
148
|
|
131
149
|
def test_read_escape_unicode__19
|
132
150
|
if RUBY_VERSION >= '1.9'
|
133
|
-
|
151
|
+
assert_escape "\x09", 'u{9}'
|
152
|
+
assert_escape "\x31", 'u{31}'
|
153
|
+
assert_escape "\x09\x01", 'u{9 1}'
|
134
154
|
|
135
|
-
|
155
|
+
assert_escape "\xc4\xa3", utf('u0123')
|
156
|
+
assert_escape "\xc4\xa3\xc3\xb0\xeb\x84\xa3", utf('u{123 f0 B123}')
|
136
157
|
end
|
137
158
|
end
|
138
159
|
|
139
160
|
def test_read_escape_unicode_bad__19
|
140
161
|
if RUBY_VERSION >= '1.9'
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
162
|
+
refute_escape 'u123'
|
163
|
+
refute_escape 'u{}'
|
164
|
+
refute_escape 'u{123 f0h}'
|
165
|
+
refute_escape 'u{123 f0'
|
145
166
|
end
|
146
167
|
end
|
147
168
|
|
148
169
|
def test_ambiguous_uminus
|
149
|
-
|
170
|
+
assert_scanned("m -3",
|
150
171
|
:tIDENTIFIER, "m",
|
151
172
|
:tUMINUS_NUM, "-",
|
152
173
|
:tINTEGER, 3)
|
153
174
|
end
|
154
175
|
|
155
176
|
def test_ambiguous_uplus
|
156
|
-
|
177
|
+
assert_scanned("m +3",
|
157
178
|
:tIDENTIFIER, "m",
|
158
179
|
:tINTEGER, 3)
|
159
180
|
end
|
160
181
|
|
161
182
|
def test_and
|
162
|
-
|
183
|
+
assert_scanned "&", :tAMPER, "&"
|
163
184
|
end
|
164
185
|
|
165
186
|
def test_and2
|
166
187
|
@lex.state = :expr_end
|
167
188
|
|
168
|
-
|
189
|
+
assert_scanned "&&", :tANDOP, "&&"
|
169
190
|
end
|
170
191
|
|
171
192
|
def test_and2_equals
|
172
193
|
@lex.state = :expr_end
|
173
194
|
|
174
|
-
|
195
|
+
assert_scanned "&&=", :tOP_ASGN, "&&"
|
175
196
|
end
|
176
197
|
|
177
198
|
def test_and_arg
|
178
199
|
@lex.state = :expr_arg
|
179
200
|
|
180
|
-
|
201
|
+
assert_scanned(" &y",
|
181
202
|
:tAMPER, "&",
|
182
203
|
:tIDENTIFIER, "y")
|
183
204
|
end
|
@@ -185,35 +206,35 @@ class TestLexer < Minitest::Test
|
|
185
206
|
def test_and_equals
|
186
207
|
@lex.state = :expr_end
|
187
208
|
|
188
|
-
|
209
|
+
assert_scanned "&=", :tOP_ASGN, "&"
|
189
210
|
end
|
190
211
|
|
191
212
|
def test_and_expr
|
192
213
|
@lex.state = :expr_arg
|
193
214
|
|
194
|
-
|
215
|
+
assert_scanned("x & y",
|
195
216
|
:tIDENTIFIER, "x",
|
196
217
|
:tAMPER2, "&",
|
197
218
|
:tIDENTIFIER, "y")
|
198
219
|
end
|
199
220
|
|
200
221
|
def test_and_meth
|
201
|
-
|
222
|
+
assert_lex_fname "&", :tAMPER2
|
202
223
|
end
|
203
224
|
|
204
225
|
def test_assoc
|
205
|
-
|
226
|
+
assert_scanned "=>", :tASSOC, "=>"
|
206
227
|
end
|
207
228
|
|
208
229
|
def test_label__18
|
209
|
-
|
230
|
+
assert_scanned("{a:b",
|
210
231
|
:tLBRACE, "{",
|
211
232
|
:tIDENTIFIER, "a",
|
212
233
|
:tSYMBOL, "b")
|
213
234
|
end
|
214
235
|
|
215
236
|
def test_label_in_params__18
|
216
|
-
|
237
|
+
assert_scanned("foo(a:b",
|
217
238
|
:tIDENTIFIER, "foo",
|
218
239
|
:tLPAREN2, "(",
|
219
240
|
:tIDENTIFIER, "a",
|
@@ -223,7 +244,7 @@ class TestLexer < Minitest::Test
|
|
223
244
|
def test_label__19
|
224
245
|
setup_lexer 19
|
225
246
|
|
226
|
-
|
247
|
+
assert_scanned("{a:b",
|
227
248
|
:tLBRACE, "{",
|
228
249
|
:tLABEL, "a",
|
229
250
|
:tIDENTIFIER, "b")
|
@@ -232,7 +253,7 @@ class TestLexer < Minitest::Test
|
|
232
253
|
def test_label_in_params__19
|
233
254
|
setup_lexer 19
|
234
255
|
|
235
|
-
|
256
|
+
assert_scanned("foo(a:b",
|
236
257
|
:tIDENTIFIER, "foo",
|
237
258
|
:tLPAREN2, "(",
|
238
259
|
:tLABEL, "a",
|
@@ -242,7 +263,7 @@ class TestLexer < Minitest::Test
|
|
242
263
|
def test_label_fid__19
|
243
264
|
setup_lexer 19
|
244
265
|
|
245
|
-
|
266
|
+
assert_scanned("{a?:true",
|
246
267
|
:tLBRACE, '{',
|
247
268
|
:tLABEL, 'a?',
|
248
269
|
:kTRUE, 'true')
|
@@ -256,7 +277,7 @@ class TestLexer < Minitest::Test
|
|
256
277
|
token = "k#{keyword.upcase}".to_sym
|
257
278
|
|
258
279
|
@lex.reset
|
259
|
-
|
280
|
+
assert_scanned("#{keyword} a:b",
|
260
281
|
token, keyword,
|
261
282
|
:tIDENTIFIER, "a",
|
262
283
|
:tSYMBOL, "b")
|
@@ -270,7 +291,7 @@ class TestLexer < Minitest::Test
|
|
270
291
|
token = "k#{keyword.upcase}_MOD".to_sym
|
271
292
|
|
272
293
|
@lex.state = :expr_end
|
273
|
-
|
294
|
+
assert_scanned("#{keyword} a:b",
|
274
295
|
token, keyword,
|
275
296
|
:tLABEL, "a",
|
276
297
|
:tIDENTIFIER, "b")
|
@@ -278,7 +299,7 @@ class TestLexer < Minitest::Test
|
|
278
299
|
end
|
279
300
|
|
280
301
|
def test_back_ref
|
281
|
-
|
302
|
+
assert_scanned("[$&, $`, $', $+]",
|
282
303
|
:tLBRACK, "[",
|
283
304
|
:tBACK_REF, "$&", :tCOMMA, ",",
|
284
305
|
:tBACK_REF, "$`", :tCOMMA, ",",
|
@@ -288,19 +309,19 @@ class TestLexer < Minitest::Test
|
|
288
309
|
end
|
289
310
|
|
290
311
|
def test_backslash
|
291
|
-
|
312
|
+
assert_scanned("1 \\\n+ 2",
|
292
313
|
:tINTEGER, 1,
|
293
314
|
:tPLUS, "+",
|
294
315
|
:tINTEGER, 2)
|
295
316
|
end
|
296
317
|
|
297
318
|
def test_backslash_bad
|
298
|
-
|
319
|
+
refute_scanned("1 \\ + 2",
|
299
320
|
:tINTEGER, 1)
|
300
321
|
end
|
301
322
|
|
302
323
|
def test_backtick
|
303
|
-
|
324
|
+
assert_scanned("`ls`",
|
304
325
|
:tXSTRING_BEG, "`",
|
305
326
|
:tSTRING_CONTENT, "ls",
|
306
327
|
:tSTRING_END, "`")
|
@@ -308,14 +329,14 @@ class TestLexer < Minitest::Test
|
|
308
329
|
|
309
330
|
def test_backtick_cmdarg
|
310
331
|
@lex.state = :expr_dot
|
311
|
-
|
332
|
+
assert_scanned("\n`", :tBACK_REF2, "`") # \n ensures expr_cmd
|
312
333
|
|
313
334
|
assert_equal :expr_arg, @lex.state
|
314
335
|
end
|
315
336
|
|
316
337
|
def test_backtick_dot
|
317
338
|
@lex.state = :expr_dot
|
318
|
-
|
339
|
+
assert_scanned("a.`(3)",
|
319
340
|
:tIDENTIFIER, "a",
|
320
341
|
:tDOT, ".",
|
321
342
|
:tBACK_REF2, "`",
|
@@ -326,70 +347,70 @@ class TestLexer < Minitest::Test
|
|
326
347
|
|
327
348
|
def test_backtick_method
|
328
349
|
@lex.state = :expr_fname
|
329
|
-
|
350
|
+
assert_scanned("`", :tBACK_REF2, "`")
|
330
351
|
assert_equal :expr_endfn, @lex.state
|
331
352
|
end
|
332
353
|
|
333
354
|
def test_bad_char
|
334
|
-
|
355
|
+
refute_scanned(" \010 ")
|
335
356
|
end
|
336
357
|
|
337
358
|
def test_bang
|
338
|
-
|
359
|
+
assert_scanned "!", :tBANG, "!"
|
339
360
|
end
|
340
361
|
|
341
362
|
def test_bang_equals
|
342
|
-
|
363
|
+
assert_scanned "!=", :tNEQ, "!="
|
343
364
|
end
|
344
365
|
|
345
366
|
def test_bang_tilde
|
346
|
-
|
367
|
+
assert_scanned "!~", :tNMATCH, "!~"
|
347
368
|
end
|
348
369
|
|
349
370
|
def test_def_ubang
|
350
371
|
setup_lexer(20)
|
351
372
|
|
352
373
|
@lex.state = :expr_fname
|
353
|
-
|
374
|
+
assert_scanned '!@', :tBANG, '!@'
|
354
375
|
end
|
355
376
|
|
356
377
|
def test_carat
|
357
|
-
|
378
|
+
assert_scanned "^", :tCARET, "^"
|
358
379
|
end
|
359
380
|
|
360
381
|
def test_carat_equals
|
361
|
-
|
382
|
+
assert_scanned "^=", :tOP_ASGN, "^"
|
362
383
|
end
|
363
384
|
|
364
385
|
def test_colon2
|
365
|
-
|
386
|
+
assert_scanned("A::B",
|
366
387
|
:tCONSTANT, "A",
|
367
388
|
:tCOLON2, "::",
|
368
389
|
:tCONSTANT, "B")
|
369
390
|
|
370
391
|
@lex.state = :expr_arg
|
371
|
-
|
392
|
+
assert_scanned("::Array",
|
372
393
|
:tCOLON2, "::",
|
373
394
|
:tCONSTANT, "Array")
|
374
395
|
end
|
375
396
|
|
376
397
|
def test_colon3
|
377
|
-
|
398
|
+
assert_scanned("::Array",
|
378
399
|
:tCOLON3, "::",
|
379
400
|
:tCONSTANT, "Array")
|
380
401
|
|
381
402
|
@lex.state = :expr_arg
|
382
|
-
|
403
|
+
assert_scanned(" ::Array",
|
383
404
|
:tCOLON3, "::",
|
384
405
|
:tCONSTANT, "Array")
|
385
406
|
end
|
386
407
|
|
387
408
|
def test_comma
|
388
|
-
|
409
|
+
assert_scanned ",", :tCOMMA, ","
|
389
410
|
end
|
390
411
|
|
391
412
|
def test_comment
|
392
|
-
|
413
|
+
assert_scanned("1 # one\n# two\n2",
|
393
414
|
:tINTEGER, 1,
|
394
415
|
:tNL, nil,
|
395
416
|
:tINTEGER, 2)
|
@@ -400,24 +421,24 @@ class TestLexer < Minitest::Test
|
|
400
421
|
end
|
401
422
|
|
402
423
|
def test_comment_expr_beg
|
403
|
-
|
424
|
+
assert_scanned("{#1\n}",
|
404
425
|
:tLBRACE, "{",
|
405
426
|
:tRCURLY, "}")
|
406
427
|
end
|
407
428
|
|
408
429
|
def test_comment_begin
|
409
|
-
|
430
|
+
assert_scanned("=begin\nblah\nblah\n=end\n42",
|
410
431
|
:tINTEGER, 42)
|
411
432
|
assert_equal 1, @lex.comments.length
|
412
433
|
assert_equal "=begin\nblah\nblah\n=end\n", @lex.comments[0].text
|
413
434
|
end
|
414
435
|
|
415
436
|
def test_comment_begin_bad
|
416
|
-
|
437
|
+
refute_scanned("=begin\nblah\nblah\n")
|
417
438
|
end
|
418
439
|
|
419
440
|
def test_comment_begin_not_comment
|
420
|
-
|
441
|
+
assert_scanned("beginfoo = 5\np x \\\n=beginfoo",
|
421
442
|
:tIDENTIFIER, "beginfoo",
|
422
443
|
:tEQL, "=",
|
423
444
|
:tINTEGER, 5,
|
@@ -429,58 +450,58 @@ class TestLexer < Minitest::Test
|
|
429
450
|
end
|
430
451
|
|
431
452
|
def test_comment_begin_space
|
432
|
-
|
453
|
+
assert_scanned("=begin blah\nblah\n=end\n")
|
433
454
|
|
434
455
|
assert_equal 1, @lex.comments.length
|
435
456
|
assert_equal "=begin blah\nblah\n=end\n", @lex.comments[0].text
|
436
457
|
end
|
437
458
|
|
438
459
|
def test_comment_end_space_and_text
|
439
|
-
|
460
|
+
assert_scanned("=begin blah\nblah\n=end blab\n")
|
440
461
|
|
441
462
|
assert_equal 1, @lex.comments.length
|
442
463
|
assert_equal "=begin blah\nblah\n=end blab\n", @lex.comments[0].text
|
443
464
|
end
|
444
465
|
|
445
466
|
def test_comment_eos
|
446
|
-
|
467
|
+
assert_scanned("# comment")
|
447
468
|
end
|
448
469
|
|
449
470
|
def test_constant
|
450
|
-
|
471
|
+
assert_scanned("ArgumentError",
|
451
472
|
:tCONSTANT, "ArgumentError")
|
452
473
|
end
|
453
474
|
|
454
475
|
def test_constant_semi
|
455
|
-
|
476
|
+
assert_scanned("ArgumentError;",
|
456
477
|
:tCONSTANT, "ArgumentError",
|
457
478
|
:tSEMI, ";")
|
458
479
|
end
|
459
480
|
|
460
481
|
def test_cvar
|
461
|
-
|
482
|
+
assert_scanned "@@blah", :tCVAR, "@@blah"
|
462
483
|
end
|
463
484
|
|
464
485
|
def test_cvar_bad
|
465
|
-
|
486
|
+
refute_scanned "@@1"
|
466
487
|
end
|
467
488
|
|
468
489
|
def test_div
|
469
|
-
|
490
|
+
assert_scanned("a / 2",
|
470
491
|
:tIDENTIFIER, "a",
|
471
492
|
:tDIVIDE, "/",
|
472
493
|
:tINTEGER, 2)
|
473
494
|
end
|
474
495
|
|
475
496
|
def test_div_equals
|
476
|
-
|
497
|
+
assert_scanned("a /= 2",
|
477
498
|
:tIDENTIFIER, "a",
|
478
499
|
:tOP_ASGN, "/",
|
479
500
|
:tINTEGER, 2)
|
480
501
|
end
|
481
502
|
|
482
503
|
def test_do
|
483
|
-
|
504
|
+
assert_scanned("x do 42 end",
|
484
505
|
:tIDENTIFIER, "x",
|
485
506
|
:kDO, "do",
|
486
507
|
:tINTEGER, 42,
|
@@ -490,7 +511,7 @@ class TestLexer < Minitest::Test
|
|
490
511
|
def test_do_cond
|
491
512
|
@lex.cond.push(true)
|
492
513
|
|
493
|
-
|
514
|
+
assert_scanned("x do 42 end",
|
494
515
|
:tIDENTIFIER, "x",
|
495
516
|
:kDO_COND, "do",
|
496
517
|
:tINTEGER, 42,
|
@@ -500,7 +521,7 @@ class TestLexer < Minitest::Test
|
|
500
521
|
def test_do_block
|
501
522
|
@lex.state = :expr_endarg
|
502
523
|
|
503
|
-
|
524
|
+
assert_scanned("do 42 end",
|
504
525
|
:kDO_BLOCK, "do",
|
505
526
|
:tINTEGER, 42,
|
506
527
|
:kEND, "end")
|
@@ -509,7 +530,7 @@ class TestLexer < Minitest::Test
|
|
509
530
|
def test_do_cond
|
510
531
|
@lex.cond.push true
|
511
532
|
|
512
|
-
|
533
|
+
assert_scanned("x do 42 end",
|
513
534
|
:tIDENTIFIER, "x",
|
514
535
|
:kDO_COND, "do",
|
515
536
|
:tINTEGER, 42,
|
@@ -517,150 +538,150 @@ class TestLexer < Minitest::Test
|
|
517
538
|
end
|
518
539
|
|
519
540
|
def test_dot
|
520
|
-
|
541
|
+
assert_scanned ".", :tDOT, "."
|
521
542
|
end
|
522
543
|
|
523
544
|
def test_dot2
|
524
|
-
|
545
|
+
assert_scanned "..", :tDOT2, ".."
|
525
546
|
end
|
526
547
|
|
527
548
|
def test_dot3
|
528
|
-
|
549
|
+
assert_scanned "...", :tDOT3, "..."
|
529
550
|
end
|
530
551
|
|
531
552
|
def test_equals
|
532
|
-
|
553
|
+
assert_scanned "=", :tEQL, "="
|
533
554
|
end
|
534
555
|
|
535
556
|
def test_equals2
|
536
|
-
|
557
|
+
assert_scanned "==", :tEQ, "=="
|
537
558
|
end
|
538
559
|
|
539
560
|
def test_equals3
|
540
|
-
|
561
|
+
assert_scanned "===", :tEQQ, "==="
|
541
562
|
end
|
542
563
|
|
543
564
|
def test_equals_tilde
|
544
|
-
|
565
|
+
assert_scanned "=~", :tMATCH, "=~"
|
545
566
|
end
|
546
567
|
|
547
568
|
def test_float
|
548
|
-
|
569
|
+
assert_scanned "1.0", :tFLOAT, 1.0
|
549
570
|
end
|
550
571
|
|
551
572
|
def test_float_bad_no_underscores
|
552
|
-
|
573
|
+
refute_scanned "1__0.0"
|
553
574
|
end
|
554
575
|
|
555
576
|
def test_float_bad_no_zero_leading
|
556
|
-
|
577
|
+
refute_scanned ".0"
|
557
578
|
end
|
558
579
|
|
559
580
|
def test_float_bad_trailing_underscore
|
560
|
-
|
581
|
+
refute_scanned "123_.0"
|
561
582
|
end
|
562
583
|
|
563
584
|
def test_float_call
|
564
|
-
|
585
|
+
assert_scanned("1.0.to_s",
|
565
586
|
:tFLOAT, 1.0,
|
566
587
|
:tDOT, ".",
|
567
588
|
:tIDENTIFIER, "to_s")
|
568
589
|
end
|
569
590
|
|
570
591
|
def test_float_dot_E
|
571
|
-
|
592
|
+
assert_scanned "1.0E10", :tFLOAT, 1.0e10
|
572
593
|
end
|
573
594
|
|
574
595
|
def test_float_dot_E_neg
|
575
|
-
|
596
|
+
assert_scanned("-1.0E10",
|
576
597
|
:tUMINUS_NUM, "-",
|
577
598
|
:tFLOAT, 1.0e10)
|
578
599
|
end
|
579
600
|
|
580
601
|
def test_float_dot_e
|
581
|
-
|
602
|
+
assert_scanned "1.0e10", :tFLOAT, 1.0e10
|
582
603
|
end
|
583
604
|
|
584
605
|
def test_float_dot_e_neg
|
585
|
-
|
606
|
+
assert_scanned("-1.0e10",
|
586
607
|
:tUMINUS_NUM, "-",
|
587
608
|
:tFLOAT, 1.0e10)
|
588
609
|
end
|
589
610
|
|
590
611
|
def test_float_e
|
591
|
-
|
612
|
+
assert_scanned "1e10", :tFLOAT, 1e10
|
592
613
|
end
|
593
614
|
|
594
615
|
def test_float_e_bad_trailing_underscore
|
595
|
-
|
616
|
+
refute_scanned "123_e10"
|
596
617
|
end
|
597
618
|
|
598
619
|
def test_float_e_minus
|
599
|
-
|
620
|
+
assert_scanned "1e-10", :tFLOAT, 1e-10
|
600
621
|
end
|
601
622
|
|
602
623
|
def test_float_e_neg
|
603
|
-
|
624
|
+
assert_scanned("-1e10",
|
604
625
|
:tUMINUS_NUM, "-",
|
605
626
|
:tFLOAT, 1e10)
|
606
627
|
end
|
607
628
|
|
608
629
|
def test_float_e_neg_minus
|
609
|
-
|
630
|
+
assert_scanned("-1e-10",
|
610
631
|
:tUMINUS_NUM, "-",
|
611
632
|
:tFLOAT, 1e-10)
|
612
633
|
end
|
613
634
|
|
614
635
|
def test_float_e_neg_plus
|
615
|
-
|
636
|
+
assert_scanned("-1e+10",
|
616
637
|
:tUMINUS_NUM, "-",
|
617
638
|
:tFLOAT, 1e10)
|
618
639
|
end
|
619
640
|
|
620
641
|
def test_float_e_plus
|
621
|
-
|
642
|
+
assert_scanned "1e+10", :tFLOAT, 1e10
|
622
643
|
end
|
623
644
|
|
624
645
|
def test_float_e_zero
|
625
|
-
|
646
|
+
assert_scanned "0e0", :tFLOAT, 0e0
|
626
647
|
end
|
627
648
|
|
628
649
|
def test_float_neg
|
629
|
-
|
650
|
+
assert_scanned("-1.0",
|
630
651
|
:tUMINUS_NUM, "-",
|
631
652
|
:tFLOAT, 1.0)
|
632
653
|
end
|
633
654
|
|
634
655
|
def test_ge
|
635
|
-
|
656
|
+
assert_scanned("a >= 2",
|
636
657
|
:tIDENTIFIER, "a",
|
637
658
|
:tGEQ, ">=",
|
638
659
|
:tINTEGER, 2)
|
639
660
|
end
|
640
661
|
|
641
662
|
def test_global
|
642
|
-
|
663
|
+
assert_scanned("$blah", :tGVAR, "$blah")
|
643
664
|
end
|
644
665
|
|
645
666
|
def test_global_backref
|
646
|
-
|
667
|
+
assert_scanned("$`", :tBACK_REF, "$`")
|
647
668
|
end
|
648
669
|
|
649
670
|
# This was removed in 2.1.
|
650
671
|
# def test_global_dash_nothing
|
651
|
-
#
|
672
|
+
# assert_scanned("$- ", :tGVAR, "$-")
|
652
673
|
# end
|
653
674
|
|
654
675
|
def test_global_dash_something
|
655
|
-
|
676
|
+
assert_scanned("$-x", :tGVAR, "$-x")
|
656
677
|
end
|
657
678
|
|
658
679
|
def test_global_number
|
659
|
-
|
680
|
+
assert_scanned("$10", :tNTH_REF, 10)
|
660
681
|
end
|
661
682
|
|
662
683
|
def test_global_other
|
663
|
-
|
684
|
+
assert_scanned("[$~, $*, $$, $?, $!, $@, $/, $\\, $;, $,, $., $=, $:, $<, $>, $\"]",
|
664
685
|
:tLBRACK, "[",
|
665
686
|
:tGVAR, "$~", :tCOMMA, ",",
|
666
687
|
:tGVAR, "$*", :tCOMMA, ",",
|
@@ -682,28 +703,28 @@ class TestLexer < Minitest::Test
|
|
682
703
|
end
|
683
704
|
|
684
705
|
def test_global_underscore
|
685
|
-
|
706
|
+
assert_scanned("$_",
|
686
707
|
:tGVAR, "$_")
|
687
708
|
end
|
688
709
|
|
689
710
|
def test_global_wierd
|
690
|
-
|
711
|
+
assert_scanned("$__blah",
|
691
712
|
:tGVAR, "$__blah")
|
692
713
|
end
|
693
714
|
|
694
715
|
def test_global_zero
|
695
|
-
|
716
|
+
assert_scanned("$0", :tGVAR, "$0")
|
696
717
|
end
|
697
718
|
|
698
719
|
def test_gt
|
699
|
-
|
720
|
+
assert_scanned("a > 2",
|
700
721
|
:tIDENTIFIER, "a",
|
701
722
|
:tGT, ">",
|
702
723
|
:tINTEGER, 2)
|
703
724
|
end
|
704
725
|
|
705
726
|
def test_heredoc_backtick
|
706
|
-
|
727
|
+
assert_scanned("a = <<`EOF`\n blah blah\nEOF\n",
|
707
728
|
:tIDENTIFIER, "a",
|
708
729
|
:tEQL, "=",
|
709
730
|
:tXSTRING_BEG, "`",
|
@@ -713,7 +734,7 @@ class TestLexer < Minitest::Test
|
|
713
734
|
end
|
714
735
|
|
715
736
|
def test_heredoc_double
|
716
|
-
|
737
|
+
assert_scanned("a = <<\"EOF\"\n blah blah\nEOF\n",
|
717
738
|
:tIDENTIFIER, "a",
|
718
739
|
:tEQL, "=",
|
719
740
|
:tSTRING_BEG, "\"",
|
@@ -723,7 +744,7 @@ class TestLexer < Minitest::Test
|
|
723
744
|
end
|
724
745
|
|
725
746
|
def test_heredoc_double_dash
|
726
|
-
|
747
|
+
assert_scanned("a = <<-\"EOF\"\n blah blah\n EOF\n",
|
727
748
|
:tIDENTIFIER, "a",
|
728
749
|
:tEQL, "=",
|
729
750
|
:tSTRING_BEG, "\"",
|
@@ -733,21 +754,21 @@ class TestLexer < Minitest::Test
|
|
733
754
|
end
|
734
755
|
|
735
756
|
def test_heredoc_double_eos
|
736
|
-
|
757
|
+
refute_scanned("a = <<\"EOF\"\nblah",
|
737
758
|
:tIDENTIFIER, "a",
|
738
759
|
:tEQL, "=",
|
739
760
|
:tSTRING_BEG, "\"")
|
740
761
|
end
|
741
762
|
|
742
763
|
def test_heredoc_double_eos_nl
|
743
|
-
|
764
|
+
refute_scanned("a = <<\"EOF\"\nblah\n",
|
744
765
|
:tIDENTIFIER, "a",
|
745
766
|
:tEQL, "=",
|
746
767
|
:tSTRING_BEG, "\"")
|
747
768
|
end
|
748
769
|
|
749
770
|
def test_heredoc_double_interp
|
750
|
-
|
771
|
+
assert_scanned("a = <<\"EOF\"\n#x a \#@a b \#$b c \#{3} \nEOF\n",
|
751
772
|
:tIDENTIFIER, "a",
|
752
773
|
:tEQL, "=",
|
753
774
|
:tSTRING_BEG, "\"",
|
@@ -767,7 +788,7 @@ class TestLexer < Minitest::Test
|
|
767
788
|
end
|
768
789
|
|
769
790
|
def test_heredoc_empty
|
770
|
-
|
791
|
+
assert_scanned("<<\"\"\n\#{x}\nblah2\n\n",
|
771
792
|
:tSTRING_BEG, "\"",
|
772
793
|
:tSTRING_DBEG, "\#{",
|
773
794
|
:tIDENTIFIER, "x",
|
@@ -779,7 +800,7 @@ class TestLexer < Minitest::Test
|
|
779
800
|
end
|
780
801
|
|
781
802
|
def test_heredoc_none
|
782
|
-
|
803
|
+
assert_scanned("a = <<EOF\nblah\nblah\nEOF",
|
783
804
|
:tIDENTIFIER, "a",
|
784
805
|
:tEQL, "=",
|
785
806
|
:tSTRING_BEG, "\"",
|
@@ -790,7 +811,7 @@ class TestLexer < Minitest::Test
|
|
790
811
|
end
|
791
812
|
|
792
813
|
def test_heredoc_none_dash
|
793
|
-
|
814
|
+
assert_scanned("a = <<-EOF\nblah\nblah\n EOF",
|
794
815
|
:tIDENTIFIER, "a",
|
795
816
|
:tEQL, "=",
|
796
817
|
:tSTRING_BEG, "\"",
|
@@ -801,7 +822,7 @@ class TestLexer < Minitest::Test
|
|
801
822
|
end
|
802
823
|
|
803
824
|
def test_heredoc_single
|
804
|
-
|
825
|
+
assert_scanned("a = <<'EOF'\n blah blah\nEOF\n",
|
805
826
|
:tIDENTIFIER, "a",
|
806
827
|
:tEQL, "=",
|
807
828
|
:tSTRING_BEG, "'",
|
@@ -811,14 +832,14 @@ class TestLexer < Minitest::Test
|
|
811
832
|
end
|
812
833
|
|
813
834
|
def test_heredoc_single_bad_eos_body
|
814
|
-
|
835
|
+
refute_scanned("a = <<'EOF'\nblah",
|
815
836
|
:tIDENTIFIER, "a",
|
816
837
|
:tEQL, "=",
|
817
838
|
:tSTRING_BEG, "'")
|
818
839
|
end
|
819
840
|
|
820
841
|
def test_heredoc_single_dash
|
821
|
-
|
842
|
+
assert_scanned("a = <<-'EOF'\n blah blah\n EOF\n",
|
822
843
|
:tIDENTIFIER, "a",
|
823
844
|
:tEQL, "=",
|
824
845
|
:tSTRING_BEG, "'",
|
@@ -828,7 +849,7 @@ class TestLexer < Minitest::Test
|
|
828
849
|
end
|
829
850
|
|
830
851
|
def test_heredoc_one_character
|
831
|
-
|
852
|
+
assert_scanned("a = <<E\nABCDEF\nE\n",
|
832
853
|
:tIDENTIFIER, "a",
|
833
854
|
:tEQL, "=",
|
834
855
|
:tSTRING_BEG, "\"",
|
@@ -837,66 +858,76 @@ class TestLexer < Minitest::Test
|
|
837
858
|
:tNL, nil)
|
838
859
|
end
|
839
860
|
|
861
|
+
def test_heredoc_cr
|
862
|
+
assert_scanned("a = <<E\r\r\nABCDEF\r\r\nE\r\r\r\n",
|
863
|
+
:tIDENTIFIER, "a",
|
864
|
+
:tEQL, "=",
|
865
|
+
:tSTRING_BEG, "\"",
|
866
|
+
:tSTRING_CONTENT, "ABCDEF\r\n",
|
867
|
+
:tSTRING_END, "E",
|
868
|
+
:tNL, nil)
|
869
|
+
end
|
870
|
+
|
840
871
|
def test_identifier
|
841
|
-
|
872
|
+
assert_scanned("identifier", :tIDENTIFIER, "identifier")
|
842
873
|
end
|
843
874
|
|
844
875
|
def test_identifier_bang
|
845
|
-
|
876
|
+
assert_scanned("identifier!",
|
846
877
|
:tFID, "identifier!")
|
847
878
|
|
848
|
-
|
879
|
+
assert_scanned("identifier!=",
|
849
880
|
:tFID, "identifier",
|
850
881
|
:tNEQ, "!=")
|
851
882
|
end
|
852
883
|
|
853
884
|
def test_identifier_cmp
|
854
|
-
|
885
|
+
assert_lex_fname "<=>", :tCMP
|
855
886
|
end
|
856
887
|
|
857
888
|
def test_identifier_def
|
858
|
-
|
889
|
+
assert_lex_fname "identifier", :tIDENTIFIER
|
859
890
|
end
|
860
891
|
|
861
892
|
def test_identifier_eh
|
862
|
-
|
893
|
+
assert_scanned("identifier?", :tFID, "identifier?")
|
863
894
|
end
|
864
895
|
|
865
896
|
def test_identifier_equals_arrow
|
866
|
-
|
897
|
+
assert_scanned(":blah==>",
|
867
898
|
:tSYMBOL, "blah=",
|
868
899
|
:tASSOC, "=>")
|
869
900
|
end
|
870
901
|
|
871
902
|
def test_identifier_equals3
|
872
|
-
|
903
|
+
assert_scanned(":a===b",
|
873
904
|
:tSYMBOL, "a",
|
874
905
|
:tEQQ, "===",
|
875
906
|
:tIDENTIFIER, "b")
|
876
907
|
end
|
877
908
|
|
878
909
|
def test_identifier_equals_equals_arrow
|
879
|
-
|
910
|
+
assert_scanned(":a==>b",
|
880
911
|
:tSYMBOL, "a=",
|
881
912
|
:tASSOC, "=>",
|
882
913
|
:tIDENTIFIER, "b")
|
883
914
|
end
|
884
915
|
|
885
916
|
def test_identifier_equals_caret
|
886
|
-
|
917
|
+
assert_lex_fname "^", :tCARET
|
887
918
|
end
|
888
919
|
|
889
920
|
def test_identifier_equals_def
|
890
|
-
|
921
|
+
assert_lex_fname "identifier=", :tIDENTIFIER
|
891
922
|
end
|
892
923
|
|
893
924
|
def test_identifier_equals_def2
|
894
|
-
|
925
|
+
assert_lex_fname "==", :tEQ
|
895
926
|
end
|
896
927
|
|
897
928
|
def test_identifier_equals_expr
|
898
929
|
@lex.state = :expr_dot
|
899
|
-
|
930
|
+
assert_scanned("y = arg",
|
900
931
|
:tIDENTIFIER, "y",
|
901
932
|
:tEQL, "=",
|
902
933
|
:tIDENTIFIER, "arg")
|
@@ -905,205 +936,209 @@ class TestLexer < Minitest::Test
|
|
905
936
|
end
|
906
937
|
|
907
938
|
def test_identifier_equals_or
|
908
|
-
|
939
|
+
assert_lex_fname "|", :tPIPE
|
909
940
|
end
|
910
941
|
|
911
942
|
def test_identifier_equals_slash
|
912
|
-
|
943
|
+
assert_lex_fname "/", :tDIVIDE
|
913
944
|
end
|
914
945
|
|
915
946
|
def test_identifier_equals_tilde
|
916
947
|
@lex.state = :expr_fname
|
917
|
-
|
948
|
+
assert_scanned("identifier=~",
|
918
949
|
:tIDENTIFIER, "identifier=",
|
919
950
|
:tTILDE, "~")
|
920
951
|
end
|
921
952
|
|
922
953
|
def test_identifier_gt
|
923
|
-
|
954
|
+
assert_lex_fname ">", :tGT
|
924
955
|
end
|
925
956
|
|
926
957
|
def test_identifier_le
|
927
|
-
|
958
|
+
assert_lex_fname "<=", :tLEQ
|
928
959
|
end
|
929
960
|
|
930
961
|
def test_identifier_lt
|
931
|
-
|
962
|
+
assert_lex_fname "<", :tLT
|
932
963
|
end
|
933
964
|
|
934
965
|
def test_identifier_tilde
|
935
|
-
|
966
|
+
assert_lex_fname "~", :tTILDE
|
967
|
+
end
|
968
|
+
|
969
|
+
def test_identifier_defined?
|
970
|
+
assert_lex_fname "defined?", :kDEFINED
|
936
971
|
end
|
937
972
|
|
938
973
|
def test_index
|
939
|
-
|
974
|
+
assert_lex_fname "[]", :tAREF
|
940
975
|
end
|
941
976
|
|
942
977
|
def test_index_equals
|
943
|
-
|
978
|
+
assert_lex_fname "[]=", :tASET
|
944
979
|
end
|
945
980
|
|
946
981
|
def test_integer
|
947
|
-
|
982
|
+
assert_scanned "42", :tINTEGER, 42
|
948
983
|
end
|
949
984
|
|
950
985
|
def test_integer_bin
|
951
|
-
|
986
|
+
assert_scanned "0b101010", :tINTEGER, 42
|
952
987
|
end
|
953
988
|
|
954
989
|
def test_integer_bin_bad_none
|
955
|
-
|
990
|
+
refute_scanned "0b "
|
956
991
|
end
|
957
992
|
|
958
993
|
def test_integer_bin_bad_underscores
|
959
|
-
|
994
|
+
refute_scanned "0b10__01"
|
960
995
|
end
|
961
996
|
|
962
997
|
def test_integer_dec
|
963
|
-
|
998
|
+
assert_scanned "42", :tINTEGER, 42
|
964
999
|
end
|
965
1000
|
|
966
1001
|
def test_integer_dec_bad_underscores
|
967
|
-
|
1002
|
+
refute_scanned "42__24"
|
968
1003
|
end
|
969
1004
|
|
970
1005
|
def test_integer_dec_d
|
971
|
-
|
1006
|
+
assert_scanned "0d42", :tINTEGER, 42
|
972
1007
|
end
|
973
1008
|
|
974
1009
|
def test_integer_dec_d_bad_none
|
975
|
-
|
1010
|
+
refute_scanned "0d"
|
976
1011
|
end
|
977
1012
|
|
978
1013
|
def test_integer_dec_d_bad_underscores
|
979
|
-
|
1014
|
+
refute_scanned "0d42__24"
|
980
1015
|
end
|
981
1016
|
|
982
1017
|
def test_question_eh_a__18
|
983
1018
|
setup_lexer 18
|
984
1019
|
|
985
|
-
|
1020
|
+
assert_scanned "?a", :tINTEGER, 97
|
986
1021
|
end
|
987
1022
|
|
988
1023
|
def test_question_eh_a__19
|
989
1024
|
setup_lexer 19
|
990
1025
|
|
991
|
-
|
1026
|
+
assert_scanned '?a', :tSTRING, "a"
|
992
1027
|
end
|
993
1028
|
|
994
1029
|
def test_question_eh_escape_M_escape_C__18
|
995
1030
|
setup_lexer 18
|
996
1031
|
|
997
|
-
|
1032
|
+
assert_scanned '?\M-\C-a', :tINTEGER, 129
|
998
1033
|
end
|
999
1034
|
|
1000
1035
|
def test_question_eh_escape_M_escape_C__19
|
1001
1036
|
setup_lexer 19
|
1002
1037
|
|
1003
|
-
|
1038
|
+
assert_scanned '?\M-\C-a', :tSTRING, "\M-\C-a"
|
1004
1039
|
end
|
1005
1040
|
|
1006
1041
|
def test_integer_hex
|
1007
|
-
|
1042
|
+
assert_scanned "0x2a", :tINTEGER, 42
|
1008
1043
|
end
|
1009
1044
|
|
1010
1045
|
def test_integer_hex_bad_none
|
1011
|
-
|
1046
|
+
refute_scanned "0x "
|
1012
1047
|
end
|
1013
1048
|
|
1014
1049
|
def test_integer_hex_bad_underscores
|
1015
|
-
|
1050
|
+
refute_scanned "0xab__cd"
|
1016
1051
|
end
|
1017
1052
|
|
1018
1053
|
def test_integer_oct
|
1019
|
-
|
1054
|
+
assert_scanned "052", :tINTEGER, 42
|
1020
1055
|
end
|
1021
1056
|
|
1022
1057
|
def test_integer_oct_bad_range
|
1023
|
-
|
1058
|
+
refute_scanned "08"
|
1024
1059
|
end
|
1025
1060
|
|
1026
1061
|
def test_integer_oct_bad_underscores
|
1027
|
-
|
1062
|
+
refute_scanned "01__23"
|
1028
1063
|
end
|
1029
1064
|
|
1030
1065
|
def test_integer_oct_O
|
1031
|
-
|
1066
|
+
assert_scanned "0O52", :tINTEGER, 42
|
1032
1067
|
end
|
1033
1068
|
|
1034
1069
|
def test_integer_oct_O_bad_range
|
1035
|
-
|
1070
|
+
refute_scanned "0O1238"
|
1036
1071
|
end
|
1037
1072
|
|
1038
1073
|
def test_integer_oct_O_bad_underscores
|
1039
|
-
|
1074
|
+
refute_scanned "0O1__23"
|
1040
1075
|
end
|
1041
1076
|
|
1042
1077
|
def test_integer_oct_O_not_bad_none
|
1043
|
-
|
1078
|
+
assert_scanned "0O ", :tINTEGER, 0
|
1044
1079
|
end
|
1045
1080
|
|
1046
1081
|
def test_integer_oct_o
|
1047
|
-
|
1082
|
+
assert_scanned "0o52", :tINTEGER, 42
|
1048
1083
|
end
|
1049
1084
|
|
1050
1085
|
def test_integer_oct_o_bad_range
|
1051
|
-
|
1086
|
+
refute_scanned "0o1283"
|
1052
1087
|
end
|
1053
1088
|
|
1054
1089
|
def test_integer_oct_o_bad_underscores
|
1055
|
-
|
1090
|
+
refute_scanned "0o1__23"
|
1056
1091
|
end
|
1057
1092
|
|
1058
1093
|
def test_integer_oct_o_not_bad_none
|
1059
|
-
|
1094
|
+
assert_scanned "0o ", :tINTEGER, 0
|
1060
1095
|
end
|
1061
1096
|
|
1062
1097
|
def test_integer_trailing
|
1063
|
-
|
1098
|
+
assert_scanned("1.to_s",
|
1064
1099
|
:tINTEGER, 1,
|
1065
1100
|
:tDOT, '.',
|
1066
1101
|
:tIDENTIFIER, 'to_s')
|
1067
1102
|
end
|
1068
1103
|
|
1069
1104
|
def test_integer_underscore
|
1070
|
-
|
1105
|
+
assert_scanned "4_2", :tINTEGER, 42
|
1071
1106
|
end
|
1072
1107
|
|
1073
1108
|
def test_integer_underscore_bad
|
1074
|
-
|
1109
|
+
refute_scanned "4__2"
|
1075
1110
|
end
|
1076
1111
|
|
1077
1112
|
def test_integer_zero
|
1078
|
-
|
1113
|
+
assert_scanned "0", :tINTEGER, 0
|
1079
1114
|
end
|
1080
1115
|
|
1081
1116
|
def test_ivar
|
1082
|
-
|
1117
|
+
assert_scanned "@blah", :tIVAR, "@blah"
|
1083
1118
|
end
|
1084
1119
|
|
1085
1120
|
def test_ivar_bad
|
1086
|
-
|
1121
|
+
refute_scanned "@1"
|
1087
1122
|
end
|
1088
1123
|
|
1089
1124
|
def test_ivar_bad_0_length
|
1090
|
-
|
1125
|
+
refute_scanned "1+@\n", :tINTEGER, 1, :tPLUS, "+"
|
1091
1126
|
end
|
1092
1127
|
|
1093
1128
|
def test_keyword_expr
|
1094
1129
|
@lex.state = :expr_endarg
|
1095
1130
|
|
1096
|
-
|
1131
|
+
assert_scanned("if", :kIF_MOD, "if")
|
1097
1132
|
|
1098
1133
|
assert_equal :expr_beg, @lex.state
|
1099
1134
|
end
|
1100
1135
|
|
1101
1136
|
def test_lt
|
1102
|
-
|
1137
|
+
assert_scanned "<", :tLT, "<"
|
1103
1138
|
end
|
1104
1139
|
|
1105
1140
|
def test_lt2
|
1106
|
-
|
1141
|
+
assert_scanned("a <\< b",
|
1107
1142
|
:tIDENTIFIER, "a",
|
1108
1143
|
:tLSHFT, "<\<",
|
1109
1144
|
:tIDENTIFIER, "b")
|
@@ -1111,18 +1146,18 @@ class TestLexer < Minitest::Test
|
|
1111
1146
|
end
|
1112
1147
|
|
1113
1148
|
def test_lt2_equals
|
1114
|
-
|
1149
|
+
assert_scanned("a <\<= b",
|
1115
1150
|
:tIDENTIFIER, "a",
|
1116
1151
|
:tOP_ASGN, "<\<",
|
1117
1152
|
:tIDENTIFIER, "b")
|
1118
1153
|
end
|
1119
1154
|
|
1120
1155
|
def test_lt_equals
|
1121
|
-
|
1156
|
+
assert_scanned "<=", :tLEQ, "<="
|
1122
1157
|
end
|
1123
1158
|
|
1124
1159
|
def test_minus
|
1125
|
-
|
1160
|
+
assert_scanned("1 - 2",
|
1126
1161
|
:tINTEGER, 1,
|
1127
1162
|
:tMINUS, "-",
|
1128
1163
|
:tINTEGER, 2)
|
@@ -1131,27 +1166,27 @@ class TestLexer < Minitest::Test
|
|
1131
1166
|
def test_minus_equals
|
1132
1167
|
@lex.state = :expr_end
|
1133
1168
|
|
1134
|
-
|
1169
|
+
assert_scanned "-=", :tOP_ASGN, "-"
|
1135
1170
|
end
|
1136
1171
|
|
1137
1172
|
def test_minus_method
|
1138
1173
|
@lex.state = :expr_fname
|
1139
|
-
|
1174
|
+
assert_scanned "-", :tMINUS, "-"
|
1140
1175
|
end
|
1141
1176
|
|
1142
1177
|
def test_minus_unary_method
|
1143
1178
|
@lex.state = :expr_fname
|
1144
|
-
|
1179
|
+
assert_scanned "-@", :tUMINUS, "-@"
|
1145
1180
|
end
|
1146
1181
|
|
1147
1182
|
def test_minus_unary_number
|
1148
|
-
|
1183
|
+
assert_scanned("-42",
|
1149
1184
|
:tUMINUS_NUM, "-",
|
1150
1185
|
:tINTEGER, 42)
|
1151
1186
|
end
|
1152
1187
|
|
1153
1188
|
def test_nth_ref
|
1154
|
-
|
1189
|
+
assert_scanned('[$1, $2, $3]',
|
1155
1190
|
:tLBRACK, "[",
|
1156
1191
|
:tNTH_REF, 1, :tCOMMA, ",",
|
1157
1192
|
:tNTH_REF, 2, :tCOMMA, ",",
|
@@ -1160,26 +1195,26 @@ class TestLexer < Minitest::Test
|
|
1160
1195
|
end
|
1161
1196
|
|
1162
1197
|
def test_open_bracket
|
1163
|
-
|
1198
|
+
assert_scanned("(", :tLPAREN, "(")
|
1164
1199
|
end
|
1165
1200
|
|
1166
1201
|
def test_open_bracket_cmdarg
|
1167
|
-
|
1202
|
+
assert_scanned("m (", :tIDENTIFIER, "m",
|
1168
1203
|
:tLPAREN_ARG, "(")
|
1169
1204
|
end
|
1170
1205
|
|
1171
1206
|
def test_open_bracket_exprarg
|
1172
|
-
|
1207
|
+
assert_scanned("m(", :tIDENTIFIER, "m",
|
1173
1208
|
:tLPAREN2, "(")
|
1174
1209
|
end
|
1175
1210
|
|
1176
1211
|
def test_open_curly_bracket
|
1177
|
-
|
1212
|
+
assert_scanned("{",
|
1178
1213
|
:tLBRACE, "{")
|
1179
1214
|
end
|
1180
1215
|
|
1181
1216
|
def test_open_curly_bracket_arg
|
1182
|
-
|
1217
|
+
assert_scanned("m { 3 }",
|
1183
1218
|
:tIDENTIFIER, "m",
|
1184
1219
|
:tLCURLY, "{",
|
1185
1220
|
:tINTEGER, 3,
|
@@ -1189,14 +1224,14 @@ class TestLexer < Minitest::Test
|
|
1189
1224
|
def test_open_curly_bracket_block
|
1190
1225
|
@lex.state = :expr_endarg # seen m(3)
|
1191
1226
|
|
1192
|
-
|
1227
|
+
assert_scanned("{ 4 }",
|
1193
1228
|
:tLBRACE_ARG, "{",
|
1194
1229
|
:tINTEGER, 4,
|
1195
1230
|
:tRCURLY, "}")
|
1196
1231
|
end
|
1197
1232
|
|
1198
1233
|
def test_open_square_bracket_arg
|
1199
|
-
|
1234
|
+
assert_scanned("m [ 3 ]",
|
1200
1235
|
:tIDENTIFIER, "m",
|
1201
1236
|
:tLBRACK, "[",
|
1202
1237
|
:tINTEGER, 3,
|
@@ -1204,7 +1239,7 @@ class TestLexer < Minitest::Test
|
|
1204
1239
|
end
|
1205
1240
|
|
1206
1241
|
def test_open_square_bracket_ary
|
1207
|
-
|
1242
|
+
assert_scanned("[1, 2, 3]",
|
1208
1243
|
:tLBRACK, "[",
|
1209
1244
|
:tINTEGER, 1,
|
1210
1245
|
:tCOMMA, ",",
|
@@ -1215,7 +1250,7 @@ class TestLexer < Minitest::Test
|
|
1215
1250
|
end
|
1216
1251
|
|
1217
1252
|
def test_open_square_bracket_meth
|
1218
|
-
|
1253
|
+
assert_scanned("m[3]",
|
1219
1254
|
:tIDENTIFIER, "m",
|
1220
1255
|
:tLBRACK2, "[",
|
1221
1256
|
:tINTEGER, 3,
|
@@ -1223,37 +1258,37 @@ class TestLexer < Minitest::Test
|
|
1223
1258
|
end
|
1224
1259
|
|
1225
1260
|
def test_or
|
1226
|
-
|
1261
|
+
assert_scanned "|", :tPIPE, "|"
|
1227
1262
|
end
|
1228
1263
|
|
1229
1264
|
def test_or2
|
1230
|
-
|
1265
|
+
assert_scanned "||", :tOROP, "||"
|
1231
1266
|
end
|
1232
1267
|
|
1233
1268
|
def test_or2_equals
|
1234
|
-
|
1269
|
+
assert_scanned "||=", :tOP_ASGN, "||"
|
1235
1270
|
end
|
1236
1271
|
|
1237
1272
|
def test_or_equals
|
1238
|
-
|
1273
|
+
assert_scanned "|=", :tOP_ASGN, "|"
|
1239
1274
|
end
|
1240
1275
|
|
1241
1276
|
def test_percent
|
1242
|
-
|
1277
|
+
assert_scanned("a % 2",
|
1243
1278
|
:tIDENTIFIER, "a",
|
1244
1279
|
:tPERCENT, "%",
|
1245
1280
|
:tINTEGER, 2)
|
1246
1281
|
end
|
1247
1282
|
|
1248
1283
|
def test_percent_equals
|
1249
|
-
|
1284
|
+
assert_scanned("a %= 2",
|
1250
1285
|
:tIDENTIFIER, "a",
|
1251
1286
|
:tOP_ASGN, "%",
|
1252
1287
|
:tINTEGER, 2)
|
1253
1288
|
end
|
1254
1289
|
|
1255
1290
|
def test_plus
|
1256
|
-
|
1291
|
+
assert_scanned("1 + 1",
|
1257
1292
|
:tINTEGER, 1,
|
1258
1293
|
:tPLUS, "+",
|
1259
1294
|
:tINTEGER, 1)
|
@@ -1262,135 +1297,137 @@ class TestLexer < Minitest::Test
|
|
1262
1297
|
def test_plus_equals
|
1263
1298
|
@lex.state = :expr_end
|
1264
1299
|
|
1265
|
-
|
1300
|
+
assert_scanned "+=", :tOP_ASGN, "+"
|
1266
1301
|
end
|
1267
1302
|
|
1268
1303
|
def test_plus_method
|
1269
1304
|
@lex.state = :expr_fname
|
1270
|
-
|
1305
|
+
assert_scanned "+", :tPLUS, "+"
|
1271
1306
|
end
|
1272
1307
|
|
1273
1308
|
def test_plus_unary_method
|
1274
1309
|
@lex.state = :expr_fname
|
1275
|
-
|
1310
|
+
assert_scanned "+@", :tUPLUS, "+@"
|
1276
1311
|
end
|
1277
1312
|
|
1278
1313
|
def test_numbers
|
1279
|
-
|
1280
|
-
|
1314
|
+
assert_scanned "0b10", :tINTEGER, 2
|
1315
|
+
assert_scanned "0B10", :tINTEGER, 2
|
1316
|
+
|
1317
|
+
assert_scanned "0d10", :tINTEGER, 10
|
1318
|
+
assert_scanned "0D10", :tINTEGER, 10
|
1281
1319
|
|
1282
|
-
|
1283
|
-
|
1320
|
+
assert_scanned "0x10", :tINTEGER, 16
|
1321
|
+
assert_scanned "0X10", :tINTEGER, 16
|
1284
1322
|
|
1285
|
-
|
1286
|
-
|
1323
|
+
assert_scanned "0o10", :tINTEGER, 8
|
1324
|
+
assert_scanned "0O10", :tINTEGER, 8
|
1325
|
+
assert_scanned "0o", :tINTEGER, 0
|
1326
|
+
assert_scanned "0O", :tINTEGER, 0
|
1287
1327
|
|
1288
|
-
|
1289
|
-
|
1290
|
-
util_lex_token "0o", :tINTEGER, 0
|
1291
|
-
util_lex_token "0O", :tINTEGER, 0
|
1328
|
+
assert_scanned "0o", :tINTEGER, 0
|
1329
|
+
assert_scanned "0O", :tINTEGER, 0
|
1292
1330
|
|
1293
|
-
|
1294
|
-
util_lex_token "0O", :tINTEGER, 0
|
1331
|
+
assert_scanned "0777_333", :tINTEGER, 261851
|
1295
1332
|
|
1296
|
-
|
1333
|
+
assert_scanned "0", :tINTEGER, 0
|
1297
1334
|
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1335
|
+
refute_scanned "0x"
|
1336
|
+
refute_scanned "0X"
|
1337
|
+
refute_scanned "0b"
|
1338
|
+
refute_scanned "0B"
|
1339
|
+
refute_scanned "0d"
|
1340
|
+
refute_scanned "0D"
|
1304
1341
|
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1342
|
+
refute_scanned "08"
|
1343
|
+
refute_scanned "09"
|
1344
|
+
refute_scanned "0o8"
|
1345
|
+
refute_scanned "0o9"
|
1346
|
+
refute_scanned "0O8"
|
1347
|
+
refute_scanned "0O9"
|
1311
1348
|
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1349
|
+
refute_scanned "1_e1"
|
1350
|
+
refute_scanned "1_.1"
|
1351
|
+
refute_scanned "1__1"
|
1315
1352
|
|
1316
|
-
|
1317
|
-
|
1353
|
+
refute_scanned "1end"
|
1354
|
+
refute_scanned "1.1end"
|
1318
1355
|
end
|
1319
1356
|
|
1320
1357
|
def test_plus_unary_number
|
1321
|
-
|
1358
|
+
assert_scanned("+42",
|
1322
1359
|
:tINTEGER, 42)
|
1323
1360
|
end
|
1324
1361
|
|
1325
1362
|
def test_question__18
|
1326
1363
|
setup_lexer 18
|
1327
1364
|
|
1328
|
-
|
1365
|
+
assert_scanned "?*", :tINTEGER, 42
|
1329
1366
|
end
|
1330
1367
|
|
1331
1368
|
def test_question__19
|
1332
1369
|
setup_lexer 19
|
1333
1370
|
|
1334
|
-
|
1371
|
+
assert_scanned "?*", :tSTRING, "*"
|
1335
1372
|
end
|
1336
1373
|
|
1337
1374
|
def test_question_bad_eos
|
1338
|
-
|
1375
|
+
refute_scanned "?"
|
1339
1376
|
end
|
1340
1377
|
|
1341
1378
|
def test_question_bad_ws
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1379
|
+
assert_scanned "? ", :tEH, "?"
|
1380
|
+
assert_scanned "?\n", :tEH, "?"
|
1381
|
+
assert_scanned "?\t", :tEH, "?"
|
1382
|
+
assert_scanned "?\v", :tEH, "?"
|
1383
|
+
assert_scanned "?\r", :tEH, "?"
|
1384
|
+
assert_scanned "?\f", :tEH, "?"
|
1348
1385
|
end
|
1349
1386
|
|
1350
1387
|
def test_question_ws_backslashed__18
|
1351
1388
|
setup_lexer 18
|
1352
1389
|
|
1353
1390
|
@lex.state = :expr_beg
|
1354
|
-
|
1391
|
+
assert_scanned "?\\ ", :tINTEGER, 32
|
1355
1392
|
@lex.state = :expr_beg
|
1356
|
-
|
1393
|
+
assert_scanned "?\\n", :tINTEGER, 10
|
1357
1394
|
@lex.state = :expr_beg
|
1358
|
-
|
1395
|
+
assert_scanned "?\\t", :tINTEGER, 9
|
1359
1396
|
@lex.state = :expr_beg
|
1360
|
-
|
1397
|
+
assert_scanned "?\\v", :tINTEGER, 11
|
1361
1398
|
@lex.state = :expr_beg
|
1362
|
-
|
1399
|
+
assert_scanned "?\\r", :tINTEGER, 13
|
1363
1400
|
@lex.state = :expr_beg
|
1364
|
-
|
1401
|
+
assert_scanned "?\\f", :tINTEGER, 12
|
1365
1402
|
end
|
1366
1403
|
|
1367
1404
|
def test_question_ws_backslashed__19
|
1368
1405
|
setup_lexer 19
|
1369
1406
|
|
1370
1407
|
@lex.state = :expr_beg
|
1371
|
-
|
1408
|
+
assert_scanned "?\\ ", :tSTRING, " "
|
1372
1409
|
@lex.state = :expr_beg
|
1373
|
-
|
1410
|
+
assert_scanned "?\\n", :tSTRING, "\n"
|
1374
1411
|
@lex.state = :expr_beg
|
1375
|
-
|
1412
|
+
assert_scanned "?\\t", :tSTRING, "\t"
|
1376
1413
|
@lex.state = :expr_beg
|
1377
|
-
|
1414
|
+
assert_scanned "?\\v", :tSTRING, "\v"
|
1378
1415
|
@lex.state = :expr_beg
|
1379
|
-
|
1416
|
+
assert_scanned "?\\r", :tSTRING, "\r"
|
1380
1417
|
@lex.state = :expr_beg
|
1381
|
-
|
1418
|
+
assert_scanned "?\\f", :tSTRING, "\f"
|
1382
1419
|
end
|
1383
1420
|
|
1384
1421
|
def test_rbracket
|
1385
|
-
|
1422
|
+
assert_scanned "]", :tRBRACK, "]"
|
1386
1423
|
end
|
1387
1424
|
|
1388
1425
|
def test_rcurly
|
1389
|
-
|
1426
|
+
assert_scanned "}", :tRCURLY, "}"
|
1390
1427
|
end
|
1391
1428
|
|
1392
1429
|
def test_regexp
|
1393
|
-
|
1430
|
+
assert_scanned("/regexp/",
|
1394
1431
|
:tREGEXP_BEG, "/",
|
1395
1432
|
:tSTRING_CONTENT, "regexp",
|
1396
1433
|
:tSTRING_END, "/",
|
@@ -1398,7 +1435,7 @@ class TestLexer < Minitest::Test
|
|
1398
1435
|
end
|
1399
1436
|
|
1400
1437
|
def test_regexp_ambiguous
|
1401
|
-
|
1438
|
+
assert_scanned("method /regexp/",
|
1402
1439
|
:tIDENTIFIER, "method",
|
1403
1440
|
:tREGEXP_BEG, "/",
|
1404
1441
|
:tSTRING_CONTENT, "regexp",
|
@@ -1407,14 +1444,14 @@ class TestLexer < Minitest::Test
|
|
1407
1444
|
end
|
1408
1445
|
|
1409
1446
|
def test_regexp_bad
|
1410
|
-
|
1447
|
+
refute_scanned("/.*/xyz",
|
1411
1448
|
:tREGEXP_BEG, "/",
|
1412
1449
|
:tSTRING_CONTENT, ".*",
|
1413
1450
|
:tSTRING_END, "/")
|
1414
1451
|
end
|
1415
1452
|
|
1416
1453
|
def test_regexp_escape_C
|
1417
|
-
|
1454
|
+
assert_scanned('/regex\\C-x/',
|
1418
1455
|
:tREGEXP_BEG, "/",
|
1419
1456
|
:tSTRING_CONTENT, "regex\\C-x",
|
1420
1457
|
:tSTRING_END, "/",
|
@@ -1422,7 +1459,7 @@ class TestLexer < Minitest::Test
|
|
1422
1459
|
end
|
1423
1460
|
|
1424
1461
|
def test_regexp_escape_C_M
|
1425
|
-
|
1462
|
+
assert_scanned('/regex\\C-\\M-x/',
|
1426
1463
|
:tREGEXP_BEG, "/",
|
1427
1464
|
:tSTRING_CONTENT, "regex\\C-\\M-x",
|
1428
1465
|
:tSTRING_END, "/",
|
@@ -1430,7 +1467,7 @@ class TestLexer < Minitest::Test
|
|
1430
1467
|
end
|
1431
1468
|
|
1432
1469
|
def test_regexp_escape_C_M_craaaazy
|
1433
|
-
|
1470
|
+
assert_scanned("/regex\\C-\\\n\\M-x/",
|
1434
1471
|
:tREGEXP_BEG, "/",
|
1435
1472
|
:tSTRING_CONTENT, "regex\\C-\\M-x",
|
1436
1473
|
:tSTRING_END, "/",
|
@@ -1438,27 +1475,27 @@ class TestLexer < Minitest::Test
|
|
1438
1475
|
end
|
1439
1476
|
|
1440
1477
|
def test_regexp_escape_C_bad_dash
|
1441
|
-
|
1478
|
+
refute_scanned '/regex\\Cx/', :tREGEXP_BEG, "/"
|
1442
1479
|
end
|
1443
1480
|
|
1444
1481
|
def test_regexp_escape_C_bad_dash_eos
|
1445
|
-
|
1482
|
+
refute_scanned '/regex\\C-/', :tREGEXP_BEG, "/"
|
1446
1483
|
end
|
1447
1484
|
|
1448
1485
|
def test_regexp_escape_C_bad_dash_eos2
|
1449
|
-
|
1486
|
+
refute_scanned '/regex\\C-', :tREGEXP_BEG, "/"
|
1450
1487
|
end
|
1451
1488
|
|
1452
1489
|
def test_regexp_escape_C_bad_eos
|
1453
|
-
|
1490
|
+
refute_scanned '/regex\\C/', :tREGEXP_BEG, "/"
|
1454
1491
|
end
|
1455
1492
|
|
1456
1493
|
def test_regexp_escape_C_bad_eos2
|
1457
|
-
|
1494
|
+
refute_scanned '/regex\\c', :tREGEXP_BEG, "/"
|
1458
1495
|
end
|
1459
1496
|
|
1460
1497
|
def test_regexp_escape_M
|
1461
|
-
|
1498
|
+
assert_scanned('/regex\\M-x/',
|
1462
1499
|
:tREGEXP_BEG, "/",
|
1463
1500
|
:tSTRING_CONTENT, "regex\\M-x",
|
1464
1501
|
:tSTRING_END, "/",
|
@@ -1466,7 +1503,7 @@ class TestLexer < Minitest::Test
|
|
1466
1503
|
end
|
1467
1504
|
|
1468
1505
|
def test_regexp_escape_M_C
|
1469
|
-
|
1506
|
+
assert_scanned('/regex\\M-\\C-x/',
|
1470
1507
|
:tREGEXP_BEG, "/",
|
1471
1508
|
:tSTRING_CONTENT, "regex\\M-\\C-x",
|
1472
1509
|
:tSTRING_END, "/",
|
@@ -1474,23 +1511,23 @@ class TestLexer < Minitest::Test
|
|
1474
1511
|
end
|
1475
1512
|
|
1476
1513
|
def test_regexp_escape_M_bad_dash
|
1477
|
-
|
1514
|
+
refute_scanned '/regex\\Mx/', :tREGEXP_BEG, "/"
|
1478
1515
|
end
|
1479
1516
|
|
1480
1517
|
def test_regexp_escape_M_bad_dash_eos
|
1481
|
-
|
1518
|
+
refute_scanned '/regex\\M-/', :tREGEXP_BEG, "/"
|
1482
1519
|
end
|
1483
1520
|
|
1484
1521
|
def test_regexp_escape_M_bad_dash_eos2
|
1485
|
-
|
1522
|
+
refute_scanned '/regex\\M-', :tREGEXP_BEG, "/"
|
1486
1523
|
end
|
1487
1524
|
|
1488
1525
|
def test_regexp_escape_M_bad_eos
|
1489
|
-
|
1526
|
+
refute_scanned '/regex\\M/', :tREGEXP_BEG, "/"
|
1490
1527
|
end
|
1491
1528
|
|
1492
1529
|
def test_regexp_escape_backslash_slash
|
1493
|
-
|
1530
|
+
assert_scanned('/\\//',
|
1494
1531
|
:tREGEXP_BEG, "/",
|
1495
1532
|
:tSTRING_CONTENT, '\\/',
|
1496
1533
|
:tSTRING_END, "/",
|
@@ -1498,7 +1535,7 @@ class TestLexer < Minitest::Test
|
|
1498
1535
|
end
|
1499
1536
|
|
1500
1537
|
def test_regexp_escape_backslash_terminator
|
1501
|
-
|
1538
|
+
assert_scanned('%r%blah\\%blah%',
|
1502
1539
|
:tREGEXP_BEG, "%r%",
|
1503
1540
|
:tSTRING_CONTENT, "blah\\%blah",
|
1504
1541
|
:tSTRING_END, "%",
|
@@ -1506,7 +1543,7 @@ class TestLexer < Minitest::Test
|
|
1506
1543
|
end
|
1507
1544
|
|
1508
1545
|
def test_regexp_escape_backslash_terminator_meta1
|
1509
|
-
|
1546
|
+
assert_scanned('%r{blah\\}blah}',
|
1510
1547
|
:tREGEXP_BEG, "%r{",
|
1511
1548
|
:tSTRING_CONTENT, "blah\\}blah",
|
1512
1549
|
:tSTRING_END, "}",
|
@@ -1514,7 +1551,7 @@ class TestLexer < Minitest::Test
|
|
1514
1551
|
end
|
1515
1552
|
|
1516
1553
|
def test_regexp_escape_backslash_terminator_meta2
|
1517
|
-
|
1554
|
+
assert_scanned('%r/blah\\/blah/',
|
1518
1555
|
:tREGEXP_BEG, "%r/",
|
1519
1556
|
:tSTRING_CONTENT, "blah\\/blah",
|
1520
1557
|
:tSTRING_END, "/",
|
@@ -1522,7 +1559,7 @@ class TestLexer < Minitest::Test
|
|
1522
1559
|
end
|
1523
1560
|
|
1524
1561
|
def test_regexp_escape_backslash_terminator_meta3
|
1525
|
-
|
1562
|
+
assert_scanned('%r/blah\\%blah/',
|
1526
1563
|
:tREGEXP_BEG, "%r/",
|
1527
1564
|
:tSTRING_CONTENT, "blah\\%blah",
|
1528
1565
|
:tSTRING_END, "/",
|
@@ -1530,11 +1567,11 @@ class TestLexer < Minitest::Test
|
|
1530
1567
|
end
|
1531
1568
|
|
1532
1569
|
def test_regexp_escape_bad_eos
|
1533
|
-
|
1570
|
+
refute_scanned '/regex\\', :tREGEXP_BEG, "/"
|
1534
1571
|
end
|
1535
1572
|
|
1536
1573
|
def test_regexp_escape_bs
|
1537
|
-
|
1574
|
+
assert_scanned('/regex\\\\regex/',
|
1538
1575
|
:tREGEXP_BEG, "/",
|
1539
1576
|
:tSTRING_CONTENT, "regex\\\\regex",
|
1540
1577
|
:tSTRING_END, "/",
|
@@ -1542,7 +1579,7 @@ class TestLexer < Minitest::Test
|
|
1542
1579
|
end
|
1543
1580
|
|
1544
1581
|
def test_regexp_escape_c
|
1545
|
-
|
1582
|
+
assert_scanned('/regex\\cxxx/',
|
1546
1583
|
:tREGEXP_BEG, "/",
|
1547
1584
|
:tSTRING_CONTENT, "regex\\cxxx",
|
1548
1585
|
:tSTRING_END, "/",
|
@@ -1550,7 +1587,7 @@ class TestLexer < Minitest::Test
|
|
1550
1587
|
end
|
1551
1588
|
|
1552
1589
|
def test_regexp_escape_c_backslash
|
1553
|
-
|
1590
|
+
assert_scanned('/regex\\c\\n/',
|
1554
1591
|
:tREGEXP_BEG, "/",
|
1555
1592
|
:tSTRING_CONTENT, "regex\\c\\n",
|
1556
1593
|
:tSTRING_END, "/",
|
@@ -1558,7 +1595,7 @@ class TestLexer < Minitest::Test
|
|
1558
1595
|
end
|
1559
1596
|
|
1560
1597
|
def test_regexp_escape_chars
|
1561
|
-
|
1598
|
+
assert_scanned('/re\\tge\\nxp/',
|
1562
1599
|
:tREGEXP_BEG, "/",
|
1563
1600
|
:tSTRING_CONTENT, "re\\tge\\nxp",
|
1564
1601
|
:tSTRING_END, "/",
|
@@ -1567,7 +1604,7 @@ class TestLexer < Minitest::Test
|
|
1567
1604
|
|
1568
1605
|
def test_regexp_escape_double_backslash
|
1569
1606
|
regexp = '/[\\/\\\\]$/'
|
1570
|
-
|
1607
|
+
assert_scanned(regexp,
|
1571
1608
|
:tREGEXP_BEG, "/",
|
1572
1609
|
:tSTRING_CONTENT, regexp[1..-2],
|
1573
1610
|
:tSTRING_END, "/",
|
@@ -1575,7 +1612,7 @@ class TestLexer < Minitest::Test
|
|
1575
1612
|
end
|
1576
1613
|
|
1577
1614
|
def test_regexp_escape_hex
|
1578
|
-
|
1615
|
+
assert_scanned('/regex\\x61xp/',
|
1579
1616
|
:tREGEXP_BEG, "/",
|
1580
1617
|
:tSTRING_CONTENT, "regex\\x61xp",
|
1581
1618
|
:tSTRING_END, "/",
|
@@ -1583,11 +1620,11 @@ class TestLexer < Minitest::Test
|
|
1583
1620
|
end
|
1584
1621
|
|
1585
1622
|
def test_regexp_escape_hex_bad
|
1586
|
-
|
1623
|
+
refute_scanned '/regex\\xzxp/', :tREGEXP_BEG, "/"
|
1587
1624
|
end
|
1588
1625
|
|
1589
1626
|
def test_regexp_escape_hex_one
|
1590
|
-
|
1627
|
+
assert_scanned('/^[\\xd\\xa]{2}/on',
|
1591
1628
|
:tREGEXP_BEG, '/',
|
1592
1629
|
:tSTRING_CONTENT, '^[\\xd\\xa]{2}',
|
1593
1630
|
:tSTRING_END, "/",
|
@@ -1595,7 +1632,7 @@ class TestLexer < Minitest::Test
|
|
1595
1632
|
end
|
1596
1633
|
|
1597
1634
|
def test_regexp_escape_oct1
|
1598
|
-
|
1635
|
+
assert_scanned('/regex\\0xp/',
|
1599
1636
|
:tREGEXP_BEG, "/",
|
1600
1637
|
:tSTRING_CONTENT, "regex\\0xp",
|
1601
1638
|
:tSTRING_END, "/",
|
@@ -1603,7 +1640,7 @@ class TestLexer < Minitest::Test
|
|
1603
1640
|
end
|
1604
1641
|
|
1605
1642
|
def test_regexp_escape_oct2
|
1606
|
-
|
1643
|
+
assert_scanned('/regex\\07xp/',
|
1607
1644
|
:tREGEXP_BEG, "/",
|
1608
1645
|
:tSTRING_CONTENT, "regex\\07xp",
|
1609
1646
|
:tSTRING_END, "/",
|
@@ -1611,7 +1648,7 @@ class TestLexer < Minitest::Test
|
|
1611
1648
|
end
|
1612
1649
|
|
1613
1650
|
def test_regexp_escape_oct3
|
1614
|
-
|
1651
|
+
assert_scanned('/regex\\10142/',
|
1615
1652
|
:tREGEXP_BEG, "/",
|
1616
1653
|
:tSTRING_CONTENT, "regex\\10142",
|
1617
1654
|
:tSTRING_END, "/",
|
@@ -1619,7 +1656,7 @@ class TestLexer < Minitest::Test
|
|
1619
1656
|
end
|
1620
1657
|
|
1621
1658
|
def test_regexp_escape_return
|
1622
|
-
|
1659
|
+
assert_scanned("/regex\\\nregex/",
|
1623
1660
|
:tREGEXP_BEG, "/",
|
1624
1661
|
:tSTRING_CONTENT, "regexregex",
|
1625
1662
|
:tSTRING_END, "/",
|
@@ -1627,7 +1664,7 @@ class TestLexer < Minitest::Test
|
|
1627
1664
|
end
|
1628
1665
|
|
1629
1666
|
def test_regexp_nm
|
1630
|
-
|
1667
|
+
assert_scanned("/.*/nm",
|
1631
1668
|
:tREGEXP_BEG, "/",
|
1632
1669
|
:tSTRING_CONTENT, ".*",
|
1633
1670
|
:tSTRING_END, "/",
|
@@ -1635,25 +1672,25 @@ class TestLexer < Minitest::Test
|
|
1635
1672
|
end
|
1636
1673
|
|
1637
1674
|
def test_rparen
|
1638
|
-
|
1675
|
+
assert_scanned ")", :tRPAREN, ")"
|
1639
1676
|
end
|
1640
1677
|
|
1641
1678
|
def test_rshft
|
1642
|
-
|
1679
|
+
assert_scanned("a >> 2",
|
1643
1680
|
:tIDENTIFIER, "a",
|
1644
1681
|
:tRSHFT, ">>",
|
1645
1682
|
:tINTEGER, 2)
|
1646
1683
|
end
|
1647
1684
|
|
1648
1685
|
def test_rshft_equals
|
1649
|
-
|
1686
|
+
assert_scanned("a >>= 2",
|
1650
1687
|
:tIDENTIFIER, "a",
|
1651
1688
|
:tOP_ASGN, ">>",
|
1652
1689
|
:tINTEGER, 2)
|
1653
1690
|
end
|
1654
1691
|
|
1655
1692
|
def test_star
|
1656
|
-
|
1693
|
+
assert_scanned("a * ",
|
1657
1694
|
:tIDENTIFIER, "a",
|
1658
1695
|
:tSTAR2, "*")
|
1659
1696
|
|
@@ -1661,7 +1698,7 @@ class TestLexer < Minitest::Test
|
|
1661
1698
|
end
|
1662
1699
|
|
1663
1700
|
def test_star2
|
1664
|
-
|
1701
|
+
assert_scanned("a ** ",
|
1665
1702
|
:tIDENTIFIER, "a",
|
1666
1703
|
:tPOW, "**")
|
1667
1704
|
|
@@ -1669,7 +1706,7 @@ class TestLexer < Minitest::Test
|
|
1669
1706
|
end
|
1670
1707
|
|
1671
1708
|
def test_star2_equals
|
1672
|
-
|
1709
|
+
assert_scanned("a **= ",
|
1673
1710
|
:tIDENTIFIER, "a",
|
1674
1711
|
:tOP_ASGN, "**")
|
1675
1712
|
|
@@ -1677,7 +1714,7 @@ class TestLexer < Minitest::Test
|
|
1677
1714
|
end
|
1678
1715
|
|
1679
1716
|
def test_star2_beg
|
1680
|
-
|
1717
|
+
assert_scanned("** ",
|
1681
1718
|
:tDSTAR, "**")
|
1682
1719
|
|
1683
1720
|
assert_equal :expr_beg, @lex.state
|
@@ -1686,7 +1723,7 @@ class TestLexer < Minitest::Test
|
|
1686
1723
|
def test_star_arg
|
1687
1724
|
@lex.state = :expr_arg
|
1688
1725
|
|
1689
|
-
|
1726
|
+
assert_scanned(" *a",
|
1690
1727
|
:tSTAR, "*",
|
1691
1728
|
:tIDENTIFIER, "a")
|
1692
1729
|
|
@@ -1696,7 +1733,7 @@ class TestLexer < Minitest::Test
|
|
1696
1733
|
def test_star_arg_beg
|
1697
1734
|
@lex.state = :expr_beg
|
1698
1735
|
|
1699
|
-
|
1736
|
+
assert_scanned("*a",
|
1700
1737
|
:tSTAR, "*",
|
1701
1738
|
:tIDENTIFIER, "a")
|
1702
1739
|
|
@@ -1706,7 +1743,7 @@ class TestLexer < Minitest::Test
|
|
1706
1743
|
def test_star_arg_beg_fname
|
1707
1744
|
@lex.state = :expr_fname
|
1708
1745
|
|
1709
|
-
|
1746
|
+
assert_scanned("*a",
|
1710
1747
|
:tSTAR2, "*",
|
1711
1748
|
:tIDENTIFIER, "a")
|
1712
1749
|
|
@@ -1714,7 +1751,7 @@ class TestLexer < Minitest::Test
|
|
1714
1751
|
end
|
1715
1752
|
|
1716
1753
|
def test_star_equals
|
1717
|
-
|
1754
|
+
assert_scanned("a *= ",
|
1718
1755
|
:tIDENTIFIER, "a",
|
1719
1756
|
:tOP_ASGN, "*")
|
1720
1757
|
|
@@ -1722,97 +1759,102 @@ class TestLexer < Minitest::Test
|
|
1722
1759
|
end
|
1723
1760
|
|
1724
1761
|
def test_string_bad_eos
|
1725
|
-
|
1762
|
+
refute_scanned('%',
|
1726
1763
|
:tSTRING_BEG, '%')
|
1727
1764
|
end
|
1728
1765
|
|
1729
1766
|
def test_string_bad_eos_quote
|
1730
|
-
|
1767
|
+
refute_scanned('%{nest',
|
1731
1768
|
:tSTRING_BEG, '%}')
|
1732
1769
|
end
|
1733
1770
|
|
1734
1771
|
def test_string_double
|
1735
|
-
|
1772
|
+
assert_scanned('"string"',
|
1736
1773
|
:tSTRING, "string")
|
1737
1774
|
end
|
1738
1775
|
|
1739
1776
|
def test_string_double_escape_C
|
1740
|
-
|
1777
|
+
assert_scanned('"\\C-a"',
|
1741
1778
|
:tSTRING, "\001")
|
1742
1779
|
end
|
1743
1780
|
|
1744
1781
|
def test_string_double_escape_C_backslash
|
1745
|
-
|
1782
|
+
assert_scanned('"\\C-\\\\"',
|
1746
1783
|
:tSTRING, "\034")
|
1747
1784
|
end
|
1748
1785
|
|
1749
1786
|
def test_string_double_escape_C_escape
|
1750
|
-
|
1787
|
+
assert_scanned('"\\C-\\M-a"',
|
1751
1788
|
:tSTRING, "\201")
|
1752
1789
|
end
|
1753
1790
|
|
1754
1791
|
def test_string_double_escape_C_question
|
1755
|
-
|
1792
|
+
assert_scanned('"\\C-?"',
|
1756
1793
|
:tSTRING, "\177")
|
1757
1794
|
end
|
1758
1795
|
|
1759
1796
|
def test_string_double_escape_M
|
1760
|
-
|
1797
|
+
assert_scanned('"\\M-a"',
|
1761
1798
|
:tSTRING, "\341")
|
1762
1799
|
end
|
1763
1800
|
|
1764
1801
|
def test_string_double_escape_M_backslash
|
1765
|
-
|
1802
|
+
assert_scanned('"\\M-\\\\"',
|
1766
1803
|
:tSTRING, "\334")
|
1767
1804
|
end
|
1768
1805
|
|
1769
1806
|
def test_string_double_escape_M_escape
|
1770
|
-
|
1807
|
+
assert_scanned('"\\M-\\C-a"',
|
1771
1808
|
:tSTRING, "\201")
|
1772
1809
|
end
|
1773
1810
|
|
1774
1811
|
def test_string_double_escape_bs1
|
1775
|
-
|
1812
|
+
assert_scanned('"a\\a\\a"',
|
1776
1813
|
:tSTRING, "a\a\a")
|
1777
1814
|
end
|
1778
1815
|
|
1779
1816
|
def test_string_double_escape_bs2
|
1780
|
-
|
1817
|
+
assert_scanned('"a\\\\a"',
|
1781
1818
|
:tSTRING, "a\\a")
|
1782
1819
|
end
|
1783
1820
|
|
1784
1821
|
def test_string_double_escape_c
|
1785
|
-
|
1822
|
+
assert_scanned('"\\ca"',
|
1786
1823
|
:tSTRING, "\001")
|
1787
1824
|
end
|
1788
1825
|
|
1789
1826
|
def test_string_double_escape_c_escape
|
1790
|
-
|
1827
|
+
assert_scanned('"\\c\\M-a"',
|
1791
1828
|
:tSTRING, "\201")
|
1792
1829
|
end
|
1793
1830
|
|
1794
1831
|
def test_string_double_escape_c_question
|
1795
|
-
|
1832
|
+
assert_scanned('"\\c?"',
|
1796
1833
|
:tSTRING, "\177")
|
1797
1834
|
end
|
1798
1835
|
|
1799
1836
|
def test_string_double_escape_chars
|
1800
|
-
|
1837
|
+
assert_scanned('"s\\tri\\ng"',
|
1801
1838
|
:tSTRING, "s\tri\ng")
|
1802
1839
|
end
|
1803
1840
|
|
1804
1841
|
def test_string_double_escape_hex
|
1805
|
-
|
1842
|
+
assert_scanned('"n = \\x61\\x62\\x63"',
|
1806
1843
|
:tSTRING, "n = abc")
|
1807
1844
|
end
|
1808
1845
|
|
1809
1846
|
def test_string_double_escape_octal
|
1810
|
-
|
1847
|
+
assert_scanned('"n = \\101\\102\\103"',
|
1811
1848
|
:tSTRING, "n = ABC")
|
1812
1849
|
end
|
1813
1850
|
|
1851
|
+
def test_string_double_escape_octal_wrap
|
1852
|
+
assert_scanned('"\\753"',
|
1853
|
+
:tSTRING, "\xEB")
|
1854
|
+
end
|
1855
|
+
|
1814
1856
|
def test_string_double_interp
|
1815
|
-
|
1857
|
+
assert_scanned("\"blah #x a \#@a b \#$b c \#{3} # \"",
|
1816
1858
|
:tSTRING_BEG, "\"",
|
1817
1859
|
:tSTRING_CONTENT, "blah #x a ",
|
1818
1860
|
:tSTRING_DVAR, nil,
|
@@ -1829,7 +1871,7 @@ class TestLexer < Minitest::Test
|
|
1829
1871
|
end
|
1830
1872
|
|
1831
1873
|
def test_string_double_interp_label
|
1832
|
-
|
1874
|
+
assert_scanned('"#{foo:bar}"',
|
1833
1875
|
:tSTRING_BEG, '"',
|
1834
1876
|
:tSTRING_DBEG, '#{',
|
1835
1877
|
:tIDENTIFIER, 'foo',
|
@@ -1839,34 +1881,34 @@ class TestLexer < Minitest::Test
|
|
1839
1881
|
end
|
1840
1882
|
|
1841
1883
|
def test_string_double_nested_curlies
|
1842
|
-
|
1884
|
+
assert_scanned('%{nest{one{two}one}nest}',
|
1843
1885
|
:tSTRING_BEG, '%{',
|
1844
1886
|
:tSTRING_CONTENT, "nest{one{two}one}nest",
|
1845
1887
|
:tSTRING_END, '}')
|
1846
1888
|
end
|
1847
1889
|
|
1848
1890
|
def test_string_double_no_interp
|
1849
|
-
|
1891
|
+
assert_scanned("\"# blah\"", # pound first
|
1850
1892
|
:tSTRING, "# blah")
|
1851
1893
|
|
1852
|
-
|
1894
|
+
assert_scanned("\"blah # blah\"", # pound not first
|
1853
1895
|
:tSTRING, "blah # blah")
|
1854
1896
|
end
|
1855
1897
|
|
1856
1898
|
def test_string_escape_x_single
|
1857
|
-
|
1899
|
+
assert_scanned('"\\x0"',
|
1858
1900
|
:tSTRING, "\000")
|
1859
1901
|
end
|
1860
1902
|
|
1861
1903
|
def test_string_pct_Q
|
1862
|
-
|
1904
|
+
assert_scanned("%Q[s1 s2]",
|
1863
1905
|
:tSTRING_BEG, '%Q[',
|
1864
1906
|
:tSTRING_CONTENT, "s1 s2",
|
1865
1907
|
:tSTRING_END, ']')
|
1866
1908
|
end
|
1867
1909
|
|
1868
1910
|
def test_string_pct_W
|
1869
|
-
|
1911
|
+
assert_scanned("%W[s1 s2\ns3]",
|
1870
1912
|
:tWORDS_BEG, "%W[",
|
1871
1913
|
:tSTRING_CONTENT, "s1",
|
1872
1914
|
:tSPACE, nil,
|
@@ -1878,7 +1920,7 @@ class TestLexer < Minitest::Test
|
|
1878
1920
|
end
|
1879
1921
|
|
1880
1922
|
def test_string_pct_W_bs_nl
|
1881
|
-
|
1923
|
+
assert_scanned("%W[s1 \\\ns2]",
|
1882
1924
|
:tWORDS_BEG, "%W[",
|
1883
1925
|
:tSTRING_CONTENT, "s1",
|
1884
1926
|
:tSPACE, nil,
|
@@ -1888,7 +1930,7 @@ class TestLexer < Minitest::Test
|
|
1888
1930
|
end
|
1889
1931
|
|
1890
1932
|
def test_string_pct_W_interp
|
1891
|
-
|
1933
|
+
assert_scanned('%W[#{1}#{2} #@a]',
|
1892
1934
|
:tWORDS_BEG, '%W[',
|
1893
1935
|
:tSTRING_DBEG, '#{',
|
1894
1936
|
:tINTEGER, 1,
|
@@ -1904,7 +1946,7 @@ class TestLexer < Minitest::Test
|
|
1904
1946
|
end
|
1905
1947
|
|
1906
1948
|
def test_string_pct_I
|
1907
|
-
|
1949
|
+
assert_scanned("%I(s1 s2)",
|
1908
1950
|
:tSYMBOLS_BEG, "%I(",
|
1909
1951
|
:tSTRING_CONTENT, "s1",
|
1910
1952
|
:tSPACE, nil,
|
@@ -1914,21 +1956,21 @@ class TestLexer < Minitest::Test
|
|
1914
1956
|
end
|
1915
1957
|
|
1916
1958
|
def test_string_pct_angle
|
1917
|
-
|
1959
|
+
assert_scanned("%<blah>",
|
1918
1960
|
:tSTRING_BEG, '%<',
|
1919
1961
|
:tSTRING_CONTENT, "blah",
|
1920
1962
|
:tSTRING_END, '>')
|
1921
1963
|
end
|
1922
1964
|
|
1923
1965
|
def test_string_pct_pct
|
1924
|
-
|
1966
|
+
assert_scanned("%%blah%",
|
1925
1967
|
:tSTRING_BEG, '%',
|
1926
1968
|
:tSTRING_CONTENT, "blah",
|
1927
1969
|
:tSTRING_END, '%')
|
1928
1970
|
end
|
1929
1971
|
|
1930
1972
|
def test_string_pct_w
|
1931
|
-
|
1973
|
+
assert_scanned("%w[s1 s2 ]",
|
1932
1974
|
:tQWORDS_BEG, "%w[",
|
1933
1975
|
:tSTRING_CONTENT, "s1",
|
1934
1976
|
:tSPACE, nil,
|
@@ -1938,14 +1980,14 @@ class TestLexer < Minitest::Test
|
|
1938
1980
|
end
|
1939
1981
|
|
1940
1982
|
def test_string_pct_w_incomplete
|
1941
|
-
|
1983
|
+
refute_scanned("%w[s1 ",
|
1942
1984
|
:tQWORDS_BEG, "%w[",
|
1943
1985
|
:tSTRING_CONTENT, "s1",
|
1944
1986
|
:tSPACE, nil)
|
1945
1987
|
end
|
1946
1988
|
|
1947
1989
|
def test_string_pct_w_bs_nl
|
1948
|
-
|
1990
|
+
assert_scanned("%w[s1 \\\ns2]",
|
1949
1991
|
:tQWORDS_BEG, "%w[",
|
1950
1992
|
:tSTRING_CONTENT, "s1",
|
1951
1993
|
:tSPACE, nil,
|
@@ -1955,7 +1997,7 @@ class TestLexer < Minitest::Test
|
|
1955
1997
|
end
|
1956
1998
|
|
1957
1999
|
def test_string_pct_w_bs_sp
|
1958
|
-
|
2000
|
+
assert_scanned("%w[s\\ 1 s\\ 2]",
|
1959
2001
|
:tQWORDS_BEG, "%w[",
|
1960
2002
|
:tSTRING_CONTENT, "s 1",
|
1961
2003
|
:tSPACE, nil,
|
@@ -1965,7 +2007,7 @@ class TestLexer < Minitest::Test
|
|
1965
2007
|
end
|
1966
2008
|
|
1967
2009
|
def test_string_pct_w_tab
|
1968
|
-
|
2010
|
+
assert_scanned("%w[abc\tdef]",
|
1969
2011
|
:tQWORDS_BEG, "%w[",
|
1970
2012
|
:tSTRING_CONTENT, "abc",
|
1971
2013
|
:tSPACE, nil,
|
@@ -1975,7 +2017,7 @@ class TestLexer < Minitest::Test
|
|
1975
2017
|
end
|
1976
2018
|
|
1977
2019
|
def test_string_pct_i
|
1978
|
-
|
2020
|
+
assert_scanned("%i(s1 s2)",
|
1979
2021
|
:tQSYMBOLS_BEG, "%i(",
|
1980
2022
|
:tSTRING_CONTENT, "s1",
|
1981
2023
|
:tSPACE, nil,
|
@@ -1985,17 +2027,17 @@ class TestLexer < Minitest::Test
|
|
1985
2027
|
end
|
1986
2028
|
|
1987
2029
|
def test_string_single
|
1988
|
-
|
2030
|
+
assert_scanned("'string'",
|
1989
2031
|
:tSTRING, "string")
|
1990
2032
|
end
|
1991
2033
|
|
1992
2034
|
def test_string_single_escape_chars
|
1993
|
-
|
2035
|
+
assert_scanned("'s\\tri\\ng'",
|
1994
2036
|
:tSTRING, "s\\tri\\ng")
|
1995
2037
|
end
|
1996
2038
|
|
1997
2039
|
def test_string_single_nl
|
1998
|
-
|
2040
|
+
assert_scanned("'blah\\\nblah'",
|
1999
2041
|
:tSTRING_BEG, "'",
|
2000
2042
|
:tSTRING_CONTENT, "blah\\\n",
|
2001
2043
|
:tSTRING_CONTENT, "blah",
|
@@ -2003,72 +2045,67 @@ class TestLexer < Minitest::Test
|
|
2003
2045
|
end
|
2004
2046
|
|
2005
2047
|
def test_symbol
|
2006
|
-
|
2048
|
+
assert_scanned(":symbol",
|
2007
2049
|
:tSYMBOL, "symbol")
|
2008
2050
|
end
|
2009
2051
|
|
2010
|
-
def test_symbol_bad_zero
|
2011
|
-
util_bad_token(":\"blah\0\"",
|
2012
|
-
:tSYMBEG, ":")
|
2013
|
-
end
|
2014
|
-
|
2015
2052
|
def test_symbol_double
|
2016
|
-
|
2053
|
+
assert_scanned(":\"symbol\"",
|
2017
2054
|
:tSYMBEG, ":\"",
|
2018
2055
|
:tSTRING_CONTENT, "symbol",
|
2019
2056
|
:tSTRING_END, "\"")
|
2020
2057
|
end
|
2021
2058
|
|
2022
2059
|
def test_symbol_single
|
2023
|
-
|
2060
|
+
assert_scanned(":'symbol'",
|
2024
2061
|
:tSYMBEG, ":'",
|
2025
2062
|
:tSTRING_CONTENT, "symbol",
|
2026
2063
|
:tSTRING_END, "'")
|
2027
2064
|
end
|
2028
2065
|
|
2029
2066
|
def test_ternary
|
2030
|
-
|
2067
|
+
assert_scanned("a ? b : c",
|
2031
2068
|
:tIDENTIFIER, "a",
|
2032
2069
|
:tEH, "?",
|
2033
2070
|
:tIDENTIFIER, "b",
|
2034
2071
|
:tCOLON, ":",
|
2035
2072
|
:tIDENTIFIER, "c")
|
2036
2073
|
|
2037
|
-
|
2074
|
+
assert_scanned("a ?b : c",
|
2038
2075
|
:tIDENTIFIER, "a",
|
2039
2076
|
:tINTEGER, 98,
|
2040
2077
|
:tCOLON, ":",
|
2041
2078
|
:tIDENTIFIER, "c")
|
2042
2079
|
|
2043
|
-
|
2080
|
+
assert_scanned("a ?bb : c", # GAH! MATZ!!!
|
2044
2081
|
:tIDENTIFIER, "a",
|
2045
2082
|
:tEH, "?",
|
2046
2083
|
:tIDENTIFIER, "bb",
|
2047
2084
|
:tCOLON, ":",
|
2048
2085
|
:tIDENTIFIER, "c")
|
2049
2086
|
|
2050
|
-
|
2087
|
+
assert_scanned("42 ?", # 42 forces expr_end
|
2051
2088
|
:tINTEGER, 42,
|
2052
2089
|
:tEH, "?")
|
2053
2090
|
end
|
2054
2091
|
|
2055
2092
|
def test_tilde
|
2056
|
-
|
2093
|
+
assert_scanned "~", :tTILDE, "~"
|
2057
2094
|
end
|
2058
2095
|
|
2059
2096
|
def test_tilde_unary
|
2060
2097
|
@lex.state = :expr_fname
|
2061
|
-
|
2098
|
+
assert_scanned "~@", :tTILDE, "~@"
|
2062
2099
|
end
|
2063
2100
|
|
2064
2101
|
def test_uminus
|
2065
|
-
|
2102
|
+
assert_scanned("-blah",
|
2066
2103
|
:tUMINUS, "-",
|
2067
2104
|
:tIDENTIFIER, "blah")
|
2068
2105
|
end
|
2069
2106
|
|
2070
2107
|
def test_underscore
|
2071
|
-
|
2108
|
+
assert_scanned("_var", :tIDENTIFIER, "_var")
|
2072
2109
|
end
|
2073
2110
|
|
2074
2111
|
def test_underscore_end
|
@@ -2082,13 +2119,13 @@ class TestLexer < Minitest::Test
|
|
2082
2119
|
end
|
2083
2120
|
|
2084
2121
|
def test_uplus
|
2085
|
-
|
2122
|
+
assert_scanned("+blah",
|
2086
2123
|
:tUPLUS, "+",
|
2087
2124
|
:tIDENTIFIER, "blah")
|
2088
2125
|
end
|
2089
2126
|
|
2090
2127
|
def test_if_unless_mod
|
2091
|
-
|
2128
|
+
assert_scanned("return if true unless false",
|
2092
2129
|
:kRETURN, "return",
|
2093
2130
|
:kIF_MOD, "if",
|
2094
2131
|
:kTRUE, "true",
|
@@ -2097,7 +2134,7 @@ class TestLexer < Minitest::Test
|
|
2097
2134
|
end
|
2098
2135
|
|
2099
2136
|
def test_if_stmt
|
2100
|
-
|
2137
|
+
assert_scanned("if true\n return end",
|
2101
2138
|
:kIF, "if",
|
2102
2139
|
:kTRUE, "true",
|
2103
2140
|
:tNL, nil,
|
@@ -2107,7 +2144,7 @@ class TestLexer < Minitest::Test
|
|
2107
2144
|
|
2108
2145
|
def test_sclass_label
|
2109
2146
|
setup_lexer 20
|
2110
|
-
|
2147
|
+
assert_scanned("class << a:b",
|
2111
2148
|
:kCLASS, 'class',
|
2112
2149
|
:tLSHFT, '<<',
|
2113
2150
|
:tIDENTIFIER, 'a',
|
@@ -2118,19 +2155,8 @@ class TestLexer < Minitest::Test
|
|
2118
2155
|
env = Parser::StaticEnvironment.new
|
2119
2156
|
env.declare "a"
|
2120
2157
|
|
2121
|
-
setup_lexer(18)
|
2122
|
-
@lex.static_env = env
|
2123
|
-
|
2124
|
-
util_lex_token("a [42]",
|
2125
|
-
:tIDENTIFIER, "a",
|
2126
|
-
:tLBRACK, "[",
|
2127
|
-
:tINTEGER, 42,
|
2128
|
-
:tRBRACK, "]")
|
2129
|
-
|
2130
|
-
setup_lexer(19)
|
2131
2158
|
@lex.static_env = env
|
2132
|
-
|
2133
|
-
util_lex_token("a [42]",
|
2159
|
+
assert_scanned("a [42]",
|
2134
2160
|
:tIDENTIFIER, "a",
|
2135
2161
|
:tLBRACK2, "[",
|
2136
2162
|
:tINTEGER, 42,
|
@@ -2143,23 +2169,23 @@ class TestLexer < Minitest::Test
|
|
2143
2169
|
|
2144
2170
|
def test_whitespace_fname
|
2145
2171
|
@lex.state = :expr_fname
|
2146
|
-
|
2172
|
+
assert_scanned('class',
|
2147
2173
|
:kCLASS, 'class')
|
2148
2174
|
|
2149
2175
|
@lex.state = :expr_fname
|
2150
|
-
|
2176
|
+
assert_scanned(' class',
|
2151
2177
|
:kCLASS, 'class')
|
2152
2178
|
|
2153
2179
|
@lex.state = :expr_fname
|
2154
|
-
|
2180
|
+
assert_scanned("\nclass",
|
2155
2181
|
:kCLASS, 'class')
|
2156
2182
|
|
2157
2183
|
@lex.state = :expr_fname
|
2158
|
-
|
2184
|
+
assert_scanned("\\\nclass",
|
2159
2185
|
:kCLASS, 'class')
|
2160
2186
|
|
2161
2187
|
@lex.state = :expr_fname
|
2162
|
-
|
2188
|
+
assert_scanned("#foo\nclass",
|
2163
2189
|
:kCLASS, 'class')
|
2164
2190
|
end
|
2165
2191
|
|
@@ -2167,37 +2193,37 @@ class TestLexer < Minitest::Test
|
|
2167
2193
|
setup_lexer(21)
|
2168
2194
|
|
2169
2195
|
@lex.state = :expr_endfn
|
2170
|
-
|
2196
|
+
assert_scanned('foo:',
|
2171
2197
|
:tLABEL, 'foo')
|
2172
2198
|
|
2173
2199
|
@lex.state = :expr_endfn
|
2174
|
-
|
2200
|
+
assert_scanned(' foo:',
|
2175
2201
|
:tLABEL, 'foo')
|
2176
2202
|
|
2177
2203
|
@lex.state = :expr_endfn
|
2178
|
-
|
2204
|
+
assert_scanned("\nfoo:",
|
2179
2205
|
:tNL, nil,
|
2180
2206
|
:tIDENTIFIER, 'foo',
|
2181
2207
|
:tCOLON, ':')
|
2182
2208
|
|
2183
2209
|
@lex.state = :expr_endfn
|
2184
|
-
|
2210
|
+
assert_scanned("\nfoo: ",
|
2185
2211
|
:tNL, nil,
|
2186
2212
|
:tIDENTIFIER, 'foo',
|
2187
2213
|
:tCOLON, ':')
|
2188
2214
|
|
2189
2215
|
@lex.state = :expr_endfn
|
2190
|
-
|
2216
|
+
assert_scanned("\\\nfoo:",
|
2191
2217
|
:tLABEL, 'foo')
|
2192
2218
|
|
2193
2219
|
@lex.state = :expr_endfn
|
2194
|
-
|
2220
|
+
assert_scanned("#foo\nfoo:",
|
2195
2221
|
:tNL, nil,
|
2196
2222
|
:tIDENTIFIER, 'foo',
|
2197
2223
|
:tCOLON, ':')
|
2198
2224
|
|
2199
2225
|
@lex.state = :expr_endfn
|
2200
|
-
|
2226
|
+
assert_scanned("#foo\nfoo: ",
|
2201
2227
|
:tNL, nil,
|
2202
2228
|
:tIDENTIFIER, 'foo',
|
2203
2229
|
:tCOLON, ':')
|
@@ -2205,121 +2231,121 @@ class TestLexer < Minitest::Test
|
|
2205
2231
|
|
2206
2232
|
def test_whitespace_dot
|
2207
2233
|
@lex.state = :expr_dot
|
2208
|
-
|
2234
|
+
assert_scanned('class',
|
2209
2235
|
:tIDENTIFIER, 'class')
|
2210
2236
|
|
2211
2237
|
@lex.state = :expr_dot
|
2212
|
-
|
2238
|
+
assert_scanned(' class',
|
2213
2239
|
:tIDENTIFIER, 'class')
|
2214
2240
|
|
2215
2241
|
@lex.state = :expr_dot
|
2216
|
-
|
2242
|
+
assert_scanned("\nclass",
|
2217
2243
|
:tIDENTIFIER, 'class')
|
2218
2244
|
|
2219
2245
|
@lex.state = :expr_dot
|
2220
|
-
|
2246
|
+
assert_scanned("\\\nclass",
|
2221
2247
|
:tIDENTIFIER, 'class')
|
2222
2248
|
|
2223
2249
|
@lex.state = :expr_dot
|
2224
|
-
|
2250
|
+
assert_scanned("#foo\nclass",
|
2225
2251
|
:tIDENTIFIER, 'class')
|
2226
2252
|
end
|
2227
2253
|
|
2228
2254
|
def test_whitespace_arg
|
2229
2255
|
@lex.state = :expr_arg
|
2230
|
-
|
2256
|
+
assert_scanned('+',
|
2231
2257
|
:tPLUS, '+')
|
2232
2258
|
|
2233
2259
|
@lex.state = :expr_arg
|
2234
|
-
|
2260
|
+
assert_scanned(' +',
|
2235
2261
|
:tUPLUS, '+')
|
2236
2262
|
|
2237
2263
|
@lex.state = :expr_arg
|
2238
|
-
|
2264
|
+
assert_scanned("\n+",
|
2239
2265
|
:tNL, nil,
|
2240
2266
|
:tUPLUS, '+')
|
2241
2267
|
|
2242
2268
|
@lex.state = :expr_arg
|
2243
|
-
|
2269
|
+
assert_scanned("\\\n+",
|
2244
2270
|
:tUPLUS, '+')
|
2245
2271
|
|
2246
2272
|
@lex.state = :expr_arg
|
2247
|
-
|
2273
|
+
assert_scanned("\\\n +",
|
2248
2274
|
:tUPLUS, '+')
|
2249
2275
|
|
2250
2276
|
@lex.state = :expr_arg
|
2251
|
-
|
2277
|
+
assert_scanned("#foo\n+",
|
2252
2278
|
:tNL, nil,
|
2253
2279
|
:tUPLUS, '+')
|
2254
2280
|
end
|
2255
2281
|
|
2256
2282
|
def test_whitespace_endarg
|
2257
2283
|
@lex.state = :expr_endarg
|
2258
|
-
|
2284
|
+
assert_scanned('{',
|
2259
2285
|
:tLBRACE_ARG, '{')
|
2260
2286
|
|
2261
2287
|
@lex.state = :expr_endarg
|
2262
|
-
|
2288
|
+
assert_scanned(' {',
|
2263
2289
|
:tLBRACE_ARG, '{')
|
2264
2290
|
|
2265
2291
|
@lex.state = :expr_endarg
|
2266
|
-
|
2292
|
+
assert_scanned("\n{",
|
2267
2293
|
:tNL, nil,
|
2268
2294
|
:tLBRACE, '{')
|
2269
2295
|
|
2270
2296
|
@lex.state = :expr_endarg
|
2271
|
-
|
2297
|
+
assert_scanned("\\\n{",
|
2272
2298
|
:tLBRACE_ARG, '{')
|
2273
2299
|
|
2274
2300
|
@lex.state = :expr_endarg
|
2275
|
-
|
2301
|
+
assert_scanned("#foo\n{",
|
2276
2302
|
:tNL, nil,
|
2277
2303
|
:tLBRACE, '{')
|
2278
2304
|
end
|
2279
2305
|
|
2280
2306
|
def test_whitespace_mid
|
2281
2307
|
@lex.state = :expr_mid
|
2282
|
-
|
2308
|
+
assert_scanned('+',
|
2283
2309
|
:tUPLUS, '+')
|
2284
2310
|
|
2285
2311
|
@lex.state = :expr_mid
|
2286
|
-
|
2312
|
+
assert_scanned(' +',
|
2287
2313
|
:tUPLUS, '+')
|
2288
2314
|
|
2289
2315
|
@lex.state = :expr_mid
|
2290
|
-
|
2316
|
+
assert_scanned("\n+",
|
2291
2317
|
:tNL, nil,
|
2292
2318
|
:tUPLUS, '+')
|
2293
2319
|
|
2294
2320
|
@lex.state = :expr_mid
|
2295
|
-
|
2321
|
+
assert_scanned("\\\n+",
|
2296
2322
|
:tUPLUS, '+')
|
2297
2323
|
|
2298
2324
|
@lex.state = :expr_mid
|
2299
|
-
|
2325
|
+
assert_scanned("#foo\n+",
|
2300
2326
|
:tNL, nil,
|
2301
2327
|
:tUPLUS, '+')
|
2302
2328
|
end
|
2303
2329
|
|
2304
2330
|
def test_whitespace_beg
|
2305
2331
|
@lex.state = :expr_beg
|
2306
|
-
|
2332
|
+
assert_scanned('+',
|
2307
2333
|
:tUPLUS, '+')
|
2308
2334
|
|
2309
2335
|
@lex.state = :expr_beg
|
2310
|
-
|
2336
|
+
assert_scanned(' +',
|
2311
2337
|
:tUPLUS, '+')
|
2312
2338
|
|
2313
2339
|
@lex.state = :expr_beg
|
2314
|
-
|
2340
|
+
assert_scanned("\n+",
|
2315
2341
|
:tUPLUS, '+')
|
2316
2342
|
|
2317
2343
|
@lex.state = :expr_beg
|
2318
|
-
|
2344
|
+
assert_scanned("\\\n+",
|
2319
2345
|
:tUPLUS, '+')
|
2320
2346
|
|
2321
2347
|
@lex.state = :expr_beg
|
2322
|
-
|
2348
|
+
assert_scanned("#foo\n+",
|
2323
2349
|
:tUPLUS, '+')
|
2324
2350
|
end
|
2325
2351
|
|
@@ -2327,55 +2353,55 @@ class TestLexer < Minitest::Test
|
|
2327
2353
|
setup_lexer(20)
|
2328
2354
|
|
2329
2355
|
@lex.state = :expr_value
|
2330
|
-
|
2356
|
+
assert_scanned('a:b',
|
2331
2357
|
:tIDENTIFIER, 'a',
|
2332
2358
|
:tSYMBOL, 'b')
|
2333
2359
|
|
2334
2360
|
@lex.state = :expr_value
|
2335
|
-
|
2361
|
+
assert_scanned(' a:b',
|
2336
2362
|
:tIDENTIFIER, 'a',
|
2337
2363
|
:tSYMBOL, 'b')
|
2338
2364
|
|
2339
2365
|
@lex.state = :expr_value
|
2340
|
-
|
2341
|
-
:
|
2342
|
-
:
|
2366
|
+
assert_scanned("\na:b",
|
2367
|
+
:tIDENTIFIER, 'a',
|
2368
|
+
:tSYMBOL, 'b')
|
2343
2369
|
|
2344
2370
|
@lex.state = :expr_value
|
2345
|
-
|
2371
|
+
assert_scanned("\\\na:b",
|
2346
2372
|
:tIDENTIFIER, 'a',
|
2347
2373
|
:tSYMBOL, 'b')
|
2348
2374
|
|
2349
2375
|
@lex.state = :expr_value
|
2350
|
-
|
2351
|
-
:
|
2352
|
-
:
|
2376
|
+
assert_scanned("#foo\na:b",
|
2377
|
+
:tIDENTIFIER, 'a',
|
2378
|
+
:tSYMBOL, 'b')
|
2353
2379
|
end
|
2354
2380
|
|
2355
2381
|
def test_whitespace_end
|
2356
2382
|
@lex.state = :expr_end
|
2357
|
-
|
2383
|
+
assert_scanned('+ 1',
|
2358
2384
|
:tPLUS, '+',
|
2359
2385
|
:tINTEGER, 1)
|
2360
2386
|
|
2361
2387
|
@lex.state = :expr_end
|
2362
|
-
|
2388
|
+
assert_scanned(' + 1',
|
2363
2389
|
:tPLUS, '+',
|
2364
2390
|
:tINTEGER, 1)
|
2365
2391
|
|
2366
2392
|
@lex.state = :expr_end
|
2367
|
-
|
2393
|
+
assert_scanned("\n+ 1",
|
2368
2394
|
:tNL, nil,
|
2369
2395
|
:tUPLUS, '+',
|
2370
2396
|
:tINTEGER, 1)
|
2371
2397
|
|
2372
2398
|
@lex.state = :expr_end
|
2373
|
-
|
2399
|
+
assert_scanned("\\\n+ 1",
|
2374
2400
|
:tPLUS, '+',
|
2375
2401
|
:tINTEGER, 1)
|
2376
2402
|
|
2377
2403
|
@lex.state = :expr_end
|
2378
|
-
|
2404
|
+
assert_scanned("#foo\n+ 1",
|
2379
2405
|
:tNL, nil,
|
2380
2406
|
:tUPLUS, '+',
|
2381
2407
|
:tINTEGER, 1)
|
@@ -2390,29 +2416,29 @@ class TestLexer < Minitest::Test
|
|
2390
2416
|
#
|
2391
2417
|
|
2392
2418
|
def test_bug_sclass_joined
|
2393
|
-
|
2419
|
+
assert_scanned("class<<self",
|
2394
2420
|
:kCLASS, "class",
|
2395
2421
|
:tLSHFT, "<<",
|
2396
2422
|
:kSELF, "self")
|
2397
2423
|
end
|
2398
2424
|
|
2399
2425
|
def test_bug_const_expr_end
|
2400
|
-
|
2426
|
+
assert_scanned("Option",
|
2401
2427
|
:tCONSTANT, 'Option')
|
2402
2428
|
|
2403
|
-
assert_equal :
|
2429
|
+
assert_equal :expr_cmdarg, @lex.state
|
2404
2430
|
end
|
2405
2431
|
|
2406
2432
|
def test_bug_expr_beg_div
|
2407
2433
|
@lex.state = :expr_beg
|
2408
|
-
|
2434
|
+
assert_scanned("/=/",
|
2409
2435
|
:tREGEXP_BEG, "/",
|
2410
2436
|
:tSTRING_CONTENT, "=",
|
2411
2437
|
:tSTRING_END, "/",
|
2412
2438
|
:tREGEXP_OPT, "")
|
2413
2439
|
|
2414
2440
|
@lex.state = :expr_beg
|
2415
|
-
|
2441
|
+
assert_scanned("/ = /",
|
2416
2442
|
:tREGEXP_BEG, "/",
|
2417
2443
|
:tSTRING_CONTENT, " = ",
|
2418
2444
|
:tSTRING_END, "/",
|
@@ -2421,13 +2447,13 @@ class TestLexer < Minitest::Test
|
|
2421
2447
|
|
2422
2448
|
def test_bug_expr_beg_percent
|
2423
2449
|
@lex.state = :expr_beg
|
2424
|
-
|
2450
|
+
assert_scanned("%=foo=",
|
2425
2451
|
:tSTRING_BEG, "%=",
|
2426
2452
|
:tSTRING_CONTENT, 'foo',
|
2427
2453
|
:tSTRING_END, "=")
|
2428
2454
|
|
2429
2455
|
@lex.state = :expr_beg
|
2430
|
-
|
2456
|
+
assert_scanned("% = ",
|
2431
2457
|
:tSTRING_BEG, "% ",
|
2432
2458
|
:tSTRING_CONTENT, '=',
|
2433
2459
|
:tSTRING_END, ' ')
|
@@ -2435,20 +2461,20 @@ class TestLexer < Minitest::Test
|
|
2435
2461
|
|
2436
2462
|
def test_bug_expr_beg_document
|
2437
2463
|
@lex.state = :expr_beg
|
2438
|
-
|
2464
|
+
assert_scanned(" \n=begin\n=end\nend",
|
2439
2465
|
:kEND, "end")
|
2440
2466
|
|
2441
2467
|
end
|
2442
2468
|
|
2443
2469
|
def test_bug_expr_beg_number
|
2444
2470
|
@lex.state = :expr_beg
|
2445
|
-
|
2471
|
+
assert_scanned("86400_000_000",
|
2446
2472
|
:tINTEGER, 86400_000_000)
|
2447
2473
|
end
|
2448
2474
|
|
2449
2475
|
def test_bug_expr_beg_backspace_nl
|
2450
2476
|
@lex.state = :expr_beg
|
2451
|
-
|
2477
|
+
assert_scanned("\n/foo/",
|
2452
2478
|
:tREGEXP_BEG, "/",
|
2453
2479
|
:tSTRING_CONTENT, "foo",
|
2454
2480
|
:tSTRING_END, "/",
|
@@ -2456,7 +2482,7 @@ class TestLexer < Minitest::Test
|
|
2456
2482
|
end
|
2457
2483
|
|
2458
2484
|
def test_bug_expr_beg_heredoc
|
2459
|
-
|
2485
|
+
assert_scanned("<<EOL % [\nfoo\nEOL\n]",
|
2460
2486
|
:tSTRING_BEG, '"',
|
2461
2487
|
:tSTRING_CONTENT, "foo\n",
|
2462
2488
|
:tSTRING_END, 'EOL',
|
@@ -2465,40 +2491,55 @@ class TestLexer < Minitest::Test
|
|
2465
2491
|
:tRBRACK, ']')
|
2466
2492
|
end
|
2467
2493
|
|
2494
|
+
def test_bug_expr_beg_fid
|
2495
|
+
assert_scanned("Rainbows!",
|
2496
|
+
:tFID, 'Rainbows!')
|
2497
|
+
end
|
2498
|
+
|
2499
|
+
def test_bug_expr_beg_rescue_assoc
|
2500
|
+
assert_scanned("rescue=>",
|
2501
|
+
:kRESCUE, 'rescue',
|
2502
|
+
:tASSOC, '=>')
|
2503
|
+
end
|
2504
|
+
|
2468
2505
|
def test_bug_expr_arg_percent
|
2469
2506
|
@lex.state = :expr_arg
|
2470
|
-
|
2507
|
+
assert_scanned("%[",
|
2471
2508
|
:tPERCENT, "%",
|
2472
2509
|
:tLBRACK, "[")
|
2473
2510
|
|
2474
2511
|
@lex.state = :expr_arg
|
2475
|
-
|
2512
|
+
assert_scanned("%=1",
|
2476
2513
|
:tOP_ASGN, "%",
|
2477
2514
|
:tINTEGER, 1)
|
2478
2515
|
|
2479
2516
|
@lex.state = :expr_arg
|
2480
|
-
|
2517
|
+
assert_scanned(" %[1]",
|
2481
2518
|
:tSTRING_BEG, "%[",
|
2482
2519
|
:tSTRING_CONTENT, '1',
|
2483
2520
|
:tSTRING_END, ']')
|
2484
2521
|
|
2485
2522
|
@lex.state = :expr_arg
|
2486
|
-
|
2523
|
+
assert_scanned(" %=1=",
|
2487
2524
|
:tOP_ASGN, "%",
|
2488
2525
|
:tINTEGER, 1,
|
2489
2526
|
:tEQL, "=")
|
2527
|
+
|
2528
|
+
@lex.state = :expr_arg
|
2529
|
+
assert_scanned(" %\n",
|
2530
|
+
:tPERCENT, '%')
|
2490
2531
|
end
|
2491
2532
|
|
2492
2533
|
def test_bug_expr_arg_lt_lt
|
2493
2534
|
@lex.state = :expr_arg
|
2494
|
-
|
2535
|
+
assert_scanned("<<EOS\nEOS",
|
2495
2536
|
:tLSHFT, "<<",
|
2496
2537
|
:tCONSTANT, "EOS",
|
2497
2538
|
:tNL, nil,
|
2498
2539
|
:tCONSTANT, "EOS")
|
2499
2540
|
|
2500
2541
|
@lex.state = :expr_arg
|
2501
|
-
|
2542
|
+
assert_scanned(" <<EOS\nEOS",
|
2502
2543
|
:tSTRING_BEG, "\"",
|
2503
2544
|
:tSTRING_END, "EOS",
|
2504
2545
|
:tNL, nil)
|
@@ -2506,24 +2547,24 @@ class TestLexer < Minitest::Test
|
|
2506
2547
|
|
2507
2548
|
def test_bug_expr_arg_slash
|
2508
2549
|
@lex.state = :expr_arg
|
2509
|
-
|
2550
|
+
assert_scanned("/1",
|
2510
2551
|
:tDIVIDE, "/",
|
2511
2552
|
:tINTEGER, 1)
|
2512
2553
|
|
2513
2554
|
@lex.state = :expr_arg
|
2514
|
-
|
2555
|
+
assert_scanned("/ 1",
|
2515
2556
|
:tDIVIDE, "/",
|
2516
2557
|
:tINTEGER, 1)
|
2517
2558
|
|
2518
2559
|
@lex.state = :expr_arg
|
2519
|
-
|
2560
|
+
assert_scanned(" /1/",
|
2520
2561
|
:tREGEXP_BEG, "/",
|
2521
2562
|
:tSTRING_CONTENT, "1",
|
2522
2563
|
:tSTRING_END, "/",
|
2523
2564
|
:tREGEXP_OPT, "")
|
2524
2565
|
|
2525
2566
|
@lex.state = :expr_arg
|
2526
|
-
|
2567
|
+
assert_scanned(" / 1",
|
2527
2568
|
:tDIVIDE, "/",
|
2528
2569
|
:tINTEGER, 1)
|
2529
2570
|
end
|
@@ -2532,17 +2573,17 @@ class TestLexer < Minitest::Test
|
|
2532
2573
|
setup_lexer 19
|
2533
2574
|
|
2534
2575
|
@lex.state = :expr_arg
|
2535
|
-
|
2576
|
+
assert_scanned(" unless:",
|
2536
2577
|
:tLABEL, 'unless')
|
2537
2578
|
|
2538
2579
|
@lex.state = :expr_arg
|
2539
|
-
|
2580
|
+
assert_scanned(" unless: ",
|
2540
2581
|
:tLABEL, 'unless')
|
2541
2582
|
end
|
2542
2583
|
|
2543
2584
|
def test_bug_heredoc_continuation
|
2544
2585
|
@lex.state = :expr_arg
|
2545
|
-
|
2586
|
+
assert_scanned(" <<EOS\nEOS\nend",
|
2546
2587
|
:tSTRING_BEG, "\"",
|
2547
2588
|
:tSTRING_END, "EOS",
|
2548
2589
|
:tNL, nil,
|
@@ -2550,15 +2591,15 @@ class TestLexer < Minitest::Test
|
|
2550
2591
|
end
|
2551
2592
|
|
2552
2593
|
def test_bug_heredoc_cr_lf
|
2553
|
-
|
2594
|
+
assert_scanned("<<FIN\r\nfoo\r\nFIN\r\n",
|
2554
2595
|
:tSTRING_BEG, "\"",
|
2555
|
-
:tSTRING_CONTENT, "foo\
|
2596
|
+
:tSTRING_CONTENT, "foo\n",
|
2556
2597
|
:tSTRING_END, "FIN",
|
2557
2598
|
:tNL, nil)
|
2558
2599
|
end
|
2559
2600
|
|
2560
2601
|
def test_bug_eh_symbol_no_newline
|
2561
|
-
|
2602
|
+
assert_scanned("?\"\nfoo",
|
2562
2603
|
:tINTEGER, 34,
|
2563
2604
|
:tNL, nil,
|
2564
2605
|
:tIDENTIFIER, "foo")
|
@@ -2566,30 +2607,36 @@ class TestLexer < Minitest::Test
|
|
2566
2607
|
|
2567
2608
|
def test_bug_expr_arg_newline
|
2568
2609
|
@lex.state = :expr_arg
|
2569
|
-
|
2610
|
+
assert_scanned("\nfoo",
|
2570
2611
|
:tNL, nil,
|
2571
2612
|
:tIDENTIFIER, "foo")
|
2572
2613
|
|
2573
2614
|
@lex.state = :expr_arg
|
2574
|
-
|
2615
|
+
assert_scanned(" \nfoo",
|
2575
2616
|
:tNL, nil,
|
2576
2617
|
:tIDENTIFIER, "foo")
|
2577
2618
|
|
2578
2619
|
@lex.state = :expr_arg
|
2579
|
-
|
2620
|
+
assert_scanned("#foo\nfoo",
|
2580
2621
|
:tNL, nil,
|
2581
2622
|
:tIDENTIFIER, "foo")
|
2582
2623
|
end
|
2583
2624
|
|
2584
2625
|
def test_bug_expr_arg_comment_newline
|
2585
2626
|
@lex.state = :expr_arg
|
2586
|
-
|
2627
|
+
assert_scanned(" #\nfoo",
|
2587
2628
|
:tNL, nil,
|
2588
2629
|
:tIDENTIFIER, 'foo')
|
2589
2630
|
end
|
2590
2631
|
|
2632
|
+
def test_bug_expr_arg_eh_crlf
|
2633
|
+
@lex.state = :expr_arg
|
2634
|
+
assert_scanned(" ?\r\n",
|
2635
|
+
:tEH, '?')
|
2636
|
+
end
|
2637
|
+
|
2591
2638
|
def test_bug_heredoc_backspace_nl
|
2592
|
-
|
2639
|
+
assert_scanned(" <<'XXX'\nf \\\nXXX\n",
|
2593
2640
|
:tSTRING_BEG, "'",
|
2594
2641
|
:tSTRING_CONTENT, "f \\\n",
|
2595
2642
|
:tSTRING_END, "XXX",
|
@@ -2597,7 +2644,7 @@ class TestLexer < Minitest::Test
|
|
2597
2644
|
end
|
2598
2645
|
|
2599
2646
|
def test_bug_heredoc_lshft
|
2600
|
-
|
2647
|
+
assert_scanned("<<RULES << CLEANINGS\nRULES",
|
2601
2648
|
:tSTRING_BEG, '"',
|
2602
2649
|
:tSTRING_END, 'RULES',
|
2603
2650
|
:tLSHFT, '<<',
|
@@ -2605,7 +2652,7 @@ class TestLexer < Minitest::Test
|
|
2605
2652
|
end
|
2606
2653
|
|
2607
2654
|
def test_bug_sclass_comment_lshft_label
|
2608
|
-
|
2655
|
+
assert_scanned("class # foo\n<< a:b;end",
|
2609
2656
|
:kCLASS, 'class',
|
2610
2657
|
:tLSHFT, '<<',
|
2611
2658
|
:tIDENTIFIER, 'a',
|
@@ -2615,59 +2662,278 @@ class TestLexer < Minitest::Test
|
|
2615
2662
|
end
|
2616
2663
|
|
2617
2664
|
def test_bug_expr_dot_comment
|
2618
|
-
|
2665
|
+
assert_scanned("foo. #bar\nbaz",
|
2619
2666
|
:tIDENTIFIER, 'foo',
|
2620
2667
|
:tDOT, '.',
|
2621
2668
|
:tIDENTIFIER, 'baz')
|
2622
2669
|
end
|
2623
2670
|
|
2671
|
+
def test_bug_expr_dot_fid
|
2672
|
+
assert_scanned("foo.S?",
|
2673
|
+
:tIDENTIFIER, 'foo',
|
2674
|
+
:tDOT, '.',
|
2675
|
+
:tFID, 'S?')
|
2676
|
+
end
|
2677
|
+
|
2678
|
+
def test_bug_expr_dot_id_eq
|
2679
|
+
assert_scanned("foo.x= 1",
|
2680
|
+
:tIDENTIFIER, 'foo',
|
2681
|
+
:tDOT, '.',
|
2682
|
+
:tIDENTIFIER, 'x',
|
2683
|
+
:tEQL, '=',
|
2684
|
+
:tINTEGER, 1)
|
2685
|
+
end
|
2686
|
+
|
2687
|
+
def test_bug_expr_dot_fid_mod
|
2688
|
+
assert_scanned("foo.x!if 1",
|
2689
|
+
:tIDENTIFIER, 'foo',
|
2690
|
+
:tDOT, '.',
|
2691
|
+
:tFID, 'x!',
|
2692
|
+
:kIF_MOD, 'if',
|
2693
|
+
:tINTEGER, 1)
|
2694
|
+
end
|
2695
|
+
|
2624
2696
|
def test_bug_expr_mid_comment
|
2625
|
-
|
2697
|
+
assert_scanned("rescue #bar\nprint",
|
2626
2698
|
:kRESCUE, 'rescue',
|
2627
2699
|
:tNL, nil,
|
2628
2700
|
:tIDENTIFIER, 'print')
|
2629
2701
|
end
|
2630
2702
|
|
2703
|
+
def test_bug_expr_mid_bareword
|
2704
|
+
assert_scanned("begin; rescue rescue1",
|
2705
|
+
:kBEGIN, 'begin',
|
2706
|
+
:tSEMI, ';',
|
2707
|
+
:kRESCUE, 'rescue',
|
2708
|
+
:tIDENTIFIER, 'rescue1')
|
2709
|
+
end
|
2710
|
+
|
2631
2711
|
def test_bug_expr_value_document
|
2632
|
-
|
2712
|
+
assert_scanned("1;\n=begin\n=end",
|
2633
2713
|
:tINTEGER, 1,
|
2634
2714
|
:tSEMI, ';')
|
2635
2715
|
end
|
2636
2716
|
|
2637
2717
|
def test_bug_expr_end_colon
|
2638
|
-
|
2718
|
+
assert_scanned("'foo':'bar'",
|
2639
2719
|
:tSTRING, 'foo',
|
2640
2720
|
:tCOLON, ':',
|
2641
2721
|
:tSTRING, 'bar')
|
2642
2722
|
end
|
2643
2723
|
|
2724
|
+
def test_bug_expr_value_rescue_colon2
|
2725
|
+
@lex.state = :expr_value
|
2726
|
+
assert_scanned("rescue::Exception",
|
2727
|
+
:kRESCUE, 'rescue',
|
2728
|
+
:tCOLON3, '::',
|
2729
|
+
:tCONSTANT, 'Exception')
|
2730
|
+
end
|
2731
|
+
|
2732
|
+
def test_bug_expr_endarg_braces
|
2733
|
+
assert_scanned("let [] {",
|
2734
|
+
:tIDENTIFIER, 'let',
|
2735
|
+
:tLBRACK, '[',
|
2736
|
+
:tRBRACK, ']',
|
2737
|
+
:tLBRACE_ARG, '{')
|
2738
|
+
end
|
2739
|
+
|
2740
|
+
def test_bug_line_begin_label
|
2741
|
+
setup_lexer(19)
|
2742
|
+
assert_scanned("foo:bar",
|
2743
|
+
:tIDENTIFIER, 'foo',
|
2744
|
+
:tSYMBOL, 'bar')
|
2745
|
+
end
|
2746
|
+
|
2747
|
+
def test_bug_interp_expr_value
|
2748
|
+
assert_scanned('"#{f:a}"',
|
2749
|
+
:tSTRING_BEG, '"',
|
2750
|
+
:tSTRING_DBEG, '#{',
|
2751
|
+
:tIDENTIFIER, 'f',
|
2752
|
+
:tSYMBOL, 'a',
|
2753
|
+
:tRCURLY, '}',
|
2754
|
+
:tSTRING_END, '"')
|
2755
|
+
end
|
2756
|
+
|
2757
|
+
def test_bug_const_e
|
2758
|
+
assert_scanned('E10',
|
2759
|
+
:tCONSTANT, 'E10')
|
2760
|
+
assert_scanned('E4U',
|
2761
|
+
:tCONSTANT, 'E4U')
|
2762
|
+
end
|
2763
|
+
|
2644
2764
|
def test_bug_symbol_newline
|
2645
|
-
|
2765
|
+
assert_scanned(":foo\n",
|
2646
2766
|
:tSYMBOL, 'foo',
|
2647
2767
|
:tNL, nil)
|
2648
2768
|
|
2649
|
-
|
2769
|
+
assert_scanned(":foo=\n",
|
2650
2770
|
:tSYMBOL, 'foo=',
|
2651
2771
|
:tNL, nil)
|
2652
2772
|
end
|
2653
2773
|
|
2654
|
-
def
|
2655
|
-
|
2656
|
-
|
2657
|
-
:
|
2658
|
-
:
|
2659
|
-
:
|
2774
|
+
def test_bug_interleaved_heredoc
|
2775
|
+
assert_scanned(%Q{<<w; "\nfoo\nw\n"},
|
2776
|
+
:tSTRING_BEG, '"',
|
2777
|
+
:tSTRING_CONTENT, "foo\n",
|
2778
|
+
:tSTRING_END, 'w',
|
2779
|
+
:tSEMI, ';',
|
2780
|
+
:tSTRING_BEG, '"',
|
2781
|
+
:tSTRING_CONTENT, "\n",
|
2782
|
+
:tSTRING_END, '"')
|
2783
|
+
|
2784
|
+
@lex.state = :expr_beg
|
2785
|
+
assert_scanned(%Q{<<w; %w[\nfoo\nw\n1]},
|
2786
|
+
:tSTRING_BEG, '"',
|
2787
|
+
:tSTRING_CONTENT, "foo\n",
|
2788
|
+
:tSTRING_END, 'w',
|
2789
|
+
:tSEMI, ';',
|
2790
|
+
:tQWORDS_BEG, '%w[',
|
2791
|
+
:tSTRING_CONTENT, "1",
|
2792
|
+
:tSPACE, nil,
|
2793
|
+
:tSTRING_END, ']')
|
2794
|
+
|
2795
|
+
@lex.state = :expr_beg
|
2796
|
+
assert_scanned(%Q{<<w; "\#{\nfoo\nw\n}"},
|
2797
|
+
:tSTRING_BEG, '"',
|
2798
|
+
:tSTRING_CONTENT, "foo\n",
|
2799
|
+
:tSTRING_END, 'w',
|
2800
|
+
:tSEMI, ';',
|
2801
|
+
:tSTRING_BEG, '"',
|
2802
|
+
:tSTRING_DBEG, '#{',
|
2803
|
+
:tRCURLY, '}',
|
2804
|
+
:tSTRING_END, '"')
|
2660
2805
|
end
|
2661
2806
|
|
2662
|
-
def
|
2807
|
+
def test_bug_fid_char
|
2663
2808
|
setup_lexer(19)
|
2664
|
-
|
2809
|
+
assert_scanned(%Q{eof??a},
|
2810
|
+
:tFID, 'eof?',
|
2811
|
+
:tSTRING, 'a')
|
2812
|
+
end
|
2813
|
+
|
2814
|
+
def test_bug_nonlabel_context__18
|
2815
|
+
env = Parser::StaticEnvironment.new
|
2816
|
+
env.declare "a"
|
2817
|
+
|
2818
|
+
@lex.static_env = env
|
2819
|
+
assert_scanned("1+a:a",
|
2820
|
+
:tINTEGER, 1,
|
2821
|
+
:tPLUS, '+',
|
2822
|
+
:tIDENTIFIER, 'a',
|
2823
|
+
:tCOLON, ':',
|
2824
|
+
:tIDENTIFIER, 'a')
|
2825
|
+
end
|
2826
|
+
|
2827
|
+
def test_bug_string_percent_newline
|
2828
|
+
assert_scanned(%Q{%\nfoo\n},
|
2829
|
+
:tSTRING_BEG, "%\n",
|
2830
|
+
:tSTRING_CONTENT, 'foo',
|
2831
|
+
:tSTRING_END, "\n")
|
2832
|
+
end
|
2833
|
+
|
2834
|
+
def test_bug_string_percent_zero
|
2835
|
+
assert_scanned(%Q{%\0foo\0},
|
2836
|
+
:tSTRING_BEG, "%\0",
|
2837
|
+
:tSTRING_CONTENT, 'foo',
|
2838
|
+
:tSTRING_END, "\0")
|
2839
|
+
end
|
2840
|
+
|
2841
|
+
def test_bug_string_utf_escape_composition
|
2842
|
+
assert_scanned(%q{"\xE2\x80\x99"},
|
2843
|
+
:tSTRING, "\xE2\x80\x99")
|
2844
|
+
|
2845
|
+
if defined?(Encoding)
|
2846
|
+
assert_scanned(%q{"\xE2\x80\x99"}.force_encoding(Encoding::UTF_8),
|
2847
|
+
:tSTRING, '’'.force_encoding(Encoding::UTF_8))
|
2848
|
+
assert_scanned(%q{"\342\200\231"}.force_encoding(Encoding::UTF_8),
|
2849
|
+
:tSTRING, '’'.force_encoding(Encoding::UTF_8))
|
2850
|
+
assert_scanned(%q{"\M-b\C-\M-@\C-\M-Y"}.force_encoding(Encoding::UTF_8),
|
2851
|
+
:tSTRING, '’'.force_encoding(Encoding::UTF_8))
|
2852
|
+
end
|
2853
|
+
end
|
2854
|
+
|
2855
|
+
def test_bug_string_non_utf
|
2856
|
+
assert_scanned(%Q{"caf\xE9"},
|
2857
|
+
:tSTRING, "caf\xE9")
|
2858
|
+
assert_scanned(%Q{"caf\xC3\xA9"},
|
2859
|
+
:tSTRING, "caf\xC3\xA9")
|
2860
|
+
|
2861
|
+
if defined?(Encoding)
|
2862
|
+
assert_scanned(%q{"café"}.force_encoding(Encoding::UTF_8),
|
2863
|
+
:tSTRING, "café".force_encoding(Encoding::UTF_8))
|
2864
|
+
end
|
2865
|
+
end
|
2866
|
+
|
2867
|
+
def test_bug_semi__END__
|
2868
|
+
assert_scanned(%Q{foo;\n__END__},
|
2665
2869
|
:tIDENTIFIER, 'foo',
|
2666
|
-
:
|
2870
|
+
:tSEMI, ';')
|
2871
|
+
end
|
2872
|
+
|
2873
|
+
def test_bug_eql_end
|
2874
|
+
assert_scanned(%Q{=begin\n#=end\n=end})
|
2875
|
+
end
|
2876
|
+
|
2877
|
+
def test_bug_hidden_eof
|
2878
|
+
@lex.state = :expr_beg
|
2879
|
+
assert_scanned(%Q{"foo\0\x1a\x04bar"},
|
2880
|
+
:tSTRING_BEG, '"',
|
2881
|
+
:tSTRING_CONTENT, "foo\0",
|
2882
|
+
:tSTRING_CONTENT, "\x1a",
|
2883
|
+
:tSTRING_CONTENT, "\x04",
|
2884
|
+
:tSTRING_CONTENT, "bar",
|
2885
|
+
:tSTRING_END, '"')
|
2886
|
+
|
2887
|
+
@lex.state = :expr_beg
|
2888
|
+
assert_scanned(%Q{'foo\0\x1a\x04bar'},
|
2889
|
+
:tSTRING_BEG, "'",
|
2890
|
+
:tSTRING_CONTENT, "foo\0",
|
2891
|
+
:tSTRING_CONTENT, "\x1a",
|
2892
|
+
:tSTRING_CONTENT, "\x04",
|
2893
|
+
:tSTRING_CONTENT, "bar",
|
2894
|
+
:tSTRING_END, "'")
|
2895
|
+
|
2896
|
+
@lex.state = :expr_beg
|
2897
|
+
assert_scanned(%Q{%w[foo\0\x1a\x04bar]},
|
2898
|
+
:tQWORDS_BEG, '%w[',
|
2899
|
+
:tSTRING_CONTENT, "foo\0",
|
2900
|
+
:tSTRING_CONTENT, "\x1a",
|
2901
|
+
:tSTRING_CONTENT, "\x04",
|
2902
|
+
:tSTRING_CONTENT, "bar",
|
2903
|
+
:tSPACE, nil,
|
2904
|
+
:tSTRING_END, ']')
|
2905
|
+
|
2906
|
+
@lex.state = :expr_beg
|
2907
|
+
assert_scanned(%Q{%W[foo\0\x1a\x04bar]},
|
2908
|
+
:tWORDS_BEG, '%W[',
|
2909
|
+
:tSTRING_CONTENT, "foo\0",
|
2910
|
+
:tSTRING_CONTENT, "\x1a",
|
2911
|
+
:tSTRING_CONTENT, "\x04",
|
2912
|
+
:tSTRING_CONTENT, "bar",
|
2913
|
+
:tSPACE, nil,
|
2914
|
+
:tSTRING_END, ']')
|
2915
|
+
|
2916
|
+
@lex.state = :expr_beg
|
2917
|
+
assert_scanned(%Q{# foo\0\nbar},
|
2918
|
+
:tIDENTIFIER, 'bar')
|
2919
|
+
|
2920
|
+
@lex.state = :line_begin
|
2921
|
+
assert_scanned(%Q{=begin\n\0\n=end\nbar},
|
2922
|
+
:tIDENTIFIER, 'bar')
|
2923
|
+
end
|
2924
|
+
|
2925
|
+
def test_bug_num_adj_kw
|
2926
|
+
assert_scanned(%q{1if},
|
2927
|
+
:tINTEGER, 1,
|
2928
|
+
:kIF_MOD, 'if')
|
2929
|
+
|
2930
|
+
assert_scanned(%q{1.0if},
|
2931
|
+
:tFLOAT, 1.0,
|
2932
|
+
:kIF_MOD, 'if')
|
2667
2933
|
end
|
2668
2934
|
|
2669
2935
|
def test_bug_ragel_stack
|
2670
|
-
|
2936
|
+
assert_scanned("\"\#{$2 ? $2 : 1}\"",
|
2671
2937
|
:tSTRING_BEG, "\"",
|
2672
2938
|
:tSTRING_DBEG, "\#{",
|
2673
2939
|
:tNTH_REF, 2,
|