parser 2.3.0.2 → 2.3.0.3
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 +7 -1
- data/doc/AST_FORMAT.md +1 -1
- data/lib/parser/lexer.rl +82 -96
- data/lib/parser/lexer/literal.rb +5 -5
- data/lib/parser/source/buffer.rb +39 -12
- data/lib/parser/source/comment/associator.rb +17 -11
- data/lib/parser/source/range.rb +22 -12
- data/lib/parser/source/rewriter.rb +214 -59
- data/lib/parser/version.rb +1 -1
- data/test/parse_helper.rb +36 -26
- data/test/test_lexer.rb +1181 -1147
- data/test/test_parser.rb +12 -0
- data/test/test_source_comment_associator.rb +17 -0
- data/test/test_source_range.rb +20 -0
- data/test/test_source_rewriter.rb +269 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32b8e79e47ae5063bd6a4451c47b337f43d5a2a2
|
4
|
+
data.tar.gz: c8d08375dca4b4089fa0dade5d77f13284498852
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 039b018cd53937074f6a0eb1b366c5d83c0de6ed104a3ca63597b265c695f010e2ae85fdee74bc9c00418510e386e9fc7e2ff44dd9dc9ead2ddef5cc3ef0ec1e
|
7
|
+
data.tar.gz: 4b8b8b3497d1034e4662aa8ad3cf85c57cd65cb73e038bf7737c63db832d719714aa2bafd2fef5dcdb85d2ee4342ef3c4c8ceb5d26f3abc5cfed67e4c6902aff
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
v2.3.0.3 (2016-02-06)
|
5
|
+
---------------------
|
6
|
+
|
7
|
+
API modifications:
|
8
|
+
* lexer.rl: "a?=b": lex via tCHARACTER (closes #255). (whitequark)
|
9
|
+
|
4
10
|
v2.3.0.2 (2016-01-24)
|
5
11
|
---------------------
|
6
12
|
|
@@ -8,7 +14,7 @@ Bugs fixed:
|
|
8
14
|
* Add :csend to Parser::Meta::NODE_TYPES (Markus Schirp)
|
9
15
|
* lexer/dedenter: "\<\<x\n y\\n z\nx": don't dedent after escaped newline. (whitequark)
|
10
16
|
|
11
|
-
v2.3.0.
|
17
|
+
v2.3.0.3 (2016-01-16)
|
12
18
|
---------------------
|
13
19
|
|
14
20
|
v2.3.0.1 (2016-01-14)
|
data/doc/AST_FORMAT.md
CHANGED
data/lib/parser/lexer.rl
CHANGED
@@ -82,15 +82,12 @@ class Parser::Lexer
|
|
82
82
|
# %
|
83
83
|
|
84
84
|
ESCAPES = {
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
}
|
85
|
+
?a.ord => "\a", ?b.ord => "\b", ?e.ord => "\e", ?f.ord => "\f",
|
86
|
+
?n.ord => "\n", ?r.ord => "\r", ?s.ord => "\s", ?t.ord => "\t",
|
87
|
+
?v.ord => "\v", ?\\.ord => "\\"
|
88
|
+
}.freeze
|
89
89
|
|
90
|
-
BLANK_STRING = ''.freeze
|
91
|
-
ESCAPED_NEXT_LINE = "\\\n".freeze
|
92
90
|
REGEXP_META_CHARACTERS = Regexp.union(*"\\$()*+.<>?[]^{|}".chars).freeze
|
93
|
-
UNDERSCORE_STRING = '_'.freeze
|
94
91
|
|
95
92
|
RBRACE_OR_RBRACK = %w"} ]".freeze
|
96
93
|
|
@@ -192,9 +189,7 @@ class Parser::Lexer
|
|
192
189
|
@source = @source_buffer.source
|
193
190
|
@need_encode = false
|
194
191
|
|
195
|
-
if @has_encode
|
196
|
-
@encoding = @source.encoding
|
197
|
-
end
|
192
|
+
@encoding = @source.encoding if @has_encode
|
198
193
|
|
199
194
|
if @has_encode && @source.encoding == Encoding::UTF_8
|
200
195
|
@source_pts = @source.unpack('U*')
|
@@ -315,10 +310,10 @@ class Parser::Lexer
|
|
315
310
|
if @token_queue.any?
|
316
311
|
@token_queue.shift
|
317
312
|
elsif @cs == klass.lex_error
|
318
|
-
[ false, [ '$error', range(p - 1, p) ] ]
|
313
|
+
[ false, [ '$error'.freeze, range(p - 1, p) ] ]
|
319
314
|
else
|
320
315
|
eof = @source_pts.size + 1
|
321
|
-
[ false, [ '$eof', range(eof, eof) ] ]
|
316
|
+
[ false, [ '$eof'.freeze, range(eof, eof) ] ]
|
322
317
|
end
|
323
318
|
end
|
324
319
|
|
@@ -332,11 +327,6 @@ class Parser::Lexer
|
|
332
327
|
versions.include?(@version)
|
333
328
|
end
|
334
329
|
|
335
|
-
def stack_pop
|
336
|
-
@top -= 1
|
337
|
-
@stack[@top]
|
338
|
-
end
|
339
|
-
|
340
330
|
if "".respond_to?(:encode)
|
341
331
|
def encode_escape(ord)
|
342
332
|
ord.chr.force_encoding(@encoding)
|
@@ -379,11 +369,11 @@ class Parser::Lexer
|
|
379
369
|
|
380
370
|
def emit_do(do_block=false)
|
381
371
|
if @cond.active?
|
382
|
-
emit(:kDO_COND)
|
372
|
+
emit(:kDO_COND, 'do'.freeze)
|
383
373
|
elsif @cmdarg.active? || do_block
|
384
|
-
emit(:kDO_BLOCK)
|
374
|
+
emit(:kDO_BLOCK, 'do'.freeze)
|
385
375
|
else
|
386
|
-
emit(:kDO)
|
376
|
+
emit(:kDO, 'do'.freeze)
|
387
377
|
end
|
388
378
|
end
|
389
379
|
|
@@ -699,8 +689,8 @@ class Parser::Lexer
|
|
699
689
|
}
|
700
690
|
|
701
691
|
action unescape_char {
|
702
|
-
|
703
|
-
@escape = ESCAPES
|
692
|
+
codepoint = @source_pts[p - 1]
|
693
|
+
@escape = ESCAPES[codepoint] || encode_escape(codepoint)
|
704
694
|
}
|
705
695
|
|
706
696
|
action invalid_complex_escape {
|
@@ -847,7 +837,6 @@ class Parser::Lexer
|
|
847
837
|
|
848
838
|
action extend_string {
|
849
839
|
string = tok
|
850
|
-
string = string.encode(@encoding) if @need_encode
|
851
840
|
|
852
841
|
# tLABEL_END is only possible in non-cond context on >= 2.2
|
853
842
|
if @version >= 22 && !@cond.active?
|
@@ -899,7 +888,7 @@ class Parser::Lexer
|
|
899
888
|
if current_literal.regexp?
|
900
889
|
# Regular expressions should include escape sequences in their
|
901
890
|
# escaped form. On the other hand, escaped newlines are removed.
|
902
|
-
current_literal.extend_string(tok.gsub(
|
891
|
+
current_literal.extend_string(tok.gsub("\\\n".freeze, ''.freeze), @ts, @te)
|
903
892
|
else
|
904
893
|
current_literal.extend_string(@escape || tok, @ts, @te)
|
905
894
|
end
|
@@ -917,11 +906,11 @@ class Parser::Lexer
|
|
917
906
|
end
|
918
907
|
|
919
908
|
if current_literal.heredoc?
|
920
|
-
line = tok(@herebody_s, @ts).gsub(/\r+$/,
|
909
|
+
line = tok(@herebody_s, @ts).gsub(/\r+$/, ''.freeze)
|
921
910
|
|
922
911
|
if version?(18, 19, 20)
|
923
912
|
# See ruby:c48b4209c
|
924
|
-
line = line.gsub(/\r.*$/,
|
913
|
+
line = line.gsub(/\r.*$/, ''.freeze)
|
925
914
|
end
|
926
915
|
|
927
916
|
# Try ending the heredoc with the complete most recently
|
@@ -1023,9 +1012,9 @@ class Parser::Lexer
|
|
1023
1012
|
if current_literal
|
1024
1013
|
if current_literal.end_interp_brace_and_try_closing
|
1025
1014
|
if version?(18, 19)
|
1026
|
-
emit(:tRCURLY, '}', p - 1, p)
|
1015
|
+
emit(:tRCURLY, '}'.freeze, p - 1, p)
|
1027
1016
|
else
|
1028
|
-
emit(:tSTRING_DEND, '}', p - 1, p)
|
1017
|
+
emit(:tSTRING_DEND, '}'.freeze, p - 1, p)
|
1029
1018
|
end
|
1030
1019
|
|
1031
1020
|
if current_literal.saved_herebody_s
|
@@ -1033,7 +1022,7 @@ class Parser::Lexer
|
|
1033
1022
|
end
|
1034
1023
|
|
1035
1024
|
fhold;
|
1036
|
-
|
1025
|
+
fret;
|
1037
1026
|
fbreak;
|
1038
1027
|
end
|
1039
1028
|
end
|
@@ -1044,7 +1033,7 @@ class Parser::Lexer
|
|
1044
1033
|
current_literal.flush_string
|
1045
1034
|
current_literal.extend_content
|
1046
1035
|
|
1047
|
-
emit(:tSTRING_DBEG, '#{')
|
1036
|
+
emit(:tSTRING_DBEG, '#{'.freeze)
|
1048
1037
|
|
1049
1038
|
if current_literal.heredoc?
|
1050
1039
|
current_literal.saved_herebody_s = @herebody_s
|
@@ -1183,28 +1172,28 @@ class Parser::Lexer
|
|
1183
1172
|
# The default longest-match scanning does not work here due
|
1184
1173
|
# to sheer ambiguity.
|
1185
1174
|
|
1186
|
-
ambiguous_fid_suffix =
|
1187
|
-
[?!]
|
1188
|
-
'
|
1175
|
+
ambiguous_fid_suffix = # actual parsed
|
1176
|
+
[?!] %{ tm = p } | # a? a?
|
1177
|
+
[?!]'=' %{ tm = p - 2 } # a!=b a != b
|
1189
1178
|
;
|
1190
1179
|
|
1191
|
-
ambiguous_ident_suffix =
|
1192
|
-
ambiguous_fid_suffix
|
1193
|
-
'='
|
1194
|
-
'=='
|
1195
|
-
'=~'
|
1196
|
-
'=>'
|
1197
|
-
'==='
|
1180
|
+
ambiguous_ident_suffix = # actual parsed
|
1181
|
+
ambiguous_fid_suffix |
|
1182
|
+
'=' %{ tm = p } | # a= a=
|
1183
|
+
'==' %{ tm = p - 2 } | # a==b a == b
|
1184
|
+
'=~' %{ tm = p - 2 } | # a=~b a =~ b
|
1185
|
+
'=>' %{ tm = p - 2 } | # a=>b a => b
|
1186
|
+
'===' %{ tm = p - 3 } # a===b a === b
|
1198
1187
|
;
|
1199
1188
|
|
1200
|
-
ambiguous_symbol_suffix =
|
1189
|
+
ambiguous_symbol_suffix = # actual parsed
|
1201
1190
|
ambiguous_ident_suffix |
|
1202
|
-
'==>'
|
1191
|
+
'==>' %{ tm = p - 2 } # :a==>b :a= => b
|
1203
1192
|
;
|
1204
1193
|
|
1205
1194
|
# Ambiguous with 1.9 hash labels.
|
1206
|
-
ambiguous_const_suffix =
|
1207
|
-
'::'
|
1195
|
+
ambiguous_const_suffix = # actual parsed
|
1196
|
+
'::' %{ tm = p - 2 } # A::B A :: B
|
1208
1197
|
;
|
1209
1198
|
|
1210
1199
|
# Resolving kDO/kDO_COND/kDO_BLOCK ambiguity requires embedding
|
@@ -1252,7 +1241,7 @@ class Parser::Lexer
|
|
1252
1241
|
emit(:tGVAR)
|
1253
1242
|
end
|
1254
1243
|
|
1255
|
-
|
1244
|
+
fret; fbreak;
|
1256
1245
|
};
|
1257
1246
|
|
1258
1247
|
class_var_v
|
@@ -1262,7 +1251,7 @@ class Parser::Lexer
|
|
1262
1251
|
end
|
1263
1252
|
|
1264
1253
|
emit(:tCVAR)
|
1265
|
-
|
1254
|
+
fret; fbreak;
|
1266
1255
|
};
|
1267
1256
|
|
1268
1257
|
instance_var_v
|
@@ -1272,7 +1261,7 @@ class Parser::Lexer
|
|
1272
1261
|
end
|
1273
1262
|
|
1274
1263
|
emit(:tIVAR)
|
1275
|
-
|
1264
|
+
fret; fbreak;
|
1276
1265
|
};
|
1277
1266
|
*|;
|
1278
1267
|
|
@@ -1388,10 +1377,10 @@ class Parser::Lexer
|
|
1388
1377
|
w_space+ e_lparen
|
1389
1378
|
=> {
|
1390
1379
|
if version?(18)
|
1391
|
-
emit(:tLPAREN2, '(', @te - 1, @te)
|
1380
|
+
emit(:tLPAREN2, '('.freeze, @te - 1, @te)
|
1392
1381
|
fnext expr_value; fbreak;
|
1393
1382
|
else
|
1394
|
-
emit(:tLPAREN_ARG, '(', @te - 1, @te)
|
1383
|
+
emit(:tLPAREN_ARG, '('.freeze, @te - 1, @te)
|
1395
1384
|
fnext expr_beg; fbreak;
|
1396
1385
|
end
|
1397
1386
|
};
|
@@ -1399,13 +1388,13 @@ class Parser::Lexer
|
|
1399
1388
|
# meth(1 + 2)
|
1400
1389
|
# Regular method call.
|
1401
1390
|
e_lparen
|
1402
|
-
=> { emit(:tLPAREN2)
|
1391
|
+
=> { emit(:tLPAREN2, '('.freeze)
|
1403
1392
|
fnext expr_beg; fbreak; };
|
1404
1393
|
|
1405
1394
|
# meth [...]
|
1406
1395
|
# Array argument. Compare with indexing `meth[...]`.
|
1407
1396
|
w_space+ e_lbrack
|
1408
|
-
=> { emit(:tLBRACK, '[', @te - 1, @te)
|
1397
|
+
=> { emit(:tLBRACK, '['.freeze, @te - 1, @te)
|
1409
1398
|
fnext expr_beg; fbreak; };
|
1410
1399
|
|
1411
1400
|
# cmd {}
|
@@ -1416,7 +1405,7 @@ class Parser::Lexer
|
|
1416
1405
|
p = @ts - 1
|
1417
1406
|
fgoto expr_end;
|
1418
1407
|
else
|
1419
|
-
emit(:tLCURLY, '{', @te - 1, @te)
|
1408
|
+
emit(:tLCURLY, '{'.freeze, @te - 1, @te)
|
1420
1409
|
fnext expr_value; fbreak;
|
1421
1410
|
end
|
1422
1411
|
};
|
@@ -1447,7 +1436,7 @@ class Parser::Lexer
|
|
1447
1436
|
| '<<'
|
1448
1437
|
)
|
1449
1438
|
=> {
|
1450
|
-
if tok(tm, tm + 1) == '/'
|
1439
|
+
if tok(tm, tm + 1) == '/'.freeze
|
1451
1440
|
# Ambiguous regexp literal.
|
1452
1441
|
diagnostic :warning, :ambiguous_literal, nil, range(tm, tm + 1)
|
1453
1442
|
end
|
@@ -1524,7 +1513,7 @@ class Parser::Lexer
|
|
1524
1513
|
expr_cmdarg := |*
|
1525
1514
|
w_space+ e_lparen
|
1526
1515
|
=> {
|
1527
|
-
emit(:tLPAREN_ARG, '(', @te - 1, @te)
|
1516
|
+
emit(:tLPAREN_ARG, '('.freeze, @te - 1, @te)
|
1528
1517
|
if version?(18)
|
1529
1518
|
fnext expr_value; fbreak;
|
1530
1519
|
else
|
@@ -1535,9 +1524,9 @@ class Parser::Lexer
|
|
1535
1524
|
w_space* 'do'
|
1536
1525
|
=> {
|
1537
1526
|
if @cond.active?
|
1538
|
-
emit(:kDO_COND, 'do', @te - 2, @te)
|
1527
|
+
emit(:kDO_COND, 'do'.freeze, @te - 2, @te)
|
1539
1528
|
else
|
1540
|
-
emit(:kDO, 'do', @te - 2, @te)
|
1529
|
+
emit(:kDO, 'do'.freeze, @te - 2, @te)
|
1541
1530
|
end
|
1542
1531
|
fnext expr_value; fbreak;
|
1543
1532
|
};
|
@@ -1569,7 +1558,7 @@ class Parser::Lexer
|
|
1569
1558
|
# `do` (as `kDO_BLOCK` in `expr_beg`).
|
1570
1559
|
expr_endarg := |*
|
1571
1560
|
e_lbrace
|
1572
|
-
=> { emit(:tLBRACE_ARG)
|
1561
|
+
=> { emit(:tLBRACE_ARG, '{'.freeze)
|
1573
1562
|
fnext expr_value; };
|
1574
1563
|
|
1575
1564
|
'do'
|
@@ -1622,15 +1611,15 @@ class Parser::Lexer
|
|
1622
1611
|
[+\-][0-9]
|
1623
1612
|
=> {
|
1624
1613
|
fhold;
|
1625
|
-
if tok.start_with? '-'
|
1626
|
-
emit(:tUMINUS_NUM, '-', @ts, @ts + 1)
|
1614
|
+
if tok.start_with? '-'.freeze
|
1615
|
+
emit(:tUMINUS_NUM, '-'.freeze, @ts, @ts + 1)
|
1627
1616
|
fnext expr_end; fbreak;
|
1628
1617
|
end
|
1629
1618
|
};
|
1630
1619
|
|
1631
1620
|
# splat *a
|
1632
1621
|
'*'
|
1633
|
-
=> { emit(:tSTAR)
|
1622
|
+
=> { emit(:tSTAR, '*'.freeze)
|
1634
1623
|
fbreak; };
|
1635
1624
|
|
1636
1625
|
#
|
@@ -1641,7 +1630,7 @@ class Parser::Lexer
|
|
1641
1630
|
# /=/ (disambiguation with /=)
|
1642
1631
|
'/' c_any
|
1643
1632
|
=> {
|
1644
|
-
type = delimiter =
|
1633
|
+
type = delimiter = tok[0].chr
|
1645
1634
|
fhold; fgoto *push_literal(type, delimiter, @ts);
|
1646
1635
|
};
|
1647
1636
|
|
@@ -1655,7 +1644,7 @@ class Parser::Lexer
|
|
1655
1644
|
# %w(we are the people)
|
1656
1645
|
'%' [A-Za-z]+ c_any
|
1657
1646
|
=> {
|
1658
|
-
type, delimiter =
|
1647
|
+
type, delimiter = tok[0..-2], tok[-1].chr
|
1659
1648
|
fgoto *push_literal(type, delimiter, @ts);
|
1660
1649
|
};
|
1661
1650
|
|
@@ -1672,27 +1661,24 @@ class Parser::Lexer
|
|
1672
1661
|
( '"' ( c_line - '"' )* '"'
|
1673
1662
|
| "'" ( c_line - "'" )* "'"
|
1674
1663
|
| "`" ( c_line - "`" )* "`"
|
1675
|
-
| bareword ) % { heredoc_e
|
1664
|
+
| bareword ) % { heredoc_e = p }
|
1676
1665
|
c_line* c_nl % { new_herebody_s = p }
|
1677
1666
|
=> {
|
1678
1667
|
tok(@ts, heredoc_e) =~ /^<<(-?)(~?)(["'`]?)(.*)\3$/
|
1679
1668
|
|
1680
1669
|
indent = !$1.empty? || !$2.empty?
|
1681
1670
|
dedent_body = !$2.empty?
|
1682
|
-
type =
|
1671
|
+
type = $3.empty? ? '<<"'.freeze : ('<<'.freeze + $3)
|
1683
1672
|
delimiter = $4
|
1684
1673
|
|
1685
1674
|
if dedent_body && version?(18, 19, 20, 21, 22)
|
1686
|
-
emit(:tLSHFT, '<<', @ts, @ts + 2)
|
1675
|
+
emit(:tLSHFT, '<<'.freeze, @ts, @ts + 2)
|
1687
1676
|
p = @ts + 1
|
1688
1677
|
fnext expr_beg; fbreak;
|
1689
1678
|
else
|
1690
1679
|
fnext *push_literal(type, delimiter, @ts, heredoc_e, indent, dedent_body);
|
1691
1680
|
|
1692
|
-
|
1693
|
-
@herebody_s = new_herebody_s
|
1694
|
-
end
|
1695
|
-
|
1681
|
+
@herebody_s ||= new_herebody_s
|
1696
1682
|
p = @herebody_s - 1
|
1697
1683
|
end
|
1698
1684
|
};
|
@@ -1704,7 +1690,7 @@ class Parser::Lexer
|
|
1704
1690
|
# :"bar", :'baz'
|
1705
1691
|
':' ['"] # '
|
1706
1692
|
=> {
|
1707
|
-
type, delimiter = tok,
|
1693
|
+
type, delimiter = tok, tok[-1].chr
|
1708
1694
|
fgoto *push_literal(type, delimiter, @ts);
|
1709
1695
|
};
|
1710
1696
|
|
@@ -1774,21 +1760,21 @@ class Parser::Lexer
|
|
1774
1760
|
=> {
|
1775
1761
|
if @lambda_stack.last == @paren_nest
|
1776
1762
|
@lambda_stack.pop
|
1777
|
-
emit(:tLAMBEG)
|
1763
|
+
emit(:tLAMBEG, '{'.freeze)
|
1778
1764
|
else
|
1779
|
-
emit(:tLBRACE)
|
1765
|
+
emit(:tLBRACE, '{'.freeze)
|
1780
1766
|
end
|
1781
1767
|
fbreak;
|
1782
1768
|
};
|
1783
1769
|
|
1784
1770
|
# a([1, 2])
|
1785
1771
|
e_lbrack
|
1786
|
-
=> { emit(:tLBRACK)
|
1772
|
+
=> { emit(:tLBRACK, '['.freeze)
|
1787
1773
|
fbreak; };
|
1788
1774
|
|
1789
1775
|
# a()
|
1790
1776
|
e_lparen
|
1791
|
-
=> { emit(:tLPAREN)
|
1777
|
+
=> { emit(:tLPAREN, '('.freeze)
|
1792
1778
|
fbreak; };
|
1793
1779
|
|
1794
1780
|
# a(+b)
|
@@ -1799,7 +1785,7 @@ class Parser::Lexer
|
|
1799
1785
|
# rescue Exception => e: Block rescue.
|
1800
1786
|
# Special because it should transition to expr_mid.
|
1801
1787
|
'rescue' %{ tm = p } '=>'?
|
1802
|
-
=> { emit(:kRESCUE,
|
1788
|
+
=> { emit(:kRESCUE, 'rescue'.freeze, @ts, tm)
|
1803
1789
|
p = tm - 1
|
1804
1790
|
fnext expr_mid; fbreak; };
|
1805
1791
|
|
@@ -1929,7 +1915,7 @@ class Parser::Lexer
|
|
1929
1915
|
|
1930
1916
|
'->'
|
1931
1917
|
=> {
|
1932
|
-
emit(:tLAMBDA,
|
1918
|
+
emit(:tLAMBDA, '->'.freeze, @ts, @ts + 2)
|
1933
1919
|
|
1934
1920
|
@lambda_stack.push @paren_nest
|
1935
1921
|
fnext expr_endfn; fbreak;
|
@@ -1940,14 +1926,14 @@ class Parser::Lexer
|
|
1940
1926
|
if @lambda_stack.last == @paren_nest
|
1941
1927
|
@lambda_stack.pop
|
1942
1928
|
|
1943
|
-
if tok == '{'
|
1944
|
-
emit(:tLAMBEG)
|
1929
|
+
if tok == '{'.freeze
|
1930
|
+
emit(:tLAMBEG, '{'.freeze)
|
1945
1931
|
else # 'do'
|
1946
|
-
emit(:kDO_LAMBDA)
|
1932
|
+
emit(:kDO_LAMBDA, 'do'.freeze)
|
1947
1933
|
end
|
1948
1934
|
else
|
1949
|
-
if tok == '{'
|
1950
|
-
emit(:tLCURLY)
|
1935
|
+
if tok == '{'.freeze
|
1936
|
+
emit(:tLCURLY, '{'.freeze)
|
1951
1937
|
else # 'do'
|
1952
1938
|
emit_do
|
1953
1939
|
end
|
@@ -1965,8 +1951,8 @@ class Parser::Lexer
|
|
1965
1951
|
fnext expr_fname; fbreak; };
|
1966
1952
|
|
1967
1953
|
'class' w_any* '<<'
|
1968
|
-
=> { emit(:kCLASS, 'class', @ts, @ts + 5)
|
1969
|
-
emit(:tLSHFT, '<<', @te - 2, @te)
|
1954
|
+
=> { emit(:kCLASS, 'class'.freeze, @ts, @ts + 5)
|
1955
|
+
emit(:tLSHFT, '<<'.freeze, @te - 2, @te)
|
1970
1956
|
fnext expr_value; fbreak; };
|
1971
1957
|
|
1972
1958
|
# a if b:c: Syntax error.
|
@@ -1987,7 +1973,7 @@ class Parser::Lexer
|
|
1987
1973
|
=> {
|
1988
1974
|
emit_table(KEYWORDS)
|
1989
1975
|
|
1990
|
-
if version?(18) && tok == 'not'
|
1976
|
+
if version?(18) && tok == 'not'.freeze
|
1991
1977
|
fnext expr_beg; fbreak;
|
1992
1978
|
else
|
1993
1979
|
fnext expr_arg; fbreak;
|
@@ -2003,7 +1989,7 @@ class Parser::Lexer
|
|
2003
1989
|
fnext *arg_or_cmdarg;
|
2004
1990
|
end
|
2005
1991
|
else
|
2006
|
-
emit(:k__ENCODING__)
|
1992
|
+
emit(:k__ENCODING__, '__ENCODING__'.freeze)
|
2007
1993
|
end
|
2008
1994
|
fbreak;
|
2009
1995
|
};
|
@@ -2026,12 +2012,12 @@ class Parser::Lexer
|
|
2026
2012
|
=> {
|
2027
2013
|
digits = tok(@num_digits_s, @num_suffix_s)
|
2028
2014
|
|
2029
|
-
if digits.end_with?
|
2030
|
-
diagnostic :error, :trailing_in_number, { :character =>
|
2015
|
+
if digits.end_with? '_'.freeze
|
2016
|
+
diagnostic :error, :trailing_in_number, { :character => '_'.freeze },
|
2031
2017
|
range(@te - 1, @te)
|
2032
2018
|
elsif digits.empty? && @num_base == 8 && version?(18)
|
2033
2019
|
# 1.8 did not raise an error on 0o.
|
2034
|
-
digits =
|
2020
|
+
digits = '0'.freeze
|
2035
2021
|
elsif digits.empty?
|
2036
2022
|
diagnostic :error, :empty_numeric
|
2037
2023
|
elsif @num_base == 8 && (invalid_idx = digits.index(/[89]/))
|
@@ -2041,7 +2027,7 @@ class Parser::Lexer
|
|
2041
2027
|
end
|
2042
2028
|
|
2043
2029
|
if version?(18, 19, 20)
|
2044
|
-
emit(:tINTEGER, digits.to_i(@num_base))
|
2030
|
+
emit(:tINTEGER, digits.to_i(@num_base), @ts, @num_suffix_s)
|
2045
2031
|
p = @num_suffix_s - 1
|
2046
2032
|
else
|
2047
2033
|
@num_xfrm.call(digits.to_i(@num_base))
|
@@ -2061,7 +2047,7 @@ class Parser::Lexer
|
|
2061
2047
|
:trailing_in_number, { :character => tok(@te - 1, @te) },
|
2062
2048
|
range(@te - 1, @te)
|
2063
2049
|
else
|
2064
|
-
emit(:tINTEGER, tok(@ts, @te - 1).to_i)
|
2050
|
+
emit(:tINTEGER, tok(@ts, @te - 1).to_i, @ts, @te - 1)
|
2065
2051
|
fhold; fbreak;
|
2066
2052
|
end
|
2067
2053
|
};
|
@@ -2073,7 +2059,7 @@ class Parser::Lexer
|
|
2073
2059
|
:trailing_in_number, { :character => tok(@te - 1, @te) },
|
2074
2060
|
range(@te - 1, @te)
|
2075
2061
|
else
|
2076
|
-
emit(:tFLOAT, tok(@ts, @te - 1).to_f)
|
2062
|
+
emit(:tFLOAT, tok(@ts, @te - 1).to_f, @ts, @te - 1)
|
2077
2063
|
fhold; fbreak;
|
2078
2064
|
end
|
2079
2065
|
};
|
@@ -2086,7 +2072,7 @@ class Parser::Lexer
|
|
2086
2072
|
digits = tok(@ts, @num_suffix_s)
|
2087
2073
|
|
2088
2074
|
if version?(18, 19, 20)
|
2089
|
-
emit(:tFLOAT, Float(digits))
|
2075
|
+
emit(:tFLOAT, Float(digits), @ts, @num_suffix_s)
|
2090
2076
|
p = @num_suffix_s - 1
|
2091
2077
|
else
|
2092
2078
|
@num_xfrm.call(digits)
|
@@ -2101,7 +2087,7 @@ class Parser::Lexer
|
|
2101
2087
|
# `echo foo`, "bar", 'baz'
|
2102
2088
|
'`' | ['"] # '
|
2103
2089
|
=> {
|
2104
|
-
type, delimiter = tok,
|
2090
|
+
type, delimiter = tok, tok[-1].chr
|
2105
2091
|
fgoto *push_literal(type, delimiter, @ts, nil, false, false, true);
|
2106
2092
|
};
|
2107
2093
|
|
@@ -2174,11 +2160,11 @@ class Parser::Lexer
|
|
2174
2160
|
fnext expr_beg; fbreak; };
|
2175
2161
|
|
2176
2162
|
'?'
|
2177
|
-
=> { emit(:tEH)
|
2163
|
+
=> { emit(:tEH, '?'.freeze)
|
2178
2164
|
fnext expr_value; fbreak; };
|
2179
2165
|
|
2180
2166
|
e_lbrack
|
2181
|
-
=> { emit(:tLBRACK2)
|
2167
|
+
=> { emit(:tLBRACK2, '['.freeze)
|
2182
2168
|
fnext expr_beg; fbreak; };
|
2183
2169
|
|
2184
2170
|
punctuation_end
|
@@ -2195,7 +2181,7 @@ class Parser::Lexer
|
|
2195
2181
|
=> { fgoto leading_dot; };
|
2196
2182
|
|
2197
2183
|
';'
|
2198
|
-
=> { emit(:tSEMI)
|
2184
|
+
=> { emit(:tSEMI, ';'.freeze)
|
2199
2185
|
fnext expr_value; fbreak; };
|
2200
2186
|
|
2201
2187
|
'\\' c_line {
|