Commit a18fb01b authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

new API for parser

parent 5d5d189d
......@@ -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);
......@@ -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)
{
......
......@@ -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;
......
......@@ -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);
......
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