parser 2.3.1.4 → 2.3.2.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
- data/CHANGELOG.md +14 -1
- data/README.md +24 -2
- data/doc/AST_FORMAT.md +19 -0
- data/lib/parser/ast/processor.rb +1 -0
- data/lib/parser/builders/default.rb +34 -5
- data/lib/parser/current.rb +1 -1
- data/lib/parser/macruby.y +6 -8
- data/lib/parser/messages.rb +1 -0
- data/lib/parser/ruby18.y +0 -3
- data/lib/parser/ruby19.y +6 -8
- data/lib/parser/ruby20.y +8 -8
- data/lib/parser/ruby21.y +8 -8
- data/lib/parser/ruby22.y +8 -8
- data/lib/parser/ruby23.y +8 -8
- data/lib/parser/ruby24.y +63 -70
- data/lib/parser/rubymotion.y +5 -4
- data/lib/parser/version.rb +1 -1
- data/test/test_parser.rb +421 -170
- 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: 73ca61e5ab86f82798f86bc14407c958d2b08a40
|
4
|
+
data.tar.gz: 9d88b4bc43581891ee5612e9c1c1d2288aa6fcc7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5c8232ddd5b94e0aff2dddec620201e99ad7db4bc4d7362e2feb2d5d4fb7456f861d6905750325cc4429e4f9a2946d9ff475d6ae3f5914af78c45fbe3e3a21e
|
7
|
+
data.tar.gz: 61255e34c1b006ec82b946aa173c6e2e4a48f7491db05392e0d667c3e834dfbb598e204eefd6e871a8d4bec2d254e71a1de5e65bf1db8917dfe06b76f26b34b1
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
v2.3.2.0 (2016-11-20)
|
5
|
+
---------------------
|
6
|
+
|
7
|
+
API modifications:
|
8
|
+
* parser/current: update 2.3 branch to 2.3.2. (whitequark)
|
9
|
+
* Introduce (procarg0) node for a single required block argument. (Ilya Bylich)
|
10
|
+
|
11
|
+
Bugs fixed:
|
12
|
+
* {macruby,ruby{19,20,21,22,23,24}}.y: "x::A += m x": treat as constant assignment. (whitequark)
|
13
|
+
* ruby24.y: "x += raise y rescue nil": bind rescue tighter than tOP_ASGN. (whitequark)
|
14
|
+
* ruby24.y: "x = raise y rescue nil": bind rescue tighter than =. (whitequark)
|
15
|
+
* Builders::Default: "begin; else; 1; end": fix a crash. (whitequark)
|
16
|
+
|
4
17
|
v2.3.1.4 (2016-09-19)
|
5
18
|
---------------------
|
6
19
|
|
@@ -92,7 +105,7 @@ Bugs fixed:
|
|
92
105
|
* Add :csend to Parser::Meta::NODE_TYPES (Markus Schirp)
|
93
106
|
* lexer/dedenter: "\<\<x\n y\\n z\nx": don't dedent after escaped newline. (whitequark)
|
94
107
|
|
95
|
-
v2.3.
|
108
|
+
v2.3.2.0 (2016-01-16)
|
96
109
|
---------------------
|
97
110
|
|
98
111
|
v2.3.0.1 (2016-01-14)
|
data/README.md
CHANGED
@@ -19,10 +19,15 @@ MacRuby and RubyMotion support sponsored by [CodeClimate](http://codeclimate.com
|
|
19
19
|
|
20
20
|
## Usage
|
21
21
|
|
22
|
-
|
22
|
+
Load Parser (see the [backwards compatibility](#backwards-compatibility) section
|
23
|
+
below for explanation of `emit_*` calls):
|
23
24
|
|
24
25
|
require 'parser/current'
|
25
|
-
|
26
|
+
# opt-in to most recent AST format:
|
27
|
+
Parser::Builders::Default.emit_lambda = true
|
28
|
+
Parser::Builders::Default.emit_procarg0 = true
|
29
|
+
|
30
|
+
Parse a chunk of code:
|
26
31
|
|
27
32
|
p Parser::CurrentRuby.parse("2 + 2")
|
28
33
|
# (send
|
@@ -197,6 +202,23 @@ $ ruby-parse -e '(foo) while cond'
|
|
197
202
|
|
198
203
|
(Parser also needs the `(kwbegin)` node type internally, and it is highly problematic to map it back to `(begin)`.)
|
199
204
|
|
205
|
+
## Backwards compatibility
|
206
|
+
|
207
|
+
Parser does _not_ use semantic versioning. Parser versions are structured as `x.y.z.t`,
|
208
|
+
where `x.y.z` indicates the most recent supported Ruby release (support for every
|
209
|
+
Ruby release that is chronologically earlier is implied), and `t` is a monotonically
|
210
|
+
increasing number.
|
211
|
+
|
212
|
+
The public API of Parser as well as the AST format (as listed in the documentation)
|
213
|
+
are considered stable forever, although support for old Ruby versions may be removed
|
214
|
+
at some point.
|
215
|
+
|
216
|
+
Sometimes it is necessary to modify the format of AST nodes that are already being emitted
|
217
|
+
in a way that would break existing applications. To avoid such breakage, applications
|
218
|
+
must opt-in to these modifications; without explicit opt-in, Parser will continue to emit
|
219
|
+
the old AST node format. The most recent set of opt-ins is speified in
|
220
|
+
the [usage section](#usage) of this README.
|
221
|
+
|
200
222
|
## Compatibility with Ruby MRI
|
201
223
|
|
202
224
|
Unfortunately, Ruby MRI often changes syntax in patchlevel versions. This has happened, at least, for every release since 1.9; for example, commits [c5013452](https://github.com/ruby/ruby/commit/c501345218dc5fb0fae90d56a0c6fd19d38df5bb) and [04bb9d6b](https://github.com/ruby/ruby/commit/04bb9d6b75a55d4000700769eead5a5cb942c25b) were backported all the way from HEAD to 1.9. Moreover, there is no simple way to track these changes.
|
data/doc/AST_FORMAT.md
CHANGED
@@ -912,6 +912,25 @@ Format:
|
|
912
912
|
|
913
913
|
Begin of the `expression` points to `&`.
|
914
914
|
|
915
|
+
### Auto-expanding proc argument (1.9)
|
916
|
+
|
917
|
+
In Ruby 1.9 and later, when a proc-like closure (i.e. a closure
|
918
|
+
created by capturing a block or with the `proc` method, but not
|
919
|
+
with the `->{}` syntax or the `lambda` method) has exactly one
|
920
|
+
argument, and it is called with more than one argument, the behavior
|
921
|
+
is as if the array of all arguments was instead passed as the sole
|
922
|
+
argument. This behavior can be prevented by adding a comma after
|
923
|
+
the sole argument (e.g. `|foo,|`).
|
924
|
+
|
925
|
+
Format:
|
926
|
+
|
927
|
+
~~~
|
928
|
+
(procarg0 :foo)
|
929
|
+
"|foo|"
|
930
|
+
~~~ expression
|
931
|
+
~~~ name
|
932
|
+
~~~
|
933
|
+
|
915
934
|
### Expression arguments
|
916
935
|
|
917
936
|
Ruby 1.8 allows to use arbitrary expressions as block arguments,
|
data/lib/parser/ast/processor.rb
CHANGED
@@ -121,6 +121,7 @@ module Parser
|
|
121
121
|
alias on_kwarg process_argument_node
|
122
122
|
alias on_kwoptarg process_argument_node
|
123
123
|
alias on_kwrestarg process_argument_node
|
124
|
+
alias on_procarg0 process_argument_node
|
124
125
|
|
125
126
|
alias on_arg_expr process_regular_node
|
126
127
|
alias on_restarg_expr process_regular_node
|
@@ -22,11 +22,30 @@ module Parser
|
|
22
22
|
|
23
23
|
@emit_lambda = false
|
24
24
|
|
25
|
+
class << self
|
26
|
+
##
|
27
|
+
# AST compatibility attribute; block arguments of `m { |a| }` are
|
28
|
+
# not semantically equivalent to block arguments of `m { |a,| }` or `m { |a, b| }`,
|
29
|
+
# all new code should set this attribute to true.
|
30
|
+
#
|
31
|
+
# If set to false (the default), arguments of `m { |a| }` are emitted as
|
32
|
+
# `s(:args, s(:arg, :a))`
|
33
|
+
#
|
34
|
+
# If set to true, arguments of `m { |a| }` are emitted as
|
35
|
+
# `s(:args, s(:procarg0, :a))
|
36
|
+
#
|
37
|
+
# @return [Boolean]
|
38
|
+
attr_accessor :emit_procarg0
|
39
|
+
end
|
40
|
+
|
41
|
+
@emit_procarg0 = false
|
42
|
+
|
25
43
|
class << self
|
26
44
|
##
|
27
45
|
# @api private
|
28
46
|
def modernize
|
29
47
|
@emit_lambda = true
|
48
|
+
@emit_procarg0 = true
|
30
49
|
end
|
31
50
|
end
|
32
51
|
|
@@ -637,6 +656,14 @@ module Parser
|
|
637
656
|
arg_prefix_map(amper_t, name_t))
|
638
657
|
end
|
639
658
|
|
659
|
+
def procarg0(arg)
|
660
|
+
if self.class.emit_procarg0
|
661
|
+
arg.updated(:procarg0)
|
662
|
+
else
|
663
|
+
arg
|
664
|
+
end
|
665
|
+
end
|
666
|
+
|
640
667
|
# Ruby 1.8 block arguments
|
641
668
|
|
642
669
|
def arg_expr(expr)
|
@@ -984,10 +1011,12 @@ module Parser
|
|
984
1011
|
end
|
985
1012
|
elsif else_t
|
986
1013
|
statements = []
|
987
|
-
if compound_stmt.
|
988
|
-
|
989
|
-
|
990
|
-
|
1014
|
+
if !compound_stmt.nil?
|
1015
|
+
if compound_stmt.type == :begin
|
1016
|
+
statements += compound_stmt.children
|
1017
|
+
else
|
1018
|
+
statements.push(compound_stmt)
|
1019
|
+
end
|
991
1020
|
end
|
992
1021
|
statements.push(
|
993
1022
|
n(:begin, [ else_ ],
|
@@ -1110,7 +1139,7 @@ module Parser
|
|
1110
1139
|
case this_arg.type
|
1111
1140
|
when :arg, :optarg, :restarg, :blockarg,
|
1112
1141
|
:kwarg, :kwoptarg, :kwrestarg,
|
1113
|
-
:shadowarg
|
1142
|
+
:shadowarg, :procarg0
|
1114
1143
|
|
1115
1144
|
this_name, = *this_arg
|
1116
1145
|
|
data/lib/parser/current.rb
CHANGED
data/lib/parser/macruby.y
CHANGED
@@ -206,10 +206,7 @@ rule
|
|
206
206
|
}
|
207
207
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
208
208
|
{
|
209
|
-
|
210
|
-
@builder.call_method(
|
211
|
-
val[0], val[1], val[2]),
|
212
|
-
val[3], val[4])
|
209
|
+
diagnostic :error, :const_reassignment, nil, val[3]
|
213
210
|
}
|
214
211
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
|
215
212
|
{
|
@@ -1350,9 +1347,6 @@ rule
|
|
1350
1347
|
concat(val[3])
|
1351
1348
|
}
|
1352
1349
|
| f_arg tCOMMA
|
1353
|
-
{
|
1354
|
-
result = [@builder.multi_lhs(nil, val[0], nil)]
|
1355
|
-
}
|
1356
1350
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1357
1351
|
{
|
1358
1352
|
result = val[0].
|
@@ -1362,7 +1356,11 @@ rule
|
|
1362
1356
|
}
|
1363
1357
|
| f_arg opt_f_block_arg
|
1364
1358
|
{
|
1365
|
-
|
1359
|
+
if val[1].empty? && val[0].size == 1
|
1360
|
+
result = [@builder.procarg0(val[0][0])]
|
1361
|
+
else
|
1362
|
+
result = val[0].concat(val[1])
|
1363
|
+
end
|
1366
1364
|
}
|
1367
1365
|
| f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
|
1368
1366
|
{
|
data/lib/parser/messages.rb
CHANGED
@@ -48,6 +48,7 @@ module Parser
|
|
48
48
|
:odd_hash => 'odd number of entries for a hash',
|
49
49
|
:singleton_literal => 'cannot define a singleton method for a literal',
|
50
50
|
:dynamic_const => 'dynamic constant assignment',
|
51
|
+
:const_reassignment => 'constant re-assignment',
|
51
52
|
:module_in_def => 'module definition in method body',
|
52
53
|
:class_in_def => 'class definition in method body',
|
53
54
|
:unexpected_percent_str => '%{type}: unknown type of percent-literal',
|
data/lib/parser/ruby18.y
CHANGED
data/lib/parser/ruby19.y
CHANGED
@@ -203,10 +203,7 @@ rule
|
|
203
203
|
}
|
204
204
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
205
205
|
{
|
206
|
-
|
207
|
-
@builder.call_method(
|
208
|
-
val[0], val[1], val[2]),
|
209
|
-
val[3], val[4])
|
206
|
+
diagnostic :error, :const_reassignment, nil, val[3]
|
210
207
|
}
|
211
208
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
|
212
209
|
{
|
@@ -1330,9 +1327,6 @@ rule
|
|
1330
1327
|
concat(val[3])
|
1331
1328
|
}
|
1332
1329
|
| f_arg tCOMMA
|
1333
|
-
{
|
1334
|
-
result = [@builder.multi_lhs(nil, val[0], nil)]
|
1335
|
-
}
|
1336
1330
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
|
1337
1331
|
{
|
1338
1332
|
result = val[0].
|
@@ -1342,7 +1336,11 @@ rule
|
|
1342
1336
|
}
|
1343
1337
|
| f_arg opt_f_block_arg
|
1344
1338
|
{
|
1345
|
-
|
1339
|
+
if val[1].empty? && val[0].size == 1
|
1340
|
+
result = [@builder.procarg0(val[0][0])]
|
1341
|
+
else
|
1342
|
+
result = val[0].concat(val[1])
|
1343
|
+
end
|
1346
1344
|
}
|
1347
1345
|
| f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
|
1348
1346
|
{
|
data/lib/parser/ruby20.y
CHANGED
@@ -213,10 +213,9 @@ rule
|
|
213
213
|
}
|
214
214
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
215
215
|
{
|
216
|
-
|
217
|
-
@builder.
|
218
|
-
|
219
|
-
val[3], val[4])
|
216
|
+
const = @builder.const_op_assignable(
|
217
|
+
@builder.const_fetch(val[0], val[1], val[2]))
|
218
|
+
result = @builder.op_assign(const, val[3], val[4])
|
220
219
|
}
|
221
220
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
|
222
221
|
{
|
@@ -1385,9 +1384,6 @@ opt_block_args_tail:
|
|
1385
1384
|
concat(val[3])
|
1386
1385
|
}
|
1387
1386
|
| f_arg tCOMMA
|
1388
|
-
{
|
1389
|
-
result = [@builder.multi_lhs(nil, val[0], nil)]
|
1390
|
-
}
|
1391
1387
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1392
1388
|
{
|
1393
1389
|
result = val[0].
|
@@ -1397,7 +1393,11 @@ opt_block_args_tail:
|
|
1397
1393
|
}
|
1398
1394
|
| f_arg opt_block_args_tail
|
1399
1395
|
{
|
1400
|
-
|
1396
|
+
if val[1].empty? && val[0].size == 1
|
1397
|
+
result = [@builder.procarg0(val[0][0])]
|
1398
|
+
else
|
1399
|
+
result = val[0].concat(val[1])
|
1400
|
+
end
|
1401
1401
|
}
|
1402
1402
|
| f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
|
1403
1403
|
{
|
data/lib/parser/ruby21.y
CHANGED
@@ -210,10 +210,9 @@ rule
|
|
210
210
|
}
|
211
211
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
212
212
|
{
|
213
|
-
|
214
|
-
@builder.
|
215
|
-
|
216
|
-
val[3], val[4])
|
213
|
+
const = @builder.const_op_assignable(
|
214
|
+
@builder.const_fetch(val[0], val[1], val[2]))
|
215
|
+
result = @builder.op_assign(const, val[3], val[4])
|
217
216
|
}
|
218
217
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
|
219
218
|
{
|
@@ -1365,9 +1364,6 @@ opt_block_args_tail:
|
|
1365
1364
|
concat(val[3])
|
1366
1365
|
}
|
1367
1366
|
| f_arg tCOMMA
|
1368
|
-
{
|
1369
|
-
result = [@builder.multi_lhs(nil, val[0], nil)]
|
1370
|
-
}
|
1371
1367
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1372
1368
|
{
|
1373
1369
|
result = val[0].
|
@@ -1377,7 +1373,11 @@ opt_block_args_tail:
|
|
1377
1373
|
}
|
1378
1374
|
| f_arg opt_block_args_tail
|
1379
1375
|
{
|
1380
|
-
|
1376
|
+
if val[1].empty? && val[0].size == 1
|
1377
|
+
result = [@builder.procarg0(val[0][0])]
|
1378
|
+
else
|
1379
|
+
result = val[0].concat(val[1])
|
1380
|
+
end
|
1381
1381
|
}
|
1382
1382
|
| f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
|
1383
1383
|
{
|
data/lib/parser/ruby22.y
CHANGED
@@ -210,10 +210,9 @@ rule
|
|
210
210
|
}
|
211
211
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
212
212
|
{
|
213
|
-
|
214
|
-
@builder.
|
215
|
-
|
216
|
-
val[3], val[4])
|
213
|
+
const = @builder.const_op_assignable(
|
214
|
+
@builder.const_fetch(val[0], val[1], val[2]))
|
215
|
+
result = @builder.op_assign(const, val[3], val[4])
|
217
216
|
}
|
218
217
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
|
219
218
|
{
|
@@ -1364,9 +1363,6 @@ opt_block_args_tail:
|
|
1364
1363
|
concat(val[3])
|
1365
1364
|
}
|
1366
1365
|
| f_arg tCOMMA
|
1367
|
-
{
|
1368
|
-
result = [@builder.multi_lhs(nil, val[0], nil)]
|
1369
|
-
}
|
1370
1366
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1371
1367
|
{
|
1372
1368
|
result = val[0].
|
@@ -1376,7 +1372,11 @@ opt_block_args_tail:
|
|
1376
1372
|
}
|
1377
1373
|
| f_arg opt_block_args_tail
|
1378
1374
|
{
|
1379
|
-
|
1375
|
+
if val[1].empty? && val[0].size == 1
|
1376
|
+
result = [@builder.procarg0(val[0][0])]
|
1377
|
+
else
|
1378
|
+
result = val[0].concat(val[1])
|
1379
|
+
end
|
1380
1380
|
}
|
1381
1381
|
| f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
|
1382
1382
|
{
|
data/lib/parser/ruby23.y
CHANGED
@@ -210,10 +210,9 @@ rule
|
|
210
210
|
}
|
211
211
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
212
212
|
{
|
213
|
-
|
214
|
-
@builder.
|
215
|
-
|
216
|
-
val[3], val[4])
|
213
|
+
const = @builder.const_op_assignable(
|
214
|
+
@builder.const_fetch(val[0], val[1], val[2]))
|
215
|
+
result = @builder.op_assign(const, val[3], val[4])
|
217
216
|
}
|
218
217
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
|
219
218
|
{
|
@@ -1364,9 +1363,6 @@ opt_block_args_tail:
|
|
1364
1363
|
concat(val[3])
|
1365
1364
|
}
|
1366
1365
|
| f_arg tCOMMA
|
1367
|
-
{
|
1368
|
-
result = [@builder.multi_lhs(nil, val[0], nil)]
|
1369
|
-
}
|
1370
1366
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1371
1367
|
{
|
1372
1368
|
result = val[0].
|
@@ -1376,7 +1372,11 @@ opt_block_args_tail:
|
|
1376
1372
|
}
|
1377
1373
|
| f_arg opt_block_args_tail
|
1378
1374
|
{
|
1379
|
-
|
1375
|
+
if val[1].empty? && val[0].size == 1
|
1376
|
+
result = [@builder.procarg0(val[0][0])]
|
1377
|
+
else
|
1378
|
+
result = val[0].concat(val[1])
|
1379
|
+
end
|
1380
1380
|
}
|
1381
1381
|
| f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
|
1382
1382
|
{
|
data/lib/parser/ruby24.y
CHANGED
@@ -183,46 +183,45 @@ rule
|
|
183
183
|
{
|
184
184
|
result = @builder.multi_assign(val[0], val[1], val[2])
|
185
185
|
}
|
186
|
-
| var_lhs tOP_ASGN
|
186
|
+
| var_lhs tOP_ASGN command_rhs
|
187
187
|
{
|
188
188
|
result = @builder.op_assign(val[0], val[1], val[2])
|
189
189
|
}
|
190
|
-
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN
|
190
|
+
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
|
191
191
|
{
|
192
192
|
result = @builder.op_assign(
|
193
193
|
@builder.index(
|
194
194
|
val[0], val[1], val[2], val[3]),
|
195
195
|
val[4], val[5])
|
196
196
|
}
|
197
|
-
| primary_value call_op tIDENTIFIER tOP_ASGN
|
197
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
|
198
198
|
{
|
199
199
|
result = @builder.op_assign(
|
200
200
|
@builder.call_method(
|
201
201
|
val[0], val[1], val[2]),
|
202
202
|
val[3], val[4])
|
203
203
|
}
|
204
|
-
| primary_value call_op tCONSTANT tOP_ASGN
|
204
|
+
| primary_value call_op tCONSTANT tOP_ASGN command_rhs
|
205
205
|
{
|
206
206
|
result = @builder.op_assign(
|
207
207
|
@builder.call_method(
|
208
208
|
val[0], val[1], val[2]),
|
209
209
|
val[3], val[4])
|
210
210
|
}
|
211
|
-
| primary_value tCOLON2 tCONSTANT tOP_ASGN
|
211
|
+
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
|
212
212
|
{
|
213
|
-
|
214
|
-
@builder.
|
215
|
-
|
216
|
-
val[3], val[4])
|
213
|
+
const = @builder.const_op_assignable(
|
214
|
+
@builder.const_fetch(val[0], val[1], val[2]))
|
215
|
+
result = @builder.op_assign(const, val[3], val[4])
|
217
216
|
}
|
218
|
-
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN
|
217
|
+
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
|
219
218
|
{
|
220
219
|
result = @builder.op_assign(
|
221
220
|
@builder.call_method(
|
222
221
|
val[0], val[1], val[2]),
|
223
222
|
val[3], val[4])
|
224
223
|
}
|
225
|
-
| backref tOP_ASGN
|
224
|
+
| backref tOP_ASGN command_rhs
|
226
225
|
{
|
227
226
|
@builder.op_assign(val[0], val[1], val[2])
|
228
227
|
}
|
@@ -237,14 +236,21 @@ rule
|
|
237
236
|
}
|
238
237
|
| expr
|
239
238
|
|
240
|
-
command_asgn: lhs tEQL
|
239
|
+
command_asgn: lhs tEQL command_rhs
|
241
240
|
{
|
242
241
|
result = @builder.assign(val[0], val[1], val[2])
|
243
242
|
}
|
244
|
-
|
243
|
+
|
244
|
+
command_rhs: command_call =tOP_ASGN
|
245
|
+
| command_call kRESCUE_MOD stmt
|
245
246
|
{
|
246
|
-
|
247
|
+
rescue_body = @builder.rescue_body(val[1],
|
248
|
+
nil, nil, nil,
|
249
|
+
nil, val[2])
|
250
|
+
|
251
|
+
result = @builder.begin_body(val[0], [ rescue_body ])
|
247
252
|
}
|
253
|
+
| command_asgn
|
248
254
|
|
249
255
|
expr: command_call
|
250
256
|
| expr kAND expr
|
@@ -277,15 +283,9 @@ rule
|
|
277
283
|
nil, val[3], nil)
|
278
284
|
}
|
279
285
|
|
280
|
-
cmd_brace_block: tLBRACE_ARG
|
286
|
+
cmd_brace_block: tLBRACE_ARG brace_body tRCURLY
|
281
287
|
{
|
282
|
-
|
283
|
-
}
|
284
|
-
opt_block_param compstmt tRCURLY
|
285
|
-
{
|
286
|
-
result = [ val[0], val[2], val[3], val[4] ]
|
287
|
-
|
288
|
-
@static_env.unextend
|
288
|
+
result = [ val[0], *val[1], val[2] ]
|
289
289
|
}
|
290
290
|
|
291
291
|
fcall: operation
|
@@ -586,75 +586,55 @@ rule
|
|
586
586
|
| kWHEN | kYIELD | kIF | kUNLESS | kWHILE
|
587
587
|
| kUNTIL
|
588
588
|
|
589
|
-
arg: lhs tEQL
|
589
|
+
arg: lhs tEQL arg_rhs
|
590
590
|
{
|
591
591
|
result = @builder.assign(val[0], val[1], val[2])
|
592
592
|
}
|
593
|
-
|
|
594
|
-
{
|
595
|
-
rescue_body = @builder.rescue_body(val[3],
|
596
|
-
nil, nil, nil,
|
597
|
-
nil, val[4])
|
598
|
-
|
599
|
-
rescue_ = @builder.begin_body(val[2], [ rescue_body ])
|
600
|
-
|
601
|
-
result = @builder.assign(val[0], val[1], rescue_)
|
602
|
-
}
|
603
|
-
| var_lhs tOP_ASGN arg
|
593
|
+
| var_lhs tOP_ASGN arg_rhs
|
604
594
|
{
|
605
595
|
result = @builder.op_assign(val[0], val[1], val[2])
|
606
596
|
}
|
607
|
-
|
|
608
|
-
{
|
609
|
-
rescue_body = @builder.rescue_body(val[3],
|
610
|
-
nil, nil, nil,
|
611
|
-
nil, val[4])
|
612
|
-
|
613
|
-
rescue_ = @builder.begin_body(val[2], [ rescue_body ])
|
614
|
-
|
615
|
-
result = @builder.op_assign(val[0], val[1], rescue_)
|
616
|
-
}
|
617
|
-
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg
|
597
|
+
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
|
618
598
|
{
|
619
599
|
result = @builder.op_assign(
|
620
600
|
@builder.index(
|
621
601
|
val[0], val[1], val[2], val[3]),
|
622
602
|
val[4], val[5])
|
623
603
|
}
|
624
|
-
| primary_value call_op tIDENTIFIER tOP_ASGN
|
604
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
|
625
605
|
{
|
626
606
|
result = @builder.op_assign(
|
627
607
|
@builder.call_method(
|
628
608
|
val[0], val[1], val[2]),
|
629
609
|
val[3], val[4])
|
630
610
|
}
|
631
|
-
| primary_value call_op tCONSTANT tOP_ASGN
|
611
|
+
| primary_value call_op tCONSTANT tOP_ASGN arg_rhs
|
632
612
|
{
|
633
613
|
result = @builder.op_assign(
|
634
614
|
@builder.call_method(
|
635
615
|
val[0], val[1], val[2]),
|
636
616
|
val[3], val[4])
|
637
617
|
}
|
638
|
-
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN
|
618
|
+
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
|
639
619
|
{
|
640
620
|
result = @builder.op_assign(
|
641
621
|
@builder.call_method(
|
642
622
|
val[0], val[1], val[2]),
|
643
623
|
val[3], val[4])
|
644
624
|
}
|
645
|
-
| primary_value tCOLON2 tCONSTANT tOP_ASGN
|
625
|
+
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
|
646
626
|
{
|
647
627
|
const = @builder.const_op_assignable(
|
648
628
|
@builder.const_fetch(val[0], val[1], val[2]))
|
649
629
|
result = @builder.op_assign(const, val[3], val[4])
|
650
630
|
}
|
651
|
-
| tCOLON3 tCONSTANT tOP_ASGN
|
631
|
+
| tCOLON3 tCONSTANT tOP_ASGN arg_rhs
|
652
632
|
{
|
653
633
|
const = @builder.const_op_assignable(
|
654
634
|
@builder.const_global(val[0], val[1]))
|
655
635
|
result = @builder.op_assign(const, val[2], val[3])
|
656
636
|
}
|
657
|
-
| backref tOP_ASGN
|
637
|
+
| backref tOP_ASGN arg_rhs
|
658
638
|
{
|
659
639
|
result = @builder.op_assign(val[0], val[1], val[2])
|
660
640
|
}
|
@@ -804,6 +784,16 @@ rule
|
|
804
784
|
result = [ @builder.associate(nil, val[0], nil) ]
|
805
785
|
}
|
806
786
|
|
787
|
+
arg_rhs: arg =tOP_ASGN
|
788
|
+
| arg kRESCUE_MOD arg
|
789
|
+
{
|
790
|
+
rescue_body = @builder.rescue_body(val[1],
|
791
|
+
nil, nil, nil,
|
792
|
+
nil, val[2])
|
793
|
+
|
794
|
+
result = @builder.begin_body(val[0], [ rescue_body ])
|
795
|
+
}
|
796
|
+
|
807
797
|
paren_args: tLPAREN2 opt_call_args rparen
|
808
798
|
{
|
809
799
|
result = val
|
@@ -1364,9 +1354,6 @@ opt_block_args_tail:
|
|
1364
1354
|
concat(val[3])
|
1365
1355
|
}
|
1366
1356
|
| f_arg tCOMMA
|
1367
|
-
{
|
1368
|
-
result = [@builder.multi_lhs(nil, val[0], nil)]
|
1369
|
-
}
|
1370
1357
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1371
1358
|
{
|
1372
1359
|
result = val[0].
|
@@ -1376,7 +1363,11 @@ opt_block_args_tail:
|
|
1376
1363
|
}
|
1377
1364
|
| f_arg opt_block_args_tail
|
1378
1365
|
{
|
1379
|
-
|
1366
|
+
if val[1].empty? && val[0].size == 1
|
1367
|
+
result = [@builder.procarg0(val[0][0])]
|
1368
|
+
else
|
1369
|
+
result = val[0].concat(val[1])
|
1370
|
+
end
|
1380
1371
|
}
|
1381
1372
|
| f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
|
1382
1373
|
{
|
@@ -1498,15 +1489,9 @@ opt_block_args_tail:
|
|
1498
1489
|
result = [ val[0], val[1], val[2] ]
|
1499
1490
|
}
|
1500
1491
|
|
1501
|
-
do_block: kDO_BLOCK
|
1492
|
+
do_block: kDO_BLOCK do_body kEND
|
1502
1493
|
{
|
1503
|
-
|
1504
|
-
}
|
1505
|
-
opt_block_param compstmt kEND
|
1506
|
-
{
|
1507
|
-
result = [ val[0], val[2], val[3], val[4] ]
|
1508
|
-
|
1509
|
-
@static_env.unextend
|
1494
|
+
result = [ val[0], *val[1], val[2] ]
|
1510
1495
|
}
|
1511
1496
|
|
1512
1497
|
block_call: command do_block
|
@@ -1590,23 +1575,31 @@ opt_block_args_tail:
|
|
1590
1575
|
result = @builder.index(val[0], val[1], val[2], val[3])
|
1591
1576
|
}
|
1592
1577
|
|
1593
|
-
brace_block: tLCURLY
|
1578
|
+
brace_block: tLCURLY brace_body tRCURLY
|
1594
1579
|
{
|
1580
|
+
result = [ val[0], *val[1], val[2] ]
|
1581
|
+
}
|
1582
|
+
| kDO do_body kEND
|
1583
|
+
{
|
1584
|
+
result = [ val[0], *val[1], val[2] ]
|
1585
|
+
}
|
1586
|
+
|
1587
|
+
brace_body: {
|
1595
1588
|
@static_env.extend_dynamic
|
1596
1589
|
}
|
1597
|
-
opt_block_param compstmt
|
1590
|
+
opt_block_param compstmt
|
1598
1591
|
{
|
1599
|
-
result = [ val[
|
1592
|
+
result = [ val[1], val[2] ]
|
1600
1593
|
|
1601
1594
|
@static_env.unextend
|
1602
1595
|
}
|
1603
|
-
|
1604
|
-
|
1596
|
+
|
1597
|
+
do_body: {
|
1605
1598
|
@static_env.extend_dynamic
|
1606
1599
|
}
|
1607
|
-
|
1600
|
+
opt_block_param compstmt
|
1608
1601
|
{
|
1609
|
-
result = [ val[
|
1602
|
+
result = [ val[1], val[2] ]
|
1610
1603
|
|
1611
1604
|
@static_env.unextend
|
1612
1605
|
}
|