Commit a18fb01b authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

new API for parser

parent 5d5d189d
...@@ -77,15 +77,20 @@ struct mrb_parser_state { ...@@ -77,15 +77,20 @@ struct mrb_parser_state {
jmp_buf jmp; 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_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(mrb_state*,const char*,size_t);
struct mrb_parser_state* mrb_parse_nstring_ext(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_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_string(mrb_state*,char*);
int mrb_compile_nstring(mrb_state*,char*,size_t); 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);
...@@ -4618,8 +4618,8 @@ yylex(void *lval, parser_state *p) ...@@ -4618,8 +4618,8 @@ yylex(void *lval, parser_state *p)
return t; return t;
} }
static void void
start_parser(parser_state *p) mrb_parser_parse(parser_state *p)
{ {
node *tree; node *tree;
...@@ -4645,8 +4645,8 @@ start_parser(parser_state *p) ...@@ -4645,8 +4645,8 @@ start_parser(parser_state *p)
} }
} }
static parser_state* parser_state*
parser_new(mrb_state *mrb) mrb_parser_new(mrb_state *mrb)
{ {
mrb_pool *pool; mrb_pool *pool;
parser_state *p; parser_state *p;
...@@ -4661,6 +4661,9 @@ parser_new(mrb_state *mrb) ...@@ -4661,6 +4661,9 @@ parser_new(mrb_state *mrb)
p->pool = pool; p->pool = pool;
p->in_def = p->in_single = 0; p->in_def = p->in_single = 0;
p->s = p->send = NULL;
p->f = NULL;
p->cmd_start = TRUE; p->cmd_start = TRUE;
p->in_def = p->in_single = FALSE; p->in_def = p->in_single = FALSE;
...@@ -4674,19 +4677,37 @@ parser_new(mrb_state *mrb) ...@@ -4674,19 +4677,37 @@ parser_new(mrb_state *mrb)
return p; 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* 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; parser_state *p;
p = parser_new(mrb); p = mrb_parser_new(mrb);
if (!p) return 0; if (!p) return 0;
p->s = p->send = NULL; p->s = p->send = NULL;
p->f = f; p->f = f;
if (line) p->lineno = line;
if (fn) mrb_parser_filename(p, fn);
start_parser(p); mrb_parser_parse(p);
return p; return p;
} }
...@@ -4695,13 +4716,11 @@ mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) ...@@ -4695,13 +4716,11 @@ mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len)
{ {
parser_state *p; parser_state *p;
p = parser_new(mrb); p = mrb_parser_new(mrb);
if (!p) return 0; if (!p) return 0;
p->s = s;
p->send = s + len; p->send = s + len;
p->f = NULL;
start_parser(p); mrb_parser_parse(p);
return p; return p;
} }
...@@ -4710,14 +4729,13 @@ mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len) ...@@ -4710,14 +4729,13 @@ mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len)
{ {
parser_state *p; parser_state *p;
p = parser_new(mrb); p = mrb_parser_new(mrb);
if (!p) return 0; if (!p) return 0;
p->s = s; p->s = s;
p->send = s + len; p->send = s + len;
p->f = NULL;
p->capture_errors = 1; p->capture_errors = 1;
start_parser(p); mrb_parser_parse(p);
return p; return p;
} }
...@@ -4732,12 +4750,12 @@ mrb_parse_string(mrb_state *mrb, const char *s) ...@@ -4732,12 +4750,12 @@ mrb_parse_string(mrb_state *mrb, const char *s)
void parser_dump(mrb_state *mrb, node *tree, int offset); void parser_dump(mrb_state *mrb, node *tree, int offset);
int 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; parser_state *p;
int n; int n;
p = mrb_parse_file(mrb, f, fn, line); p = mrb_parse_file(mrb, f);
if (!p) return -1; if (!p) return -1;
if (!p->tree) return -1; if (!p->tree) return -1;
if (p->nerr) return -1; if (p->nerr) return -1;
...@@ -4750,26 +4768,6 @@ mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line) ...@@ -4750,26 +4768,6 @@ mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line)
return n; 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 int
mrb_compile_nstring(mrb_state *mrb, char *s, size_t len) mrb_compile_nstring(mrb_state *mrb, char *s, size_t len)
{ {
......
...@@ -164,7 +164,7 @@ main(int argc, char **argv) ...@@ -164,7 +164,7 @@ main(int argc, char **argv)
return n; return n;
} }
p = mrb_parse_file(mrb, args.rfp, 0, 0); p = mrb_parse_file(mrb, args.rfp);
if (!p || !p->tree || p->nerr) { if (!p || !p->tree || p->nerr) {
cleanup(&args); cleanup(&args);
return -1; return -1;
......
...@@ -152,7 +152,12 @@ main(int argc, char **argv) ...@@ -152,7 +152,12 @@ main(int argc, char **argv)
p = mrb_parse_string(mrb, (char*)args.cmdline); p = mrb_parse_string(mrb, (char*)args.cmdline);
} }
else { 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) { if (!p || !p->tree || p->nerr) {
cleanup(mrb, &args); cleanup(mrb, &args);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment