diff options
Diffstat (limited to 'src/lex.c')
-rw-r--r-- | src/lex.c | 22 |
1 files changed, 21 insertions, 1 deletions
@@ -46,7 +46,7 @@ const char *tokens[] = { }; void -lex_init(struct lexer *lexer, FILE *f) +lex_init(struct lexer *lexer, FILE *f, const char *filename) { lexer->in = f; lexer->c[0] = 0; @@ -55,6 +55,9 @@ lex_init(struct lexer *lexer, FILE *f) lexer->bufsz = 2; lexer->buflen = 0; lexer->un.token = T_NONE; + lexer->loc.file = filename; + lexer->loc.line = 1; + lexer->loc.column = 0; } void @@ -63,6 +66,15 @@ lex_finish(struct lexer *lexer) fclose(lexer->in); } +struct location +lex_loc(struct lexer *lexer) +{ + if (lexer->un.token != T_NONE) { + return lexer->un.loc; + } + return lexer->loc; +} + static uint32_t next(struct lexer *lexer) { if (lexer->c[0]) { @@ -75,6 +87,13 @@ static uint32_t next(struct lexer *lexer) return c; } + if (c == '\n') { + ++lexer->loc.line; + lexer->loc.column = 0; + } else { + ++lexer->loc.column; + } + lexer->c[1] = c; return c; } @@ -240,6 +259,7 @@ lex(struct lexer *lexer, struct token *out) } uint32_t c = wgetc(lexer); + out->loc = lexer->loc; if (c == C_EOF) { out->token = T_EOF; return out->token; |