diff options
Diffstat (limited to 'src/parse.y')
| -rw-r--r-- | src/parse.y | 57 |
1 files changed, 32 insertions, 25 deletions
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 |
