parser 2.1.0.pre1 → 2.1.0.pre2
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/CHANGELOG.md +12 -0
- data/lib/parser.rb +1 -52
- data/lib/parser/base.rb +5 -7
- data/lib/parser/builders/default.rb +12 -20
- data/lib/parser/diagnostic.rb +23 -5
- data/lib/parser/diagnostic/engine.rb +3 -2
- data/lib/parser/lexer.rl +27 -37
- data/lib/parser/lexer/literal.rb +3 -7
- data/lib/parser/messages.rb +64 -0
- data/lib/parser/ruby18.y +12 -12
- data/lib/parser/ruby19.y +11 -11
- data/lib/parser/ruby20.y +10 -10
- data/lib/parser/ruby21.y +10 -10
- data/lib/parser/source/rewriter.rb +4 -2
- data/lib/parser/version.rb +1 -1
- data/test/parse_helper.rb +5 -2
- data/test/test_diagnostic.rb +5 -5
- data/test/test_diagnostic_engine.rb +6 -6
- data/test/test_lexer.rb +8 -0
- metadata +45 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ada647b43495037cf17844d58832f74d63348d88
|
4
|
+
data.tar.gz: 4c4a750b4e696fb5f31f8b6c46718f2d71731651
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69ae3a6286559fa7942af81b631cc1389cb0075f5c683cc460a46f1d3a29a1527f174604dd220c687c4b660e1e4bb409b49ce401f8113d4b5be5481486a3fe12
|
7
|
+
data.tar.gz: 94b9c811b9d55d468ecc7de739228fa4c6622eb46bbfb7bdf3b4ef637f566fd2804e459354059b92ae6fb96fa0d2b2d9ffe9980bbf2a35236ac1d86687da985e
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
v2.1.0.pre2 (2013-11-25)
|
5
|
+
------------------------
|
6
|
+
|
7
|
+
API modifications:
|
8
|
+
* Parser::Diagnostic: expose reason symbolically (closes #115, #116). (Ian MacLeod)
|
9
|
+
|
10
|
+
vir (2013-11-13)
|
11
|
+
----------------
|
12
|
+
|
13
|
+
API modifications:
|
14
|
+
* lexer.rl: coerce literals to UTF-8 in ASCII-encoded files if they contain \uXXXX (Peter Zotov)
|
15
|
+
|
4
16
|
v2.1.0.pre1 (2013-11-12)
|
5
17
|
------------------------
|
6
18
|
|
data/lib/parser.rb
CHANGED
@@ -16,6 +16,7 @@ end
|
|
16
16
|
#
|
17
17
|
module Parser
|
18
18
|
require 'parser/version'
|
19
|
+
require 'parser/messages'
|
19
20
|
|
20
21
|
module AST
|
21
22
|
require 'parser/ast/node'
|
@@ -64,58 +65,6 @@ module Parser
|
|
64
65
|
|
65
66
|
require 'parser/rewriter'
|
66
67
|
|
67
|
-
ERRORS = {
|
68
|
-
# Lexer errors
|
69
|
-
:unicode_point_too_large => 'invalid Unicode codepoint (too large)',
|
70
|
-
:invalid_escape => 'invalid escape character syntax',
|
71
|
-
:incomplete_escape => 'incomplete character syntax',
|
72
|
-
:invalid_hex_escape => 'invalid hex escape',
|
73
|
-
:invalid_unicode_escape => 'invalid Unicode escape',
|
74
|
-
:unterminated_unicode => 'unterminated Unicode escape',
|
75
|
-
:escape_eof => 'escape sequence meets end of file',
|
76
|
-
:string_eof => 'unterminated string meets end of file',
|
77
|
-
:regexp_options => 'unknown regexp options: %{options}',
|
78
|
-
:cvar_name => "`%{name}' is not allowed as a class variable name",
|
79
|
-
:ivar_name => "`%{name}' is not allowed as an instance variable name",
|
80
|
-
:trailing_in_number => "trailing `%{character}' in number",
|
81
|
-
:empty_numeric => 'numeric literal without digits',
|
82
|
-
:invalid_octal => 'invalid octal digit',
|
83
|
-
:no_dot_digit_literal => 'no .<digit> floating literal anymore; put 0 before dot',
|
84
|
-
:bare_backslash => 'bare backslash only allowed before newline',
|
85
|
-
:unexpected => "unexpected `%{character}'",
|
86
|
-
:embedded_document => 'embedded document meets end of file (and they embark on a romantic journey)',
|
87
|
-
|
88
|
-
# Lexer warnings
|
89
|
-
:invalid_escape_use => 'invalid character syntax; use ?%{escape}',
|
90
|
-
:ambiguous_literal => 'ambiguous first argument; parenthesize arguments or add whitespace to the right',
|
91
|
-
:ambiguous_prefix => "`%{prefix}' interpreted as argument prefix",
|
92
|
-
|
93
|
-
# Parser errors
|
94
|
-
:nth_ref_alias => 'cannot define an alias for a back-reference variable',
|
95
|
-
:begin_in_method => 'BEGIN in method',
|
96
|
-
:backref_assignment => 'cannot assign to a back-reference variable',
|
97
|
-
:invalid_assignment => 'cannot assign to a keyword',
|
98
|
-
:module_name_const => 'class or module name must be a constant literal',
|
99
|
-
:unexpected_token => 'unexpected token %{token}',
|
100
|
-
:argument_const => 'formal argument cannot be a constant',
|
101
|
-
:argument_ivar => 'formal argument cannot be an instance variable',
|
102
|
-
:argument_gvar => 'formal argument cannot be a global variable',
|
103
|
-
:argument_cvar => 'formal argument cannot be a class variable',
|
104
|
-
:duplicate_argument => 'duplicate argument name',
|
105
|
-
:empty_symbol => 'empty symbol literal',
|
106
|
-
:odd_hash => 'odd number of entries for a hash',
|
107
|
-
:singleton_literal => 'cannot define a singleton method for a literal',
|
108
|
-
:dynamic_const => 'dynamic constant assignment',
|
109
|
-
:module_in_def => 'module definition in method body',
|
110
|
-
:class_in_def => 'class definition in method body',
|
111
|
-
:unexpected_percent_str => '%{type}: unknown type of percent-literal',
|
112
|
-
:block_and_blockarg => 'both block argument and literal block are passed',
|
113
|
-
:masgn_as_condition => 'multiple assignment in conditional context',
|
114
|
-
|
115
|
-
# Parser warnings
|
116
|
-
:useless_else => 'else without rescue is useless',
|
117
|
-
}.freeze
|
118
|
-
|
119
68
|
##
|
120
69
|
# Verify that the current Ruby implementation supports Encoding.
|
121
70
|
# @raise [RuntimeError]
|
data/lib/parser/base.rb
CHANGED
@@ -235,11 +235,11 @@ module Parser
|
|
235
235
|
when /^[a-z_]/
|
236
236
|
# OK
|
237
237
|
when /^[A-Z]/
|
238
|
-
diagnostic :error, :argument_const, name_t
|
238
|
+
diagnostic :error, :argument_const, nil, name_t
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
|
-
def diagnostic(level,
|
242
|
+
def diagnostic(level, reason, arguments, location_t, highlights_ts=[])
|
243
243
|
_, location = location_t
|
244
244
|
|
245
245
|
highlights = highlights_ts.map do |token|
|
@@ -247,9 +247,8 @@ module Parser
|
|
247
247
|
range
|
248
248
|
end
|
249
249
|
|
250
|
-
message = ERRORS[kind]
|
251
250
|
@diagnostics.process(
|
252
|
-
Diagnostic.new(level,
|
251
|
+
Diagnostic.new(level, reason, arguments, location, highlights))
|
253
252
|
|
254
253
|
if level == :error
|
255
254
|
yyerror
|
@@ -260,9 +259,8 @@ module Parser
|
|
260
259
|
token_name = token_to_str(error_token_id)
|
261
260
|
_, location = error_value
|
262
261
|
|
263
|
-
|
264
|
-
|
265
|
-
Diagnostic.new(:error, message, location))
|
262
|
+
@diagnostics.process(Diagnostic.new(
|
263
|
+
:error, :unexpected_token, { :token => token_name }, location))
|
266
264
|
end
|
267
265
|
end
|
268
266
|
|
@@ -146,7 +146,7 @@ module Parser
|
|
146
146
|
n(:sym, [ str.children.first.to_sym ],
|
147
147
|
collection_map(begin_t, str.loc.expression, end_t))
|
148
148
|
elsif @parser.version == 18 && parts.empty?
|
149
|
-
diagnostic
|
149
|
+
diagnostic :error, :empty_symbol, nil, loc(begin_t).join(loc(end_t))
|
150
150
|
else
|
151
151
|
n(:dsym, [ *parts ],
|
152
152
|
collection_map(begin_t, parts, end_t))
|
@@ -233,8 +233,7 @@ module Parser
|
|
233
233
|
|
234
234
|
def pair_list_18(list)
|
235
235
|
if list.size % 2 != 0
|
236
|
-
|
237
|
-
diagnostic :error, message, list.last.loc.expression
|
236
|
+
diagnostic :error, :odd_hash, nil, list.last.loc.expression
|
238
237
|
else
|
239
238
|
list.
|
240
239
|
each_slice(2).map do |key, value|
|
@@ -390,8 +389,7 @@ module Parser
|
|
390
389
|
|
391
390
|
when :const
|
392
391
|
if @parser.in_def?
|
393
|
-
|
394
|
-
diagnostic :error, message, node.loc.expression
|
392
|
+
diagnostic :error, :dynamic_const, nil, node.loc.expression
|
395
393
|
end
|
396
394
|
|
397
395
|
node.updated(:casgn)
|
@@ -404,12 +402,10 @@ module Parser
|
|
404
402
|
|
405
403
|
when :nil, :self, :true, :false,
|
406
404
|
:__FILE__, :__LINE__, :__ENCODING__
|
407
|
-
|
408
|
-
diagnostic :error, message, node.loc.expression
|
405
|
+
diagnostic :error, :invalid_assignment, nil, node.loc.expression
|
409
406
|
|
410
407
|
when :back_ref, :nth_ref
|
411
|
-
|
412
|
-
diagnostic :error, message, node.loc.expression
|
408
|
+
diagnostic :error, :backref_assignment, nil, node.loc.expression
|
413
409
|
end
|
414
410
|
end
|
415
411
|
|
@@ -442,8 +438,7 @@ module Parser
|
|
442
438
|
end
|
443
439
|
|
444
440
|
when :back_ref, :nth_ref
|
445
|
-
|
446
|
-
diagnostic :error, message, lhs.loc.expression
|
441
|
+
diagnostic :error, :backref_assignment, nil, lhs.loc.expression
|
447
442
|
end
|
448
443
|
end
|
449
444
|
|
@@ -497,8 +492,7 @@ module Parser
|
|
497
492
|
when :int, :str, :dstr, :sym, :dsym,
|
498
493
|
:regexp, :array, :hash
|
499
494
|
|
500
|
-
|
501
|
-
diagnostic :error, message, definee.loc.expression
|
495
|
+
diagnostic :error, :singleton_literal, nil, definee.loc.expression
|
502
496
|
|
503
497
|
else
|
504
498
|
n(:defs, [ definee, value(name_t).to_sym, args, body ],
|
@@ -634,8 +628,7 @@ module Parser
|
|
634
628
|
last_arg = call_args.last
|
635
629
|
|
636
630
|
if last_arg && last_arg.type == :block_pass
|
637
|
-
diagnostic :error,
|
638
|
-
last_arg.loc.expression
|
631
|
+
diagnostic :error, :block_and_blockarg, nil, last_arg.loc.expression
|
639
632
|
end
|
640
633
|
|
641
634
|
n(:block, [ method_call, args, body ],
|
@@ -935,8 +928,7 @@ module Parser
|
|
935
928
|
def check_condition(cond)
|
936
929
|
case cond.type
|
937
930
|
when :masgn
|
938
|
-
diagnostic :error,
|
939
|
-
cond.loc.expression
|
931
|
+
diagnostic :error, :masgn_as_condition, nil, cond.loc.expression
|
940
932
|
|
941
933
|
when :begin
|
942
934
|
if cond.children.count == 1
|
@@ -988,7 +980,7 @@ module Parser
|
|
988
980
|
if that_arg.nil?
|
989
981
|
map[this_name] = this_arg
|
990
982
|
elsif arg_name_collides?(this_name, that_name)
|
991
|
-
diagnostic :error,
|
983
|
+
diagnostic :error, :duplicate_argument, nil,
|
992
984
|
this_arg.loc.name, [ that_arg.loc.name ]
|
993
985
|
end
|
994
986
|
|
@@ -1341,9 +1333,9 @@ module Parser
|
|
1341
1333
|
token[1] if token && token[0]
|
1342
1334
|
end
|
1343
1335
|
|
1344
|
-
def diagnostic(type,
|
1336
|
+
def diagnostic(type, reason, arguments, location, highlights=[])
|
1345
1337
|
@parser.diagnostics.process(
|
1346
|
-
Diagnostic.new(type,
|
1338
|
+
Diagnostic.new(type, reason, arguments, location, highlights))
|
1347
1339
|
|
1348
1340
|
if type == :error
|
1349
1341
|
@parser.send :yyerror
|
data/lib/parser/diagnostic.rb
CHANGED
@@ -7,6 +7,14 @@ module Parser
|
|
7
7
|
# @see LEVELS
|
8
8
|
# @return [Symbol] diagnostic level
|
9
9
|
#
|
10
|
+
# @!attribute [r] reason
|
11
|
+
# @see Parser::MESSAGES
|
12
|
+
# @return [Symbol] reason for error
|
13
|
+
#
|
14
|
+
# @!attribute [r] arguments
|
15
|
+
# @see Parser::MESSAGES
|
16
|
+
# @return [Symbol] extended arguments that describe the error
|
17
|
+
#
|
10
18
|
# @!attribute [r] message
|
11
19
|
# @return [String] error message
|
12
20
|
#
|
@@ -26,30 +34,40 @@ module Parser
|
|
26
34
|
#
|
27
35
|
LEVELS = [:note, :warning, :error, :fatal].freeze
|
28
36
|
|
29
|
-
attr_reader :level, :
|
37
|
+
attr_reader :level, :reason, :arguments
|
30
38
|
attr_reader :location, :highlights
|
31
39
|
|
32
40
|
##
|
33
41
|
# @param [Symbol] level
|
34
|
-
# @param [
|
42
|
+
# @param [Symbol] reason
|
43
|
+
# @param [Hash] arguments
|
35
44
|
# @param [Parser::Source::Range] location
|
36
45
|
# @param [Array<Parser::Source::Range>] highlights
|
37
46
|
#
|
38
|
-
def initialize(level,
|
47
|
+
def initialize(level, reason, arguments, location, highlights=[])
|
39
48
|
unless LEVELS.include?(level)
|
40
49
|
raise ArgumentError,
|
41
50
|
"Diagnostic#level must be one of #{LEVELS.join(', ')}; " \
|
42
51
|
"#{level.inspect} provided."
|
43
52
|
end
|
53
|
+
raise 'Expected a location' unless location
|
44
54
|
|
45
55
|
@level = level
|
46
|
-
@
|
56
|
+
@reason = reason
|
57
|
+
@arguments = (arguments || {}).dup.freeze
|
47
58
|
@location = location
|
48
59
|
@highlights = highlights.dup.freeze
|
49
60
|
|
50
61
|
freeze
|
51
62
|
end
|
52
63
|
|
64
|
+
##
|
65
|
+
# @return [String] the rendered message.
|
66
|
+
#
|
67
|
+
def message
|
68
|
+
MESSAGES[@reason] % @arguments
|
69
|
+
end
|
70
|
+
|
53
71
|
##
|
54
72
|
# Renders the diagnostic message as a clang-like diagnostic.
|
55
73
|
#
|
@@ -76,7 +94,7 @@ module Parser
|
|
76
94
|
highlight_line[range] = '^' * @location.size
|
77
95
|
|
78
96
|
[
|
79
|
-
"#{@location.to_s}: #{@level}: #{
|
97
|
+
"#{@location.to_s}: #{@level}: #{message}",
|
80
98
|
source_line,
|
81
99
|
highlight_line,
|
82
100
|
]
|
@@ -13,9 +13,10 @@ module Parser
|
|
13
13
|
# end
|
14
14
|
#
|
15
15
|
# engine = Parser::Diagnostic::Engine.new(consumer)
|
16
|
-
# diagnostic = Parser::Diagnostic.new(
|
16
|
+
# diagnostic = Parser::Diagnostic.new(
|
17
|
+
# :warning, :unexpected_token, { :token => 'abc' }, buffer, 1..2)
|
17
18
|
#
|
18
|
-
# engine.process(diagnostic) # => "
|
19
|
+
# engine.process(diagnostic) # => "unexpected token abc"
|
19
20
|
#
|
20
21
|
# @api public
|
21
22
|
#
|
data/lib/parser/lexer.rl
CHANGED
@@ -348,9 +348,9 @@ class Parser::Lexer
|
|
348
348
|
nil
|
349
349
|
end
|
350
350
|
|
351
|
-
def diagnostic(type,
|
351
|
+
def diagnostic(type, reason, arguments=nil, location=range, highlights=[])
|
352
352
|
@diagnostics.process(
|
353
|
-
Parser::Diagnostic.new(type,
|
353
|
+
Parser::Diagnostic.new(type, reason, arguments, location, highlights))
|
354
354
|
end
|
355
355
|
|
356
356
|
#
|
@@ -622,7 +622,7 @@ class Parser::Lexer
|
|
622
622
|
|
623
623
|
if codepoint >= 0x110000
|
624
624
|
@escape = lambda do
|
625
|
-
diagnostic :error,
|
625
|
+
diagnostic :error, :unicode_point_too_large, nil,
|
626
626
|
range(codepoint_s, codepoint_s + codepoint_str.length)
|
627
627
|
end
|
628
628
|
|
@@ -644,7 +644,7 @@ class Parser::Lexer
|
|
644
644
|
|
645
645
|
action invalid_complex_escape {
|
646
646
|
@escape = lambda do
|
647
|
-
diagnostic :error,
|
647
|
+
diagnostic :error, :invalid_escape
|
648
648
|
end
|
649
649
|
}
|
650
650
|
|
@@ -684,7 +684,7 @@ class Parser::Lexer
|
|
684
684
|
| 'x' ( c_any - xdigit )
|
685
685
|
% {
|
686
686
|
@escape = lambda do
|
687
|
-
diagnostic :error,
|
687
|
+
diagnostic :error, :invalid_hex_escape, nil,
|
688
688
|
range(@escape_s - 1, p + 2)
|
689
689
|
end
|
690
690
|
}
|
@@ -699,7 +699,7 @@ class Parser::Lexer
|
|
699
699
|
)
|
700
700
|
% {
|
701
701
|
@escape = lambda do
|
702
|
-
diagnostic :error,
|
702
|
+
diagnostic :error, :invalid_unicode_escape, nil,
|
703
703
|
range(@escape_s - 1, p)
|
704
704
|
end
|
705
705
|
}
|
@@ -713,7 +713,7 @@ class Parser::Lexer
|
|
713
713
|
| xdigit{7,}
|
714
714
|
) % {
|
715
715
|
@escape = lambda do
|
716
|
-
diagnostic :fatal,
|
716
|
+
diagnostic :fatal, :unterminated_unicode, nil,
|
717
717
|
range(p - 1, p)
|
718
718
|
end
|
719
719
|
}
|
@@ -741,8 +741,7 @@ class Parser::Lexer
|
|
741
741
|
| ( c_any - [0-7xuCMc] ) %unescape_char
|
742
742
|
|
743
743
|
| c_eof % {
|
744
|
-
diagnostic :fatal,
|
745
|
-
range(p - 1, p)
|
744
|
+
diagnostic :fatal, :escape_eof, nil, range(p - 1, p)
|
746
745
|
}
|
747
746
|
);
|
748
747
|
|
@@ -856,7 +855,7 @@ class Parser::Lexer
|
|
856
855
|
# has to handle such case specially.
|
857
856
|
action extend_string_eol {
|
858
857
|
if @te == pe
|
859
|
-
diagnostic :fatal,
|
858
|
+
diagnostic :fatal, :string_eof, nil,
|
860
859
|
range(literal.str_s, literal.str_s + 1)
|
861
860
|
end
|
862
861
|
|
@@ -1031,8 +1030,8 @@ class Parser::Lexer
|
|
1031
1030
|
=> {
|
1032
1031
|
unknown_options = tok.scan(/[^imxouesn]/)
|
1033
1032
|
if unknown_options.any?
|
1034
|
-
|
1035
|
-
|
1033
|
+
diagnostic :error, :regexp_options,
|
1034
|
+
{ :options => unknown_options.join }
|
1036
1035
|
end
|
1037
1036
|
|
1038
1037
|
emit(:tREGEXP_OPT)
|
@@ -1183,8 +1182,7 @@ class Parser::Lexer
|
|
1183
1182
|
class_var_v
|
1184
1183
|
=> {
|
1185
1184
|
if tok =~ /^@@[0-9]/
|
1186
|
-
|
1187
|
-
diagnostic :error, message
|
1185
|
+
diagnostic :error, :cvar_name, { :name => tok }
|
1188
1186
|
end
|
1189
1187
|
|
1190
1188
|
emit(:tCVAR)
|
@@ -1194,8 +1192,7 @@ class Parser::Lexer
|
|
1194
1192
|
instance_var_v
|
1195
1193
|
=> {
|
1196
1194
|
if tok =~ /^@[0-9]/
|
1197
|
-
|
1198
|
-
diagnostic :error, message
|
1195
|
+
diagnostic :error, :ivar_name, { :name => tok }
|
1199
1196
|
end
|
1200
1197
|
|
1201
1198
|
emit(:tIVAR)
|
@@ -1369,8 +1366,7 @@ class Parser::Lexer
|
|
1369
1366
|
# Ambiguous regexp literal.
|
1370
1367
|
w_space+ '/'
|
1371
1368
|
=> {
|
1372
|
-
diagnostic :warning,
|
1373
|
-
range(@te - 1, @te)
|
1369
|
+
diagnostic :warning, :ambiguous_literal, nil, range(@te - 1, @te)
|
1374
1370
|
|
1375
1371
|
fhold; fgoto expr_beg;
|
1376
1372
|
};
|
@@ -1379,8 +1375,7 @@ class Parser::Lexer
|
|
1379
1375
|
# Ambiguous splat, kwsplat or block-pass.
|
1380
1376
|
w_space+ %{ tm = p } ( '+' | '-' | '*' | '&' | '**' )
|
1381
1377
|
=> {
|
1382
|
-
|
1383
|
-
diagnostic :warning, message,
|
1378
|
+
diagnostic :warning, :ambiguous_prefix, { :prefix => tok(tm, @te) },
|
1384
1379
|
range(tm, @te)
|
1385
1380
|
|
1386
1381
|
p = tm - 1
|
@@ -1581,8 +1576,7 @@ class Parser::Lexer
|
|
1581
1576
|
|
1582
1577
|
'%' c_eof
|
1583
1578
|
=> {
|
1584
|
-
diagnostic :fatal,
|
1585
|
-
range(@ts, @ts + 1)
|
1579
|
+
diagnostic :fatal, :string_eof, nil, range(@ts, @ts + 1)
|
1586
1580
|
};
|
1587
1581
|
|
1588
1582
|
# Heredoc start.
|
@@ -1660,8 +1654,7 @@ class Parser::Lexer
|
|
1660
1654
|
=> {
|
1661
1655
|
escape = { " " => '\s', "\r" => '\r', "\n" => '\n', "\t" => '\t',
|
1662
1656
|
"\v" => '\v', "\f" => '\f' }[tok[1]]
|
1663
|
-
|
1664
|
-
diagnostic :warning, message, range
|
1657
|
+
diagnostic :warning, :invalid_escape_use, { :escape => escape }, range
|
1665
1658
|
|
1666
1659
|
p = @ts - 1
|
1667
1660
|
fgoto expr_end;
|
@@ -1669,8 +1662,7 @@ class Parser::Lexer
|
|
1669
1662
|
|
1670
1663
|
'?' c_eof
|
1671
1664
|
=> {
|
1672
|
-
diagnostic :fatal,
|
1673
|
-
range(@ts, @ts + 1)
|
1665
|
+
diagnostic :fatal, :incomplete_escape, nil, range(@ts, @ts + 1)
|
1674
1666
|
};
|
1675
1667
|
|
1676
1668
|
# f ?aa : b: Disambiguate with a character literal.
|
@@ -1914,16 +1906,16 @@ class Parser::Lexer
|
|
1914
1906
|
digits = tok(@num_digits_s, @num_suffix_s)
|
1915
1907
|
|
1916
1908
|
if digits.end_with? '_'
|
1917
|
-
diagnostic :error,
|
1909
|
+
diagnostic :error, :trailing_in_number, { :character => '_' },
|
1918
1910
|
range(@te - 1, @te)
|
1919
1911
|
elsif digits.empty? && @num_base == 8 && version?(18)
|
1920
1912
|
# 1.8 did not raise an error on 0o.
|
1921
1913
|
digits = "0"
|
1922
1914
|
elsif digits.empty?
|
1923
|
-
diagnostic :error,
|
1915
|
+
diagnostic :error, :empty_numeric
|
1924
1916
|
elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/))
|
1925
1917
|
invalid_s = @num_digits_s + invalid_idx
|
1926
|
-
diagnostic :error,
|
1918
|
+
diagnostic :error, :invalid_octal, nil,
|
1927
1919
|
range(invalid_s, invalid_s + 1)
|
1928
1920
|
end
|
1929
1921
|
|
@@ -1938,14 +1930,14 @@ class Parser::Lexer
|
|
1938
1930
|
|
1939
1931
|
flo_frac flo_pow?
|
1940
1932
|
=> {
|
1941
|
-
diagnostic :error,
|
1933
|
+
diagnostic :error, :no_dot_digit_literal
|
1942
1934
|
};
|
1943
1935
|
|
1944
1936
|
flo_int [eE]
|
1945
1937
|
=> {
|
1946
1938
|
if version?(18, 19, 20)
|
1947
1939
|
diagnostic :error,
|
1948
|
-
|
1940
|
+
:trailing_in_number, { :character => tok(@te - 1, @te) },
|
1949
1941
|
range(@te - 1, @te)
|
1950
1942
|
else
|
1951
1943
|
emit(:tINTEGER, tok(@ts, @te - 1).to_i)
|
@@ -1957,7 +1949,7 @@ class Parser::Lexer
|
|
1957
1949
|
=> {
|
1958
1950
|
if version?(18, 19, 20)
|
1959
1951
|
diagnostic :error,
|
1960
|
-
|
1952
|
+
:trailing_in_number, { :character => tok(@te - 1, @te) },
|
1961
1953
|
range(@te - 1, @te)
|
1962
1954
|
else
|
1963
1955
|
emit(:tFLOAT, tok(@ts, @te - 1).to_f)
|
@@ -2078,15 +2070,13 @@ class Parser::Lexer
|
|
2078
2070
|
fnext expr_value; fbreak; };
|
2079
2071
|
|
2080
2072
|
'\\' c_line {
|
2081
|
-
diagnostic :error,
|
2082
|
-
range(@ts, @ts + 1)
|
2073
|
+
diagnostic :error, :bare_backslash, nil, range(@ts, @ts + 1)
|
2083
2074
|
fhold;
|
2084
2075
|
};
|
2085
2076
|
|
2086
2077
|
c_any
|
2087
2078
|
=> {
|
2088
|
-
|
2089
|
-
diagnostic :fatal, message
|
2079
|
+
diagnostic :fatal, :unexpected, { :character => tok.inspect[1..-2] }
|
2090
2080
|
};
|
2091
2081
|
|
2092
2082
|
c_eof => do_eof;
|
@@ -2120,7 +2110,7 @@ class Parser::Lexer
|
|
2120
2110
|
|
2121
2111
|
c_line* zlen
|
2122
2112
|
=> {
|
2123
|
-
diagnostic :fatal,
|
2113
|
+
diagnostic :fatal, :embedded_document, nil,
|
2124
2114
|
range(@eq_begin_s, @eq_begin_s + '=begin'.length)
|
2125
2115
|
};
|
2126
2116
|
*|;
|