diff options
| -rw-r--r-- | mrblib/Makefile | 2 | ||||
| -rw-r--r-- | src/compile.h | 4 | ||||
| -rw-r--r-- | src/parse.y | 57 | ||||
| -rw-r--r-- | tools/mrbc/mrbc.c | 2 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 2 |
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); |
