summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2026-03-02 02:29:09 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2026-03-06 18:25:08 +0900
commitd5d144c149d3beabbfb262e3994f60552469181b (patch)
treeb6782bcddf61338f01b5f6abf94ca92ebcc70790 /parse.y
parent66c3ff3f18f7fd6b46b14762352085650a13800b (diff)
parse.y: Split forwarding argument in method and lambda
Eliminate the lambda argument conditions from the action.
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y54
1 files changed, 32 insertions, 22 deletions
diff --git a/parse.y b/parse.y
index 6813b39633..b91b141cc6 100644
--- a/parse.y
+++ b/parse.y
@@ -2773,7 +2773,7 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary)
%type <node> if_tail opt_else case_body case_args cases opt_rescue exc_list exc_var opt_ensure
%type <node> args arg_splat call_args opt_call_args
%type <node> paren_args opt_paren_args
-%type <node_args> args_tail block_args_tail f_args-opt_tail block_args-opt_tail
+%type <node_args> args_tail block_args_tail block_args-opt_tail
%type <node> command_args aref_args
%type <node_block_pass> opt_block_arg block_arg
%type <node> var_ref var_lhs
@@ -2788,7 +2788,7 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary)
%type <id> do bv_decls opt_bv_decl bvar
%type <node> lambda brace_body do_body
%type <locations_lambda_body> lambda_body
-%type <node_args> f_larglist
+%type <node_args> f_larglist f_largs largs_tail
%type <node> brace_block cmd_brace_block do_block lhs none fitem
%type <node> mlhs_head mlhs_item mlhs_node
%type <node_masgn> mlhs mlhs_basic mlhs_inner
@@ -5103,19 +5103,19 @@ lambda : tLAMBDA[lpar]
}
;
-f_larglist : '(' f_args opt_bv_decl ')'
+f_larglist : '(' f_largs[args] opt_bv_decl ')'
{
p->ctxt.in_argdef = 0;
- $$ = $f_args;
+ $$ = $args;
p->max_numparam = ORDINAL_PARAM;
- /*% ripper: paren!($:f_args) %*/
+ /*% ripper: paren!($:args) %*/
}
- | f_args
+ | f_largs[args]
{
p->ctxt.in_argdef = 0;
- if (!args_info_empty_p(&$f_args->nd_ainfo))
+ if (!args_info_empty_p(&$args->nd_ainfo))
p->max_numparam = ORDINAL_PARAM;
- $$ = $f_args;
+ $$ = $args;
}
;
@@ -6243,16 +6243,18 @@ f_arglist : f_paren_args
args_tail : args_tail_basic(arg_value)
| args_forward
{
- ID fwd = $args_forward;
- if (lambda_beginning_p() ||
- (p->lex.lpar_beg >= 0 && p->lex.lpar_beg+1 == p->lex.paren_nest)) {
- yyerror0("unexpected ... in lambda argument");
- fwd = 0;
- }
- else {
- add_forwarding_args(p);
- }
- $$ = new_args_tail(p, 0, fwd, arg_FWD_BLOCK, &@args_forward);
+ add_forwarding_args(p);
+ $$ = new_args_tail(p, 0, $args_forward, arg_FWD_BLOCK, &@args_forward);
+ $$->nd_ainfo.forwarding = 1;
+ /*% ripper: [Qnil, $:args_forward, Qnil] %*/
+ }
+ ;
+
+largs_tail : args_tail_basic(arg_value)
+ | args_forward
+ {
+ yyerror1(&@args_forward, "unexpected ... in lambda argument");
+ $$ = new_args_tail(p, 0, 0, 0, &@args_forward);
$$->nd_ainfo.forwarding = 1;
/*% ripper: [Qnil, $:args_forward, Qnil] %*/
}
@@ -6329,19 +6331,27 @@ args_tail : args_tail_basic(arg_value)
}
;
-f_args-opt_tail : opt_args_tail(args_tail)
+%rule f_args-opt_tail(tail) <node_args>
+ : opt_args_tail(tail)
;
-f_args : args-list(arg_value, f_args-opt_tail)
- | f_arg[pre] f_args-opt_tail[tail]
+
+%rule f_args-list(tail) <node_args>
+ : args-list(arg_value, f_args-opt_tail(tail))
+ | f_arg[pre] opt_args_tail(tail)[tail]
{
$$ = new_args(p, $pre, 0, 0, 0, $tail, &@$);
/*% ripper: params!($:pre, Qnil, Qnil, Qnil, *$:tail[0..2]) %*/
}
- | tail-only-args(args_tail)
+ | tail-only-args(tail)
| f_empty_arg
;
+f_args : f_args-list(args_tail)
+ ;
+
+f_largs : f_args-list(largs_tail)
+ ;
args_forward : tBDOT3
{