diff options
Diffstat (limited to 'src/parse.y')
| -rw-r--r-- | src/parse.y | 98 |
1 files changed, 42 insertions, 56 deletions
diff --git a/src/parse.y b/src/parse.y index fb3526034..41363b49e 100644 --- a/src/parse.y +++ b/src/parse.y @@ -14,7 +14,7 @@ #include "mruby.h" #include "st.h" -#include "compile.h" +#include "mruby/compile.h" #include <stdio.h> #include <errno.h> #include <ctype.h> @@ -967,12 +967,11 @@ var_reference(parser_state *p, node *lhs) %% program : { p->lstate = EXPR_BEG; - local_nest(p); + if (!p->locals) p->locals = cons(0,0); } top_compstmt { p->tree = new_scope(p, $2); - local_unnest(p); } ; @@ -2955,9 +2954,9 @@ yywarn(parser_state *p, const char *s) n = strlen(s); c = parser_palloc(p, n + 1); memcpy(c, s, n + 1); - p->error_buffer[p->nwarn].message = c; - p->error_buffer[p->nwarn].lineno = p->lineno; - p->error_buffer[p->nwarn].column = p->column; + p->warn_buffer[p->nwarn].message = c; + p->warn_buffer[p->nwarn].lineno = p->lineno; + p->warn_buffer[p->nwarn].column = p->column; } p->nwarn++; } @@ -4618,8 +4617,8 @@ yylex(void *lval, parser_state *p) return t; } -static void -start_parser(parser_state *p) +void +mrb_parser_parse(parser_state *p) { node *tree; @@ -4631,6 +4630,9 @@ start_parser(parser_state *p) } yyparse(p); tree = p->tree; + if ((int)tree->car == NODE_SCOPE) { + p->locals = cons(tree->cdr->car, 0); + } if (!tree) { if (p->begin_tree) { tree = p->begin_tree; @@ -4645,8 +4647,8 @@ start_parser(parser_state *p) } } -static parser_state* -parser_new(mrb_state *mrb) +parser_state* +mrb_parser_new(mrb_state *mrb) { mrb_pool *pool; parser_state *p; @@ -4661,6 +4663,9 @@ parser_new(mrb_state *mrb) p->pool = pool; p->in_def = p->in_single = 0; + p->s = p->send = NULL; + p->f = NULL; + p->cmd_start = TRUE; p->in_def = p->in_single = FALSE; @@ -4674,50 +4679,51 @@ parser_new(mrb_state *mrb) return p; } -parser_state* -mrb_parse_file(mrb_state *mrb, FILE *f, const char *fn, int line) +const char* +mrb_parser_filename(parser_state *p, const char *s) { - parser_state *p; - - p = parser_new(mrb); - if (!p) return 0; - p->s = p->send = NULL; - p->f = f; - if (line) p->lineno = line; - if (fn) mrb_parser_filename(p, fn); + if (s) { + p->filename = strdup(s); + } + return p->filename; +} - start_parser(p); - return p; +int +mrb_parser_lineno(struct mrb_parser_state *p, int n) +{ + if (n <= 0) { + return p->lineno; + } + p->column = 0; + p->lineno = n; + return n; } parser_state* -mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) +mrb_parse_file(mrb_state *mrb, FILE *f) { parser_state *p; - - p = parser_new(mrb); + + p = mrb_parser_new(mrb); if (!p) return 0; - p->s = s; - p->send = s + len; - p->f = NULL; + p->s = p->send = NULL; + p->f = f; - start_parser(p); + mrb_parser_parse(p); return p; } parser_state* -mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len) +mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) { parser_state *p; - p = parser_new(mrb); + p = mrb_parser_new(mrb); if (!p) return 0; p->s = s; p->send = s + len; - p->f = NULL; - p->capture_errors = 1; - start_parser(p); + mrb_parser_parse(p); return p; } @@ -4732,12 +4738,12 @@ mrb_parse_string(mrb_state *mrb, const char *s) void parser_dump(mrb_state *mrb, node *tree, int offset); int -mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line) +mrb_compile_file(mrb_state * mrb, FILE *f) { parser_state *p; int n; - p = mrb_parse_file(mrb, f, fn, line); + p = mrb_parse_file(mrb, f); if (!p) return -1; if (!p->tree) return -1; if (p->nerr) return -1; @@ -4750,26 +4756,6 @@ mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line) return n; } -const char* -mrb_parser_filename(parser_state *p, const char *s) -{ - if (s) { - p->filename = strdup(s); - } - return p->filename; -} - -int -mrb_parser_lineno(struct mrb_parser_state *p, int n) -{ - if (n <= 0) { - return p->lineno; - } - p->column = 0; - p->lineno = n; - return n; -} - int mrb_compile_nstring(mrb_state *mrb, char *s, size_t len) { |
