summaryrefslogtreecommitdiffhomepage
path: root/src/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.y')
-rw-r--r--src/parse.y98
1 files changed, 42 insertions, 56 deletions
diff --git a/src/parse.y b/src/parse.y
index fb3526034..41363b49e 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -14,7 +14,7 @@
#include "mruby.h"
#include "st.h"
-#include "compile.h"
+#include "mruby/compile.h"
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
@@ -967,12 +967,11 @@ var_reference(parser_state *p, node *lhs)
%%
program : {
p->lstate = EXPR_BEG;
- local_nest(p);
+ if (!p->locals) p->locals = cons(0,0);
}
top_compstmt
{
p->tree = new_scope(p, $2);
- local_unnest(p);
}
;
@@ -2955,9 +2954,9 @@ yywarn(parser_state *p, const char *s)
n = strlen(s);
c = parser_palloc(p, n + 1);
memcpy(c, s, n + 1);
- p->error_buffer[p->nwarn].message = c;
- p->error_buffer[p->nwarn].lineno = p->lineno;
- p->error_buffer[p->nwarn].column = p->column;
+ p->warn_buffer[p->nwarn].message = c;
+ p->warn_buffer[p->nwarn].lineno = p->lineno;
+ p->warn_buffer[p->nwarn].column = p->column;
}
p->nwarn++;
}
@@ -4618,8 +4617,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;
@@ -4631,6 +4630,9 @@ start_parser(parser_state *p)
}
yyparse(p);
tree = p->tree;
+ if ((int)tree->car == NODE_SCOPE) {
+ p->locals = cons(tree->cdr->car, 0);
+ }
if (!tree) {
if (p->begin_tree) {
tree = p->begin_tree;
@@ -4645,8 +4647,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 +4663,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,50 +4679,51 @@ parser_new(mrb_state *mrb)
return p;
}
-parser_state*
-mrb_parse_file(mrb_state *mrb, FILE *f, const char *fn, int line)
+const char*
+mrb_parser_filename(parser_state *p, const char *s)
{
- 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);
+ if (s) {
+ p->filename = strdup(s);
+ }
+ return p->filename;
+}
- start_parser(p);
- return p;
+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_nstring(mrb_state *mrb, const char *s, size_t len)
+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 = s;
- p->send = s + len;
- p->f = NULL;
+ p->s = p->send = NULL;
+ p->f = f;
- start_parser(p);
+ mrb_parser_parse(p);
return p;
}
parser_state*
-mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len)
+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;
- p->capture_errors = 1;
- start_parser(p);
+ mrb_parser_parse(p);
return p;
}
@@ -4732,12 +4738,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 +4756,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)
{