diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-05-18 11:03:43 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-05-18 11:03:43 +0900 |
| commit | a18fb01b03a837a30d16e229d99d547b82505de2 (patch) | |
| tree | 82ce29bba7a92efb41e9a09c2161b12efcb8eaf1 | |
| parent | 5d5d189dee7cd28e9811cef460b3c7ffc1da315d (diff) | |
| download | mruby-a18fb01b03a837a30d16e229d99d547b82505de2.tar.gz mruby-a18fb01b03a837a30d16e229d99d547b82505de2.zip | |
new API for parser
| -rw-r--r-- | src/compile.h | 13 | ||||
| -rw-r--r-- | src/parse.y | 74 | ||||
| -rw-r--r-- | tools/mrbc/mrbc.c | 2 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 7 |
4 files changed, 52 insertions, 44 deletions
diff --git a/src/compile.h b/src/compile.h index ba1dfd2ee..ca3e255c8 100644 --- a/src/compile.h +++ b/src/compile.h @@ -77,15 +77,20 @@ struct mrb_parser_state { jmp_buf jmp; }; -struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,const char*,int); +/* parser structure */ +struct mrb_parser_state* mrb_parser_new(mrb_state*); +const char *mrb_parser_filename(struct mrb_parser_state*, const char*); +int mrb_parser_lineno(struct mrb_parser_state*, int); +void mrb_parser_parse(struct mrb_parser_state*); + +/* utility functions */ +struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*); struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*); struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t); struct mrb_parser_state* mrb_parse_nstring_ext(mrb_state*,const char*,size_t); int mrb_generate_code(mrb_state*, mrb_ast_node*); -int mrb_compile_file(mrb_state*,FILE*,const char*,int); +int mrb_compile_file(mrb_state*,FILE*); int mrb_compile_string(mrb_state*,char*); int mrb_compile_nstring(mrb_state*,char*,size_t); -const char *mrb_parser_filename(struct mrb_parser_state *p, const char *s); -int mrb_parser_lineno(struct mrb_parser_state *p, int n); diff --git a/src/parse.y b/src/parse.y index fb3526034..ec04ae8a6 100644 --- a/src/parse.y +++ b/src/parse.y @@ -4618,8 +4618,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; @@ -4645,8 +4645,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 +4661,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,19 +4677,37 @@ parser_new(mrb_state *mrb) return p; } +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; +} + parser_state* -mrb_parse_file(mrb_state *mrb, FILE *f, const char *fn, int line) +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 = p->send = NULL; p->f = f; - if (line) p->lineno = line; - if (fn) mrb_parser_filename(p, fn); - start_parser(p); + mrb_parser_parse(p); return p; } @@ -4695,13 +4716,11 @@ 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; - start_parser(p); + mrb_parser_parse(p); return p; } @@ -4710,14 +4729,13 @@ mrb_parse_nstring_ext(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 +4750,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 +4768,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) { diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 1f74defdf..f9d9cea28 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -164,7 +164,7 @@ main(int argc, char **argv) return n; } - p = mrb_parse_file(mrb, args.rfp, 0, 0); + p = mrb_parse_file(mrb, args.rfp); if (!p || !p->tree || p->nerr) { cleanup(&args); return -1; diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index f59cbcace..6da721a36 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -152,7 +152,12 @@ main(int argc, char **argv) p = mrb_parse_string(mrb, (char*)args.cmdline); } else { - p = mrb_parse_file(mrb, args.rfp, argv[1], 0); + p = mrb_parser_new(mrb); + if (p) { + mrb_parser_filename(p, argv[1]); + p->f = args.rfp; + mrb_parser_parse(p); + } } if (!p || !p->tree || p->nerr) { cleanup(mrb, &args); |
