diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-10-08 18:49:09 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-12-09 20:50:41 +0900 |
| commit | 0011652a2875de7ea6979e16417514098fb71d89 (patch) | |
| tree | 20ddc3e404303bcfa49c49bff4bb3cd1e4920618 /mrbgems/mruby-compiler | |
| parent | 72d57ad094b8e1c529e2e8b41d895fc6f212e31e (diff) | |
| download | mruby-0011652a2875de7ea6979e16417514098fb71d89.tar.gz mruby-0011652a2875de7ea6979e16417514098fb71d89.zip | |
Support new numbered parameter syntax `_1` instead of `@1`.
Diffstat (limited to 'mrbgems/mruby-compiler')
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index cdb239645..061bbd58a 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -74,7 +74,7 @@ typedef unsigned int stack_type; #define NUM_SUFFIX_R (1<<0) #define NUM_SUFFIX_I (1<<1) -#define NUMPARAM_MAX 31 +#define NUMPARAM_MAX 9 static inline mrb_sym intern_cstr_gen(parser_state *p, const char *s) @@ -845,7 +845,6 @@ setup_args(parser_state *p, node *a) int nvars = intn(p->nvars->cdr); if (nvars > 0) { int i; - char buf[5]; mrb_sym sym; // m || opt || rest || tail if (a && (a->car || (a->cdr && a->cdr->car) || (a->cdr->cdr && a->cdr->cdr->car) || (a->cdr->cdr->cdr->cdr && a->cdr->cdr->cdr->cdr->car))) { @@ -853,7 +852,11 @@ setup_args(parser_state *p, node *a) } else { node* args = 0; for (i = nvars; i > 0; i--) { - sprintf(buf, "@%d", i); + char buf[3]; + + buf[0] = '_'; + buf[1] = i+'0'; + buf[3] = '\0'; sym = intern_cstr(buf); args = cons(new_arg(p, sym), args); p->locals->car = cons(nsym(sym), p->locals->car); @@ -2395,6 +2398,10 @@ primary : literal | heredoc | var_ref | backref + | tNUMPARAM + { + $$ = new_nvar(p, $1); + } | tFID { $$ = new_fcall(p, $1, 0); @@ -3265,10 +3272,6 @@ variable : tIDENTIFIER { $$ = new_cvar(p, $1); } - | tNUMPARAM - { - $$ = new_nvar(p, $1); - } | tCONSTANT { $$ = new_const(p, $1); @@ -5875,36 +5878,14 @@ parser_yylex(parser_state *p) } else if (ISDIGIT(c)) { if (p->tidx == 1) { - if (last_state == EXPR_FNAME) { - yyerror_c(p, "wrong instance variable name: @", c); - return 0; - } - if (c == '0') { - yyerror(p, "leading zero is not allowed as a numbered parameter"); - return 0; - } - do { - tokadd(p, c); - c = nextc(p); - } while (c >= 0 && ISDIGIT(c)); - pushback(p, c); - tokfix(p); - { - unsigned long n = strtoul(tok(p) + 1, NULL, 10); - if (n > NUMPARAM_MAX || n < 0) { - yyerror(p, "too large numbered parameter"); - return 0; - } - pylval.num = n; - } - p->lstate = EXPR_END; - return tNUMPARAM; + yyerror_c(p, "wrong instance variable name: @", c); } else { yyerror_c(p, "wrong class variable name: @@", c); - return 0; } - } else if (!identchar(c)) { + return 0; + } + if (!identchar(c)) { pushback(p, c); return '@'; } @@ -5912,6 +5893,30 @@ parser_yylex(parser_state *p) case '_': token_column = newtok(p); + tokadd(p, c); + c = nextc(p); + if (ISDIGIT(c)) { + int n = 0; + + while (c >= 0 && ISDIGIT(c)) { + n *= 10; + n += c - '0'; + tokadd(p, c); + c = nextc(p); + } + pushback(p, c); + if (n == 0) { + yyerror(p, "_0 is not available"); + return 0; + } + if (n > NUMPARAM_MAX || n < 0) { + yyerror(p, "too large numbered parameter"); + return 0; + } + pylval.num = n; + p->lstate = EXPR_END; + return tNUMPARAM; + } break; default: |
