From ae9b60f18999479640b5b945b76cd74f124c172d Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 26 Feb 2026 20:09:33 +0900 Subject: [Feature #19107] parse.y: Allow trailing comma in method signature --- parse.y | 60 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 30 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index bcff7918bf..170ed08a5e 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 if_tail opt_else case_body case_args cases opt_rescue exc_list exc_var opt_ensure %type args arg_splat call_args opt_call_args %type paren_args opt_paren_args -%type args_tail block_args_tail block_args-opt_tail +%type args_tail block_args_tail %type command_args aref_args %type opt_block_arg block_arg %type var_ref var_lhs @@ -2798,7 +2798,7 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) %type p_value p_primitive p_variable p_var_ref p_expr_ref p_const %type p_kwargs p_kwarg p_kw %type keyword_variable user_variable sym operation2 operation3 -%type cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_bad_arg +%type cname fname op f_rest_arg f_block_arg opt_comma f_norm_arg f_bad_arg %type f_kwrest f_label f_arg_asgn call_op call_op2 reswords relop dot_or_colon %type p_kwrest p_kwnorest p_any_kwrest p_kw_label %type f_no_kwarg f_any_kwrest args_forward excessed_comma nonlocal_var def_name @@ -2923,18 +2923,18 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) } ; -%rule args_tail_basic(value) - : f_kwarg(value) ',' f_kwrest opt_f_block_arg +%rule args_tail_basic(value, trailing) + : f_kwarg(value) ',' f_kwrest opt_f_block_arg(trailing) { $$ = new_args_tail(p, $1, $3, $4, &@3); /*% ripper: [$:1, $:3, $:4] %*/ } - | f_kwarg(value) opt_f_block_arg + | f_kwarg(value) opt_f_block_arg(trailing) { $$ = new_args_tail(p, $1, 0, $2, &@1); /*% ripper: [$:1, Qnil, $:2] %*/ } - | f_any_kwrest opt_f_block_arg + | f_any_kwrest opt_f_block_arg(trailing) { $$ = new_args_tail(p, 0, $1, $2, &@1); /*% ripper: [Qnil, $:1, $:2] %*/ @@ -2946,6 +2946,15 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) } ; +%rule opt_f_block_arg(trailing) + : ',' f_block_arg + { + $$ = $2; + /*% ripper: $:2 %*/ + } + | trailing + ; + %rule def_endless_method(bodystmt) : defn_head[head] f_opt_paren_args[args] '=' bodystmt { @@ -3087,13 +3096,13 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary) } ; -%rule opt_args_tail(tail) +%rule opt_args_tail(tail, trailing) : ',' tail { $$ = $tail; /*% ripper: $:tail %*/ } - | /* none */ + | trailing { $$ = new_empty_args_tail(p, &@$); /*% ripper: [Qnil, Qnil, Qnil] %*/ @@ -4973,10 +4982,7 @@ f_any_kwrest : f_kwrest f_eq : {p->ctxt.in_argdef = 0;} '='; -block_args_tail : args_tail_basic(primary_value) - ; - -block_args-opt_tail : opt_args_tail(block_args_tail) +block_args_tail : args_tail_basic(primary_value, none) ; excessed_comma : ',' @@ -4987,14 +4993,14 @@ excessed_comma : ',' } ; -block_param : args-list(primary_value, block_args-opt_tail) +block_param : args-list(primary_value, opt_args_tail(block_args_tail, none)) | f_arg[pre] excessed_comma { $$ = new_empty_args_tail(p, &@excessed_comma); $$ = new_args(p, $pre, 0, $excessed_comma, 0, $$, &@$); /*% ripper: params!($:pre, Qnil, $:excessed_comma, Qnil, Qnil, Qnil, Qnil) %*/ } - | f_arg[pre] opt_args_tail(block_args_tail)[tail] + | f_arg[pre] opt_args_tail(block_args_tail, none)[tail] { $$ = new_args(p, $pre, 0, 0, 0, $tail, &@$); /*% ripper: params!($:pre, Qnil, Qnil, Qnil, *$:tail[0..2]) %*/ @@ -6240,7 +6246,7 @@ f_arglist : f_paren_args } ; -args_tail : args_tail_basic(arg_value) +args_tail : args_tail_basic(arg_value, opt_comma) | args_forward { add_forwarding_args(p); @@ -6250,7 +6256,7 @@ args_tail : args_tail_basic(arg_value) } ; -largs_tail : args_tail_basic(arg_value) +largs_tail : args_tail_basic(arg_value, none) | args_forward { yyerror1(&@args_forward, "unexpected ... in lambda argument"); @@ -6331,14 +6337,9 @@ largs_tail : args_tail_basic(arg_value) } ; -%rule f_args-opt_tail(tail) - : opt_args_tail(tail) - ; - - -%rule f_args-list(tail) - : args-list(arg_value, f_args-opt_tail(tail)) - | f_arg[pre] opt_args_tail(tail)[tail] +%rule f_args-list(tail, trailing) + : args-list(arg_value, opt_args_tail(tail, trailing)) + | f_arg[pre] opt_args_tail(tail, trailing)[tail] { $$ = new_args(p, $pre, 0, 0, 0, $tail, &@$); /*% ripper: params!($:pre, Qnil, Qnil, Qnil, *$:tail[0..2]) %*/ @@ -6347,10 +6348,10 @@ largs_tail : args_tail_basic(arg_value) | f_empty_arg ; -f_args : f_args-list(args_tail) +f_args : f_args-list(args_tail, opt_comma) ; -f_largs : f_args-list(largs_tail) +f_largs : f_args-list(largs_tail, none) ; args_forward : tBDOT3 @@ -6538,12 +6539,11 @@ f_block_arg : blkarg_mark tIDENTIFIER } ; -opt_f_block_arg : ',' f_block_arg +opt_comma : ','? { - $$ = $2; - /*% ripper: $:2 %*/ + $$ = 0; + /*% ripper: Qnil %*/ } - | none ; -- cgit v1.2.3