diff options
| author | Mustafa Quraish <[email protected]> | 2022-01-31 02:55:50 -0500 |
|---|---|---|
| committer | Mustafa Quraish <[email protected]> | 2022-01-31 02:55:50 -0500 |
| commit | 85bcdbbd053ebc75f1e752fd723fab92a99910ce (patch) | |
| tree | d4fc198339925081ab7f9e6bfb3a59ca092dd2c8 /src/lexer.c | |
| parent | Minor fixes to code generation (diff) | |
| download | cup-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.c | 21 |
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; } |