ruby_parser 3.8.4 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +29 -0
- data/Manifest.txt +5 -0
- data/README.rdoc +12 -0
- data/Rakefile +128 -69
- data/compare/normalize.rb +146 -0
- data/lib/rp_extensions.rb +77 -0
- data/lib/rp_stringscanner.rb +64 -0
- data/lib/ruby18_parser.rb +2180 -2175
- data/lib/ruby18_parser.y +17 -13
- data/lib/ruby19_parser.rb +2250 -2241
- data/lib/ruby19_parser.y +18 -14
- data/lib/ruby20_parser.rb +2498 -2503
- data/lib/ruby20_parser.y +18 -29
- data/lib/ruby21_parser.rb +2287 -2275
- data/lib/ruby21_parser.y +18 -24
- data/lib/ruby22_parser.rb +2573 -2560
- data/lib/ruby22_parser.y +18 -24
- data/lib/ruby23_parser.rb +2498 -2494
- data/lib/ruby23_parser.y +18 -24
- data/lib/ruby24_parser.rb +6797 -0
- data/lib/ruby24_parser.y +2367 -0
- data/lib/ruby_lexer.rb +11 -16
- data/lib/ruby_parser.rb +86 -7
- data/lib/ruby_parser.yy +57 -53
- data/lib/ruby_parser_extras.rb +34 -237
- data/test/test_ruby_lexer.rb +54 -41
- data/test/test_ruby_parser.rb +776 -700
- data/test/test_ruby_parser_extras.rb +4 -6
- metadata +7 -2
- metadata.gz.sig +0 -0
data/lib/ruby_lexer.rb
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
class RubyLexer
|
4
4
|
|
5
5
|
# :stopdoc:
|
6
|
-
|
6
|
+
HAS_ENC = "".respond_to? :encoding
|
7
7
|
|
8
|
-
IDENT_CHAR = if
|
8
|
+
IDENT_CHAR = if HAS_ENC then
|
9
9
|
/[\w\u0080-\u{10ffff}]/u
|
10
10
|
else
|
11
11
|
/[\w\x80-\xFF]/n
|
@@ -285,7 +285,7 @@ class RubyLexer
|
|
285
285
|
end
|
286
286
|
|
287
287
|
def ruby22_label?
|
288
|
-
|
288
|
+
ruby22plus? and is_label_possible?
|
289
289
|
end
|
290
290
|
|
291
291
|
def is_label_possible?
|
@@ -481,7 +481,7 @@ class RubyLexer
|
|
481
481
|
return if in_lex_state?(:expr_beg, :expr_value, :expr_class,
|
482
482
|
:expr_fname, :expr_dot, :expr_labelarg)
|
483
483
|
|
484
|
-
if scan(/([\ \t\r\f\v]*)
|
484
|
+
if scan(/([\ \t\r\f\v]*)(\.|&)/) then
|
485
485
|
self.space_seen = true unless ss[1].empty?
|
486
486
|
|
487
487
|
ss.pos -= 1
|
@@ -778,7 +778,7 @@ class RubyLexer
|
|
778
778
|
when lpar_beg && lpar_beg == paren_nest then
|
779
779
|
self.lpar_beg = nil
|
780
780
|
self.paren_nest -= 1
|
781
|
-
|
781
|
+
expr_result(:kDO_LAMBDA, value)
|
782
782
|
when cond.is_in_state then
|
783
783
|
result(state, :kDO_COND, value)
|
784
784
|
when cmdarg.is_in_state && lex_state != :expr_cmdarg then
|
@@ -909,11 +909,7 @@ class RubyLexer
|
|
909
909
|
end
|
910
910
|
|
911
911
|
def ruby18
|
912
|
-
|
913
|
-
end
|
914
|
-
|
915
|
-
def ruby19
|
916
|
-
Ruby19Parser === parser
|
912
|
+
RubyParser::V18 === parser
|
917
913
|
end
|
918
914
|
|
919
915
|
def scan re
|
@@ -1047,7 +1043,7 @@ class RubyLexer
|
|
1047
1043
|
t = Regexp.escape term
|
1048
1044
|
x = Regexp.escape(paren) if paren && paren != "\000"
|
1049
1045
|
re = if qwords then
|
1050
|
-
if
|
1046
|
+
if HAS_ENC then
|
1051
1047
|
/[^#{t}#{x}\#\0\\\s]+|./ # |. to pick up whatever
|
1052
1048
|
else
|
1053
1049
|
/[^#{t}#{x}\#\0\\\s\v]+|./ # argh. 1.8's \s doesn't pick up \v
|
@@ -1098,7 +1094,7 @@ class RubyLexer
|
|
1098
1094
|
else
|
1099
1095
|
s
|
1100
1096
|
end
|
1101
|
-
x.force_encoding "UTF-8" if
|
1097
|
+
x.force_encoding "UTF-8" if HAS_ENC
|
1102
1098
|
x
|
1103
1099
|
end
|
1104
1100
|
|
@@ -1106,9 +1102,8 @@ class RubyLexer
|
|
1106
1102
|
# do nothing for now
|
1107
1103
|
end
|
1108
1104
|
|
1109
|
-
def
|
1110
|
-
|
1111
|
-
Ruby23Parser === parser
|
1105
|
+
def ruby22plus?
|
1106
|
+
parser.class.version >= 22
|
1112
1107
|
end
|
1113
1108
|
|
1114
1109
|
def process_string # TODO: rewrite / remove
|
@@ -1120,7 +1115,7 @@ class RubyLexer
|
|
1120
1115
|
|
1121
1116
|
token_type, c = token
|
1122
1117
|
|
1123
|
-
if
|
1118
|
+
if ruby22plus? && token_type == :tSTRING_END && ["'", '"'].include?(c) then
|
1124
1119
|
if (([:expr_beg, :expr_endfn].include?(lex_state) &&
|
1125
1120
|
!cond.is_in_state) || is_arg?) &&
|
1126
1121
|
is_label_suffix? then
|
data/lib/ruby_parser.rb
CHANGED
@@ -1,7 +1,86 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
require "ruby_parser_extras"
|
2
|
+
require "racc/parser"
|
3
|
+
|
4
|
+
##
|
5
|
+
# RubyParser is a compound parser that uses all known versions to
|
6
|
+
# attempt to parse.
|
7
|
+
|
8
|
+
class RubyParser
|
9
|
+
|
10
|
+
VERSIONS = []
|
11
|
+
|
12
|
+
class Parser < Racc::Parser
|
13
|
+
include RubyParserStuff
|
14
|
+
|
15
|
+
def self.inherited x
|
16
|
+
RubyParser::VERSIONS << x
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.version
|
20
|
+
Parser > self and self.name[/V(\d+)$/, 1].to_i
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class SyntaxError < RuntimeError; end
|
25
|
+
|
26
|
+
def process s, f = "(string)", t = 10
|
27
|
+
e = nil
|
28
|
+
VERSIONS.each do |klass|
|
29
|
+
parser = klass.new
|
30
|
+
begin
|
31
|
+
return parser.process s, f, t
|
32
|
+
rescue Racc::ParseError, RubyParser::SyntaxError => exc
|
33
|
+
e = exc
|
34
|
+
end
|
35
|
+
end
|
36
|
+
raise e
|
37
|
+
end
|
38
|
+
|
39
|
+
alias :parse :process
|
40
|
+
|
41
|
+
def reset
|
42
|
+
# do nothing
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.latest
|
46
|
+
VERSIONS.first.new
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.for_current_ruby
|
50
|
+
name = "V#{RUBY_VERSION[/^\d+\.\d+/].delete "."}"
|
51
|
+
klass = if const_defined? name then
|
52
|
+
const_get name
|
53
|
+
else
|
54
|
+
latest = VERSIONS.first
|
55
|
+
warn "NOTE: RubyParser::#{name} undefined, using #{latest}."
|
56
|
+
latest
|
57
|
+
end
|
58
|
+
|
59
|
+
klass.new
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# Unfortunately a problem with racc is that it won't let me namespace
|
65
|
+
# properly, so instead of RubyParser::V18, I still have to generate
|
66
|
+
# the old Ruby23Parser and shove it in as V23.
|
67
|
+
|
68
|
+
require "ruby18_parser"
|
69
|
+
require "ruby19_parser"
|
70
|
+
require "ruby20_parser"
|
71
|
+
require "ruby21_parser"
|
72
|
+
require "ruby22_parser"
|
73
|
+
require "ruby23_parser"
|
74
|
+
require "ruby24_parser"
|
75
|
+
|
76
|
+
class RubyParser # HACK
|
77
|
+
VERSIONS.clear # also a HACK caused by racc namespace issues
|
78
|
+
|
79
|
+
class V24 < ::Ruby24Parser; end
|
80
|
+
class V23 < ::Ruby23Parser; end
|
81
|
+
class V22 < ::Ruby22Parser; end
|
82
|
+
class V21 < ::Ruby21Parser; end
|
83
|
+
class V20 < ::Ruby20Parser; end
|
84
|
+
class V19 < ::Ruby19Parser; end
|
85
|
+
class V18 < ::Ruby18Parser; end
|
86
|
+
end
|
data/lib/ruby_parser.yy
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
# -*- racc -*-
|
2
2
|
|
3
|
-
#if
|
3
|
+
#if V==20
|
4
4
|
class Ruby20Parser
|
5
|
-
#elif
|
5
|
+
#elif V==21
|
6
6
|
class Ruby21Parser
|
7
|
-
#elif
|
7
|
+
#elif V == 22
|
8
8
|
class Ruby22Parser
|
9
|
-
#elif
|
9
|
+
#elif V == 23
|
10
10
|
class Ruby23Parser
|
11
|
+
#elif V == 24
|
12
|
+
class Ruby24Parser
|
13
|
+
#else
|
14
|
+
fail "version not specified or supported on code generation"
|
11
15
|
#endif
|
12
16
|
|
13
17
|
token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
@@ -27,13 +31,13 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
27
31
|
tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
|
28
32
|
tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
|
29
33
|
tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND tUBANG
|
30
|
-
#if
|
34
|
+
#if V >= 21
|
31
35
|
tRATIONAL tIMAGINARY
|
32
36
|
#endif
|
33
|
-
#if
|
37
|
+
#if V >= 22
|
34
38
|
tLABEL_END
|
35
39
|
#endif
|
36
|
-
#if
|
40
|
+
#if V >= 23
|
37
41
|
tLONELY
|
38
42
|
#endif
|
39
43
|
|
@@ -227,15 +231,15 @@ rule
|
|
227
231
|
}
|
228
232
|
| lhs tEQL mrhs
|
229
233
|
{
|
230
|
-
result =
|
234
|
+
result = new_assign val[0], s(:svalue, val[2])
|
231
235
|
}
|
232
|
-
#if
|
236
|
+
#if V == 20
|
233
237
|
| mlhs tEQL arg_value
|
234
238
|
{
|
235
239
|
result = new_masgn val[0], val[2], :wrap
|
236
240
|
}
|
237
241
|
| mlhs tEQL mrhs
|
238
|
-
#
|
242
|
+
#else
|
239
243
|
| mlhs tEQL mrhs_arg
|
240
244
|
#endif
|
241
245
|
{
|
@@ -245,21 +249,21 @@ rule
|
|
245
249
|
|
246
250
|
command_asgn: lhs tEQL command_call
|
247
251
|
{
|
248
|
-
result =
|
252
|
+
result = new_assign val[0], val[2]
|
249
253
|
}
|
250
254
|
| lhs tEQL command_asgn
|
251
255
|
{
|
252
|
-
result =
|
256
|
+
result = new_assign val[0], val[2]
|
253
257
|
}
|
254
258
|
|
255
259
|
expr: command_call
|
256
260
|
| expr kAND expr
|
257
261
|
{
|
258
|
-
result =
|
262
|
+
result = logical_op :and, val[0], val[2]
|
259
263
|
}
|
260
264
|
| expr kOR expr
|
261
265
|
{
|
262
|
-
result =
|
266
|
+
result = logical_op :or, val[0], val[2]
|
263
267
|
}
|
264
268
|
| kNOT opt_nl expr
|
265
269
|
{
|
@@ -612,7 +616,7 @@ rule
|
|
612
616
|
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
|
613
617
|
| tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
|
614
618
|
| tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
|
615
|
-
#if
|
619
|
+
#if V == 20
|
616
620
|
| tUBANG
|
617
621
|
#endif
|
618
622
|
|
@@ -628,11 +632,11 @@ rule
|
|
628
632
|
|
629
633
|
arg: lhs tEQL arg
|
630
634
|
{
|
631
|
-
result =
|
635
|
+
result = new_assign val[0], val[2]
|
632
636
|
}
|
633
637
|
| lhs tEQL arg kRESCUE_MOD arg
|
634
638
|
{
|
635
|
-
result =
|
639
|
+
result = new_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
|
636
640
|
}
|
637
641
|
| var_lhs tOP_ASGN arg
|
638
642
|
{
|
@@ -714,18 +718,18 @@ rule
|
|
714
718
|
{
|
715
719
|
result = new_call val[0], :**, argl(val[2])
|
716
720
|
}
|
717
|
-
#if
|
721
|
+
#if V == 20
|
718
722
|
| tUMINUS_NUM tINTEGER tPOW arg
|
719
723
|
{
|
720
724
|
result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
|
721
725
|
}
|
722
726
|
| tUMINUS_NUM tFLOAT tPOW arg
|
723
|
-
#
|
727
|
+
#else
|
724
728
|
| tUMINUS_NUM simple_numeric tPOW arg
|
725
729
|
#endif
|
726
730
|
{
|
727
731
|
result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
|
728
|
-
#if
|
732
|
+
#if V == 20
|
729
733
|
## TODO: why is this 2.0 only?
|
730
734
|
debug20 12, val, result
|
731
735
|
#endif
|
@@ -784,11 +788,11 @@ rule
|
|
784
788
|
}
|
785
789
|
| arg tMATCH arg
|
786
790
|
{
|
787
|
-
result =
|
791
|
+
result = new_match val[0], val[2]
|
788
792
|
}
|
789
793
|
| arg tNMATCH arg
|
790
794
|
{
|
791
|
-
result = s(:not,
|
795
|
+
result = s(:not, new_match(val[0], val[2]))
|
792
796
|
}
|
793
797
|
| tBANG arg
|
794
798
|
{
|
@@ -812,11 +816,11 @@ rule
|
|
812
816
|
}
|
813
817
|
| arg tANDOP arg
|
814
818
|
{
|
815
|
-
result =
|
819
|
+
result = logical_op :and, val[0], val[2]
|
816
820
|
}
|
817
821
|
| arg tOROP arg
|
818
822
|
{
|
819
|
-
result =
|
823
|
+
result = logical_op :or, val[0], val[2]
|
820
824
|
}
|
821
825
|
| kDEFINED opt_nl arg
|
822
826
|
{
|
@@ -939,7 +943,7 @@ rule
|
|
939
943
|
result = self.list_append val[0], s(:splat, val[3])
|
940
944
|
}
|
941
945
|
|
942
|
-
#if
|
946
|
+
#if V >= 21
|
943
947
|
mrhs_arg: mrhs
|
944
948
|
{
|
945
949
|
result = new_masgn_arg val[0]
|
@@ -1022,9 +1026,13 @@ rule
|
|
1022
1026
|
result = val[1] || s(:array)
|
1023
1027
|
result[0] = :array # aref_args is :args
|
1024
1028
|
}
|
1025
|
-
| tLBRACE
|
1029
|
+
| tLBRACE
|
1030
|
+
{
|
1031
|
+
result = self.lexer.lineno
|
1032
|
+
}
|
1033
|
+
assoc_list tRCURLY
|
1026
1034
|
{
|
1027
|
-
result =
|
1035
|
+
result = new_hash val
|
1028
1036
|
}
|
1029
1037
|
| kRETURN
|
1030
1038
|
{
|
@@ -1332,7 +1340,6 @@ rule
|
|
1332
1340
|
args, _, _, _, args2 = val
|
1333
1341
|
|
1334
1342
|
result = block_var args, :*, args2
|
1335
|
-
debug20 16, val, result
|
1336
1343
|
}
|
1337
1344
|
| tSTAR f_norm_arg
|
1338
1345
|
{
|
@@ -1345,12 +1352,10 @@ rule
|
|
1345
1352
|
_, splat, _, args = val
|
1346
1353
|
|
1347
1354
|
result = block_var :"*#{splat}", args
|
1348
|
-
debug20 17, val, result
|
1349
1355
|
}
|
1350
1356
|
| tSTAR
|
1351
1357
|
{
|
1352
1358
|
result = block_var :*
|
1353
|
-
debug20 18, val, result
|
1354
1359
|
}
|
1355
1360
|
| tSTAR tCOMMA f_marg_list
|
1356
1361
|
{
|
@@ -1671,7 +1676,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1671
1676
|
_, klasses, var, _, body, rest = val
|
1672
1677
|
|
1673
1678
|
klasses ||= s(:array)
|
1674
|
-
klasses <<
|
1679
|
+
klasses << new_assign(var, s(:gvar, :"$!")) if var
|
1675
1680
|
|
1676
1681
|
result = new_resbody(klasses, body)
|
1677
1682
|
result << rest if rest # UGH, rewritten above
|
@@ -1886,9 +1891,9 @@ regexp_contents: none
|
|
1886
1891
|
}
|
1887
1892
|
compstmt tRCURLY
|
1888
1893
|
{
|
1889
|
-
#if
|
1894
|
+
#if V == 20
|
1890
1895
|
# TODO: tRCURLY -> tSTRING_DEND
|
1891
|
-
#
|
1896
|
+
#else
|
1892
1897
|
# TODO: tRCURLY -> tSTRING_END
|
1893
1898
|
#endif
|
1894
1899
|
_, memo, stmt, _ = val
|
@@ -1956,17 +1961,17 @@ regexp_contents: none
|
|
1956
1961
|
end
|
1957
1962
|
}
|
1958
1963
|
|
1959
|
-
#if
|
1964
|
+
#if V == 20
|
1960
1965
|
numeric: tINTEGER
|
1961
1966
|
| tFLOAT
|
1962
1967
|
| tUMINUS_NUM tINTEGER =tLOWEST
|
1963
|
-
#
|
1968
|
+
#else
|
1964
1969
|
numeric: simple_numeric
|
1965
1970
|
| tUMINUS_NUM simple_numeric
|
1966
1971
|
#endif
|
1967
1972
|
{
|
1968
1973
|
result = -val[1] # TODO: pt_testcase
|
1969
|
-
#if
|
1974
|
+
#if V == 20
|
1970
1975
|
}
|
1971
1976
|
| tUMINUS_NUM tFLOAT =tLOWEST
|
1972
1977
|
{
|
@@ -1974,7 +1979,7 @@ regexp_contents: none
|
|
1974
1979
|
#endif
|
1975
1980
|
}
|
1976
1981
|
|
1977
|
-
#if
|
1982
|
+
#if V >= 21
|
1978
1983
|
simple_numeric: tINTEGER
|
1979
1984
|
| tFLOAT
|
1980
1985
|
| tRATIONAL
|
@@ -2173,7 +2178,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2173
2178
|
result = identifier
|
2174
2179
|
}
|
2175
2180
|
|
2176
|
-
#if
|
2181
|
+
#if V >= 22
|
2177
2182
|
f_arg_asgn: f_norm_arg
|
2178
2183
|
|
2179
2184
|
f_arg_item: f_arg_asgn
|
@@ -2215,9 +2220,9 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2215
2220
|
result << item
|
2216
2221
|
}
|
2217
2222
|
|
2218
|
-
#if
|
2223
|
+
#if V == 20
|
2219
2224
|
f_kw: tLABEL arg_value
|
2220
|
-
#
|
2225
|
+
#else
|
2221
2226
|
f_label: tLABEL
|
2222
2227
|
|
2223
2228
|
f_kw: f_label arg_value
|
@@ -2230,7 +2235,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2230
2235
|
|
2231
2236
|
result = s(:array, s(:kwarg, identifier, val[1]))
|
2232
2237
|
}
|
2233
|
-
#if
|
2238
|
+
#if V >= 21
|
2234
2239
|
| f_label
|
2235
2240
|
{
|
2236
2241
|
label, _ = val[0] # TODO: fix lineno?
|
@@ -2241,9 +2246,9 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2241
2246
|
}
|
2242
2247
|
#endif
|
2243
2248
|
|
2244
|
-
#if
|
2249
|
+
#if V == 20
|
2245
2250
|
f_block_kw: tLABEL primary_value
|
2246
|
-
#
|
2251
|
+
#else
|
2247
2252
|
f_block_kw: f_label primary_value
|
2248
2253
|
#endif
|
2249
2254
|
{
|
@@ -2254,7 +2259,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2254
2259
|
|
2255
2260
|
result = s(:array, s(:kwarg, identifier, val[1]))
|
2256
2261
|
}
|
2257
|
-
#if
|
2262
|
+
#if V >= 21
|
2258
2263
|
| f_label
|
2259
2264
|
{
|
2260
2265
|
label, _ = val[0] # TODO: fix lineno?
|
@@ -2290,11 +2295,11 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2290
2295
|
result = :"**"
|
2291
2296
|
}
|
2292
2297
|
|
2293
|
-
#if
|
2298
|
+
#if V == 20
|
2294
2299
|
f_opt: tIDENTIFIER tEQL arg_value
|
2295
|
-
#elif
|
2300
|
+
#elif V == 21
|
2296
2301
|
f_opt: f_norm_arg tEQL arg_value
|
2297
|
-
#
|
2302
|
+
#else
|
2298
2303
|
f_opt: f_arg_asgn tEQL arg_value
|
2299
2304
|
#endif
|
2300
2305
|
{
|
@@ -2302,11 +2307,11 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2302
2307
|
# TODO: detect duplicate names
|
2303
2308
|
}
|
2304
2309
|
|
2305
|
-
#if
|
2310
|
+
#if V == 20
|
2306
2311
|
f_block_opt: tIDENTIFIER tEQL primary_value
|
2307
|
-
#elif
|
2312
|
+
#elif V == 21
|
2308
2313
|
f_block_opt: f_norm_arg tEQL primary_value
|
2309
|
-
#
|
2314
|
+
#else
|
2310
2315
|
f_block_opt: f_arg_asgn tEQL primary_value
|
2311
2316
|
#endif
|
2312
2317
|
{
|
@@ -2396,7 +2401,6 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2396
2401
|
list.push(*more) unless more.empty?
|
2397
2402
|
result = list
|
2398
2403
|
result[0] = :hash
|
2399
|
-
# TODO: shouldn't this be a hash?
|
2400
2404
|
}
|
2401
2405
|
|
2402
2406
|
assoc: arg_value tASSOC arg_value
|
@@ -2407,7 +2411,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2407
2411
|
{
|
2408
2412
|
result = s(:array, s(:lit, val[0][0].to_sym), val[1])
|
2409
2413
|
}
|
2410
|
-
#if
|
2414
|
+
#if V >= 22
|
2411
2415
|
| tSTRING_BEG string_contents tLABEL_END arg_value
|
2412
2416
|
{
|
2413
2417
|
_, sym, _, value = val
|
@@ -2430,7 +2434,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2430
2434
|
operation3: tIDENTIFIER | tFID | op
|
2431
2435
|
dot_or_colon: tDOT | tCOLON2
|
2432
2436
|
call_op: tDOT
|
2433
|
-
#if
|
2437
|
+
#if V >= 23
|
2434
2438
|
| tLONELY
|
2435
2439
|
#endif
|
2436
2440
|
opt_terms: | terms
|