Rightward-assign by ASSOC.

[ruby-bugs:15921]
parent b2398879
...@@ -1416,7 +1416,7 @@ heredoc_end(parser_state *p) ...@@ -1416,7 +1416,7 @@ heredoc_end(parser_state *p)
%type <nd> singleton string string_fragment string_rep string_interp xstring regexp %type <nd> singleton string string_fragment string_rep string_interp xstring regexp
%type <nd> literal numeric cpath symbol %type <nd> literal numeric cpath symbol
%type <nd> top_compstmt top_stmts top_stmt %type <nd> top_compstmt top_stmts top_stmt rassign
%type <nd> bodystmt compstmt stmts stmt expr arg primary command command_call method_call %type <nd> bodystmt compstmt stmts stmt expr arg primary command command_call method_call
%type <nd> expr_value arg_rhs primary_value %type <nd> expr_value arg_rhs primary_value
%type <nd> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure %type <nd> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure
...@@ -1658,9 +1658,30 @@ stmt : keyword_alias fsym {p->lstate = EXPR_FNAME;} fsym ...@@ -1658,9 +1658,30 @@ stmt : keyword_alias fsym {p->lstate = EXPR_FNAME;} fsym
{ {
$$ = new_masgn(p, $1, new_array(p, $3)); $$ = new_masgn(p, $1, new_array(p, $3));
} }
| rassign
| expr | expr
; ;
rassign : arg tASSOC lhs
{
void_expr_error(p, $1);
$$ = new_asgn(p, $3, $1);
}
| arg tASSOC mlhs
{
void_expr_error(p, $1);
$$ = new_masgn(p, $3, $1);
}
| rassign tASSOC lhs
{
$$ = new_asgn(p, $3, $1);
}
| rassign tASSOC mlhs
{
$$ = new_masgn(p, $3, $1);
}
;
command_asgn : lhs '=' command_rhs command_asgn : lhs '=' command_rhs
{ {
$$ = new_asgn(p, $1, $3); $$ = new_asgn(p, $1, $3);
......
...@@ -345,6 +345,15 @@ assert('splat object in assignment') do ...@@ -345,6 +345,15 @@ assert('splat object in assignment') do
assert_equal [2], (a = *o) assert_equal [2], (a = *o)
end end
assert('right-ward assignment') do
1 => a
assert_equal(1, a)
13.divmod(5) => a,b
assert_equal([2,3], [a, b])
13.divmod(5) => a,b => c, d
assert_equal([2,3,2,3], [a, b, c, d])
end
assert('splat object in case statement') do assert('splat object in case statement') do
o = Object.new o = Object.new
def o.to_a def o.to_a
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment