summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-05-18 11:03:43 +0900
committerYukihiro Matsumoto <[email protected]>2012-05-18 11:03:43 +0900
commita18fb01b03a837a30d16e229d99d547b82505de2 (patch)
tree82ce29bba7a92efb41e9a09c2161b12efcb8eaf1
parent5d5d189dee7cd28e9811cef460b3c7ffc1da315d (diff)
downloadmruby-a18fb01b03a837a30d16e229d99d547b82505de2.tar.gz
mruby-a18fb01b03a837a30d16e229d99d547b82505de2.zip
new API for parser
-rw-r--r--src/compile.h13
-rw-r--r--src/parse.y74
-rw-r--r--tools/mrbc/mrbc.c2
-rw-r--r--tools/mruby/mruby.c7
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);