aboutsummaryrefslogtreecommitdiff
path: root/src/lex.c
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-09-19 21:59:35 +0200
committerHimbeer <himbeer@disroot.org>2024-09-19 22:09:49 +0200
commit68effb746fc33f90b6fe537893f18ac0aac4e7f0 (patch)
tree9906b31bd5866014cf9c74fbd7ee6c40faeb048a /src/lex.c
parenta278c311ee4a76c5855d4a8339c15c054a6eca19 (diff)
Store token locations and include them in parsing error messages
Diffstat (limited to 'src/lex.c')
-rw-r--r--src/lex.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/lex.c b/src/lex.c
index 69a92a7..e616160 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -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;