diff --git a/ChangeLog b/ChangeLog index 3d51db0fbe..df68e2893c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,11 @@ Thu Sep 30 16:11:08 2010 NAKAMURA Usaku * win32/win32.c (rb_w32_getenv): should return NULL if specified name is empty. a patch from Heesob Park at [ruby-core:32650] +Thu Sep 30 15:18:23 2010 Yukihiro Matsumoto + + * parse.y (command_asgn): allow command_call to be right hand side + expression of chained assignment. [ruby-dev:42313] + Thu Sep 30 10:55:38 2010 NAKAMURA Usaku * hash.c (ruby_setenv): workaround for old Windows. a patch from diff --git a/parse.y b/parse.y index e085088731..1c500525ec 100644 --- a/parse.y +++ b/parse.y @@ -690,7 +690,7 @@ static void token_info_pop(struct parser_params*, const char *token); %type args call_args opt_call_args %type paren_args opt_paren_args %type command_args aref_args opt_block_arg block_arg var_ref var_lhs -%type mrhs superclass block_call block_command +%type command_asgn mrhs superclass block_call block_command %type f_block_optarg f_block_opt %type f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs %type assoc_list assocs assoc undef_list backref string_dvar for_var @@ -1060,15 +1060,7 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem $$ = dispatch1(END, $3); %*/ } - | lhs '=' command_call - { - /*%%%*/ - value_expr($3); - $$ = node_assign($1, $3); - /*% - $$ = dispatch2(assign, $1, $3); - %*/ - } + | command_asgn | mlhs '=' command_call { /*%%%*/ @@ -1225,6 +1217,27 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem | expr ; +command_asgn : lhs '=' command_call + { + /*%%%*/ + value_expr($3); + $$ = node_assign($1, $3); + /*% + $$ = dispatch2(assign, $1, $3); + %*/ + } + | lhs '=' command_asgn + { + /*%%%*/ + value_expr($3); + $$ = node_assign($1, $3); + /*% + $$ = dispatch2(assign, $1, $3); + %*/ + } + ; + + expr : command_call | expr keyword_and expr {