From a18fb01b03a837a30d16e229d99d547b82505de2 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 18 May 2012 11:03:43 +0900 Subject: [PATCH] new API for parser --- src/compile.h | 13 ++-- src/parse.y | 158 ++++++++++++++++++++++---------------------- tools/mrbc/mrbc.c | 2 +- tools/mruby/mruby.c | 7 +- 4 files changed, 94 insertions(+), 86 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,82 +4677,6 @@ parser_new(mrb_state *mrb) return p; } -parser_state* -mrb_parse_file(mrb_state *mrb, FILE *f, const char *fn, int line) -{ - 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); - - start_parser(p); - return p; -} - -parser_state* -mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) -{ - parser_state *p; - - p = parser_new(mrb); - if (!p) return 0; - p->s = s; - p->send = s + len; - p->f = NULL; - - start_parser(p); - return p; -} - -parser_state* -mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len) -{ - parser_state *p; - - p = parser_new(mrb); - if (!p) return 0; - p->s = s; - p->send = s + len; - p->f = NULL; - p->capture_errors = 1; - - start_parser(p); - return p; -} - -parser_state* -mrb_parse_string(mrb_state *mrb, const char *s) -{ - return mrb_parse_nstring(mrb, s, strlen(s)); -} - -#define PARSER_DUMP - -void parser_dump(mrb_state *mrb, node *tree, int offset); - -int -mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line) -{ - parser_state *p; - int n; - - p = mrb_parse_file(mrb, f, fn, line); - if (!p) return -1; - if (!p->tree) return -1; - if (p->nerr) return -1; -#ifdef PARSER_DUMP - parser_dump(mrb, p->tree, 0); -#endif - n = mrb_generate_code(mrb, p->tree); - mrb_pool_close(p->pool); - - return n; -} - const char* mrb_parser_filename(parser_state *p, const char *s) { @@ -4770,6 +4697,77 @@ mrb_parser_lineno(struct mrb_parser_state *p, int n) return n; } +parser_state* +mrb_parse_file(mrb_state *mrb, FILE *f) +{ + parser_state *p; + + p = mrb_parser_new(mrb); + if (!p) return 0; + p->s = p->send = NULL; + p->f = f; + + mrb_parser_parse(p); + return p; +} + +parser_state* +mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) +{ + parser_state *p; + + p = mrb_parser_new(mrb); + if (!p) return 0; + p->send = s + len; + + mrb_parser_parse(p); + return p; +} + +parser_state* +mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len) +{ + parser_state *p; + + p = mrb_parser_new(mrb); + if (!p) return 0; + p->s = s; + p->send = s + len; + p->capture_errors = 1; + + mrb_parser_parse(p); + return p; +} + +parser_state* +mrb_parse_string(mrb_state *mrb, const char *s) +{ + return mrb_parse_nstring(mrb, s, strlen(s)); +} + +#define PARSER_DUMP + +void parser_dump(mrb_state *mrb, node *tree, int offset); + +int +mrb_compile_file(mrb_state * mrb, FILE *f) +{ + parser_state *p; + int n; + + p = mrb_parse_file(mrb, f); + if (!p) return -1; + if (!p->tree) return -1; + if (p->nerr) return -1; +#ifdef PARSER_DUMP + parser_dump(mrb, p->tree, 0); +#endif + n = mrb_generate_code(mrb, p->tree); + mrb_pool_close(p->pool); + + 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);