diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-02-24 16:53:23 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-02-24 16:56:55 +0900 |
| commit | 386b53e6d906c6fa82b3bb928b2b24d49b001a52 (patch) | |
| tree | f1d77bd053eb0fe0eec581a0b755e6a0c6403bd2 /mrbgems/mruby-compiler/core/parse.y | |
| parent | a9ebd4703f8261057ae8d8929dcfe441e4f76069 (diff) | |
| download | mruby-386b53e6d906c6fa82b3bb928b2b24d49b001a52.tar.gz mruby-386b53e6d906c6fa82b3bb928b2b24d49b001a52.zip | |
parse.y: upgrade endless `def` syntax.
- prohibit defining setter method
- allow endless def without parentheses
Diffstat (limited to 'mrbgems/mruby-compiler/core/parse.y')
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 1a07cc14b..f7ea449ad 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -1205,6 +1205,18 @@ args_with_block(parser_state *p, node *a, node *b) } static void +endless_method_name(parser_state *p, node *defn) +{ + mrb_sym sym = sym(defn->cdr->car); + mrb_int len; + const char *name = mrb_sym_name_len(p->mrb, sym, &len); + + if (len > 1 && name[len-1] == '=') { + yyerror(p, "setter method cannot be defined by endless method definition"); + } +} + +static void call_with_block(parser_state *p, node *a, node *b) { node *n; @@ -1463,7 +1475,8 @@ heredoc_end(parser_state *p) %type <nd> command_args aref_args opt_block_arg block_arg var_ref var_lhs %type <nd> command_asgn command_rhs mrhs superclass block_call block_command %type <nd> f_block_optarg f_block_opt -%type <nd> f_arglist_paren f_arglist f_args f_arg f_arg_item f_optarg f_margs +%type <nd> f_opt_arglist_paren f_arglist_paren f_arglist +%type <nd> f_args f_arg f_arg_item f_optarg f_margs %type <nd> assoc_list assocs assoc undef_list backref for_var %type <nd> block_param opt_block_param block_param_def f_opt %type <nd> bv_decls opt_bv_decl bvar f_larglist lambda_body @@ -2335,17 +2348,19 @@ arg : lhs '=' arg_rhs { $$ = new_if(p, cond($1), $3, $6); } - | defn_head f_arglist_paren '=' arg + | defn_head f_opt_arglist_paren '=' arg { $$ = $1; + endless_method_name(p, $1); void_expr_error(p, $4); defn_setup(p, $$, $2, $4); nvars_unnest(p); p->in_def--; } - | defn_head f_arglist_paren '=' arg modifier_rescue arg + | defn_head f_opt_arglist_paren '=' arg modifier_rescue arg { $$ = $1; + endless_method_name(p, $1); void_expr_error(p, $4); void_expr_error(p, $6); defn_setup(p, $$, $2, new_mod_rescue(p, $4, $6)); @@ -3516,6 +3531,11 @@ superclass : /* term */ } */ ; +f_opt_arglist_paren + : f_arglist_paren + | none + ; + f_arglist_paren : '(' f_args rparen { $$ = $2; |
