diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-05-17 23:46:55 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-05-17 23:46:55 +0900 |
| commit | 434ed1ed7c53ecedf78bd471c67d7cb9e9f1dc88 (patch) | |
| tree | 62704e8c182cf41d08b0d2c02fae4c49f36cb264 | |
| parent | 0bae9c505ce291e31dd799e73059be465bd45029 (diff) | |
| download | mruby-434ed1ed7c53ecedf78bd471c67d7cb9e9f1dc88.tar.gz mruby-434ed1ed7c53ecedf78bd471c67d7cb9e9f1dc88.zip | |
compile error should contain line number
| -rw-r--r-- | src/compile.h | 4 | ||||
| -rw-r--r-- | src/parse.y | 35 | ||||
| -rw-r--r-- | tools/mrbc/mrbc.c | 2 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 2 |
4 files changed, 22 insertions, 21 deletions
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 aa0d7a712..fb3526034 100644 --- a/src/parse.y +++ b/src/parse.y @@ -2915,10 +2915,10 @@ yyerror(parser_state *p, const char *s) if (! p->capture_errors) { if (p->filename) { - fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s); + 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, s); + 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])) { @@ -2927,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++; } @@ -3020,18 +3020,9 @@ nextc(parser_state *p) c = *p->s++; } if (c == '\n') { - if (p->column < 0) { - p->column++; // pushback caused an underflow - } - else { - p->lineno++; - p->column = 0; - } // must understand heredoc } - else { - p->column++; - } + p->column++; } return c; } @@ -3395,6 +3386,8 @@ parse_qstring(parser_state *p, int term) c = nextc(p); switch (c) { case '\n': + p->lineno++; + p->column = 0; continue; case '\\': @@ -3462,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: @@ -4249,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 */ } @@ -4678,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; @@ -4686,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; @@ -4733,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; @@ -4766,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 df69c62c2..427f62276 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -151,7 +151,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); |
