summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrblib/Makefile2
-rw-r--r--src/compile.h4
-rw-r--r--src/parse.y57
-rw-r--r--tools/mrbc/mrbc.c2
-rw-r--r--tools/mruby/mruby.c2
5 files changed, 37 insertions, 30 deletions
diff --git a/mrblib/Makefile b/mrblib/Makefile
index a91f4ce24..d22c4509f 100644
--- a/mrblib/Makefile
+++ b/mrblib/Makefile
@@ -47,7 +47,7 @@ endif
all : $(LIBR)
# update libmruby.a
-$(LIBR) : $(MLIB)
+$(LIBR) : $(MLIB) $(LIBR0)
cp $(LIBR0) $(LIBR)
$(AR) r $(LIBR) $(MLIB)
diff --git a/src/compile.h b/src/compile.h
index 19894f3aa..ba1dfd2ee 100644
--- a/src/compile.h
+++ b/src/compile.h
@@ -77,13 +77,13 @@ struct mrb_parser_state {
jmp_buf jmp;
};
-struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*);
+struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,const char*,int);
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*);
+int mrb_compile_file(mrb_state*,FILE*,const char*,int);
int mrb_compile_string(mrb_state*,char*);
int mrb_compile_nstring(mrb_state*,char*,size_t);
diff --git a/src/parse.y b/src/parse.y
index d80fce87a..fb3526034 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -2914,8 +2914,12 @@ yyerror(parser_state *p, const char *s)
size_t n;
if (! p->capture_errors) {
- fputs(s, stderr);
- fputs("\n", stderr);
+ if (p->filename) {
+ fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column+1, s);
+ }
+ else {
+ fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column+1, s);
+ }
}
else if (p->nerr < sizeof(p->error_buffer) / sizeof(p->error_buffer[0])) {
n = strlen(s);
@@ -2923,7 +2927,7 @@ yyerror(parser_state *p, const char *s)
memcpy(c, s, n + 1);
p->error_buffer[p->nerr].message = c;
p->error_buffer[p->nerr].lineno = p->lineno;
- p->error_buffer[p->nerr].column = p->column;
+ p->error_buffer[p->nerr].column = p->column+1;
}
p->nerr++;
}
@@ -3003,28 +3007,21 @@ nextc(parser_state *p)
p->pb = p->pb->cdr;
cons_free(tmp);
}
- else if (p->f) {
- if (feof(p->f)) return -1;
- c = fgetc(p->f);
- if (c == EOF) return -1;
- }
- else if (!p->s || p->s >= p->send) {
- return -1;
- }
else {
- c = *p->s++;
- }
- if (c == '\n') {
- if (p->column < 0) {
- p->column++; // pushback caused an underflow
+ if (p->f) {
+ if (feof(p->f)) return -1;
+ c = fgetc(p->f);
+ if (c == EOF) return -1;
+ }
+ else if (!p->s || p->s >= p->send) {
+ return -1;
}
else {
- p->lineno++;
- p->column = 0;
+ c = *p->s++;
+ }
+ if (c == '\n') {
+ // must understand heredoc
}
- // must understand heredoc
- }
- else {
p->column++;
}
return c;
@@ -3389,6 +3386,8 @@ parse_qstring(parser_state *p, int term)
c = nextc(p);
switch (c) {
case '\n':
+ p->lineno++;
+ p->column = 0;
continue;
case '\\':
@@ -3456,6 +3455,8 @@ parser_yylex(parser_state *p)
skip(p, '\n');
/* fall through */
case '\n':
+ p->lineno++;
+ p->column = 0;
switch (p->lstate) {
case EXPR_BEG:
case EXPR_FNAME:
@@ -4243,6 +4244,8 @@ parser_yylex(parser_state *p)
case '\\':
c = nextc(p);
if (c == '\n') {
+ p->lineno++;
+ p->column = 0;
space_seen = 1;
goto retry; /* skip \\n */
}
@@ -4672,7 +4675,7 @@ parser_new(mrb_state *mrb)
}
parser_state*
-mrb_parse_file(mrb_state *mrb, FILE *f)
+mrb_parse_file(mrb_state *mrb, FILE *f, const char *fn, int line)
{
parser_state *p;
@@ -4680,6 +4683,8 @@ mrb_parse_file(mrb_state *mrb, FILE *f)
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;
@@ -4727,12 +4732,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)
+mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line)
{
parser_state *p;
int n;
- p = mrb_parse_file(mrb, f);
+ p = mrb_parse_file(mrb, f, fn, line);
if (!p) return -1;
if (!p->tree) return -1;
if (p->nerr) return -1;
@@ -4760,7 +4765,9 @@ mrb_parser_lineno(struct mrb_parser_state *p, int n)
if (n <= 0) {
return p->lineno;
}
- return p->lineno = n;
+ p->column = 0;
+ p->lineno = n;
+ return n;
}
int
diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c
index f9d9cea28..1f74defdf 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);
+ p = mrb_parse_file(mrb, args.rfp, 0, 0);
if (!p || !p->tree || p->nerr) {
cleanup(&args);
return -1;
diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c
index 5de161def..f59cbcace 100644
--- a/tools/mruby/mruby.c
+++ b/tools/mruby/mruby.c
@@ -152,7 +152,7 @@ main(int argc, char **argv)
p = mrb_parse_string(mrb, (char*)args.cmdline);
}
else {
- p = mrb_parse_file(mrb, args.rfp);
+ p = mrb_parse_file(mrb, args.rfp, argv[1], 0);
}
if (!p || !p->tree || p->nerr) {
cleanup(mrb, &args);