diff --git a/parse.y b/parse.y index 7684c636a3..92875253c4 100644 --- a/parse.y +++ b/parse.y @@ -2784,7 +2784,6 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) %type f_margs %type assoc_list assocs assoc undef_list backref string_dvar for_var %type block_param opt_block_param block_param_def -%type f_kw f_block_kw %type bv_decls opt_bv_decl bvar %type lambda brace_body do_body %type lambda_body @@ -2950,15 +2949,29 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) } ; -%rule f_kwarg(kw) - : kw +%rule f_kw(value) : f_label value + { + p->ctxt.in_argdef = 1; + $$ = new_kw_arg(p, assignable(p, $f_label, $value, &@$), &@$); + /*% ripper: [$:$, $:value] %*/ + } + | f_label + { + p->ctxt.in_argdef = 1; + $$ = new_kw_arg(p, assignable(p, $f_label, NODE_SPECIAL_REQUIRED_KEYWORD, &@$), &@$); + /*% ripper: [$:$, 0] %*/ + } + ; + +%rule f_kwarg(value) + : f_kw(value) { - $$ = $kw; + $$ = $f_kw; /*% ripper: rb_ary_new3(1, $:1) %*/ } - | f_kwarg(kw) ',' kw + | f_kwarg(value) ',' f_kw(value) { - $$ = kwd_append($f_kwarg, $kw); + $$ = kwd_append($f_kwarg, $f_kw); /*% ripper: rb_ary_push($:1, $:3) %*/ } ; @@ -4994,12 +5007,12 @@ f_any_kwrest : f_kwrest f_eq : {p->ctxt.in_argdef = 0;} '='; -block_args_tail : f_kwarg(f_block_kw) ',' f_kwrest opt_f_block_arg +block_args_tail : f_kwarg(primary_value) ',' f_kwrest opt_f_block_arg { $$ = new_args_tail(p, $1, $3, $4, &@3); /*% ripper: [$:1, $:3, $:4] %*/ } - | f_kwarg(f_block_kw) opt_f_block_arg + | f_kwarg(primary_value) opt_f_block_arg { $$ = new_args_tail(p, $1, 0, $2, &@1); /*% ripper: [$:1, Qnil, $:2] %*/ @@ -6374,12 +6387,12 @@ f_arglist : f_paren_args } ; -args_tail : f_kwarg(f_kw) ',' f_kwrest opt_f_block_arg +args_tail : f_kwarg(arg_value) ',' f_kwrest opt_f_block_arg { $$ = new_args_tail(p, $1, $3, $4, &@3); /*% ripper: [$:1, $:3, $:4] %*/ } - | f_kwarg(f_kw) opt_f_block_arg + | f_kwarg(arg_value) opt_f_block_arg { $$ = new_args_tail(p, $1, 0, $2, &@1); /*% ripper: [$:1, Qnil, $:2] %*/ @@ -6614,34 +6627,6 @@ f_label : tLABEL } ; -f_kw : f_label arg_value - { - p->ctxt.in_argdef = 1; - $$ = new_kw_arg(p, assignable(p, $1, $2, &@$), &@$); - /*% ripper: [$:$, $:2] %*/ - } - | f_label - { - p->ctxt.in_argdef = 1; - $$ = new_kw_arg(p, assignable(p, $1, NODE_SPECIAL_REQUIRED_KEYWORD, &@$), &@$); - /*% ripper: [$:$, 0] %*/ - } - ; - -f_block_kw : f_label primary_value - { - p->ctxt.in_argdef = 1; - $$ = new_kw_arg(p, assignable(p, $1, $2, &@$), &@$); - /*% ripper: [$:$, $:2] %*/ - } - | f_label - { - p->ctxt.in_argdef = 1; - $$ = new_kw_arg(p, assignable(p, $1, NODE_SPECIAL_REQUIRED_KEYWORD, &@$), &@$); - /*% ripper: [$:$, 0] %*/ - } - ; - kwrest_mark : tPOW | tDSTAR ;