aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.c
diff options
context:
space:
mode:
authorMustafa Quraish <[email protected]>2022-01-31 02:55:50 -0500
committerMustafa Quraish <[email protected]>2022-01-31 02:55:50 -0500
commit85bcdbbd053ebc75f1e752fd723fab92a99910ce (patch)
treed4fc198339925081ab7f9e6bfb3a59ca092dd2c8 /src/lexer.c
parentMinor fixes to code generation (diff)
downloadcup-85bcdbbd053ebc75f1e752fd723fab92a99910ce.tar.xz
cup-85bcdbbd053ebc75f1e752fd723fab92a99910ce.zip
Add ability to import other files
This still requires a lot of work to avoid duplicate imports, and handle cyclic imports, but it is a good enough for small examples which just want to include some common definitions from std/
Diffstat (limited to 'src/lexer.c')
-rw-r--r--src/lexer.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/lexer.c b/src/lexer.c
index 524e87f..af5a14c 100644
--- a/src/lexer.c
+++ b/src/lexer.c
@@ -14,6 +14,25 @@ Lexer *Lexer_new(char *filename, char *src, i64 len)
return self;
}
+Lexer *Lexer_new_open_file(char *filename)
+{
+ FILE *fp = fopen(filename, "r");
+ fseek(fp, 0, SEEK_END);
+ i64 source_len = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+ char *source = malloc(source_len + 1);
+ fread(source, source_len, 1, fp);
+ source[source_len] = 0;
+ fclose(fp);
+
+ Lexer *self = calloc(1, sizeof(Lexer));
+ self->filename = filename;
+ self->src = source;
+ self->len = source_len;
+
+ return self;
+}
+
static Location Lexer_loc(Lexer *lexer)
{
Location loc = {0};
@@ -201,7 +220,7 @@ Token Lexer_next(Lexer *lexer)
// Careful with indexing here, because we want to skip opening and closing quotes
char *str = calloc(pos - lexer->pos, 1);
strncpy(str, lexer->src + lexer->pos + 1, pos - lexer->pos - 1);
- Token token = Token_from_identifier(str, Lexer_loc(lexer));
+ Token token = Token_from_string(str, Lexer_loc(lexer));
advance(lexer, pos - lexer->pos + 1);
return token;
}