add lex.h and lex.c except next_token

This commit is contained in:
2025-11-10 18:02:41 +09:00
parent 62b7024734
commit 171006117e
3 changed files with 127 additions and 5 deletions

View File

@@ -0,0 +1,78 @@
#include "lex.h"
Lexer *new_lexer() {
Lexer *lexer = malloc(sizeof(Lexer));
lexer->linepos = 0;
lexer->lineno = 0;
lexer->source = NULL;
lexer->flag_EOF = 0;
lexer->buffer = calloc(LEX_BUF_SIZE, sizeof(char));
lexer->curr = lexer->buffer;
lexer->buffer[0] = '\0';
}
void lexer_set_source(Lexer *lexer, FILE *source) {
lexer->lineno = 0;
lexer->linepos = 0;
lexer->source = source;
}
void lexer_fill_buffer(Lexer *lexer) {
if (lexer->flag_EOF) {
return;
}
size_t bytes_read;
if (*lexer->curr == 0) {
bytes_read = fread(lexer->buffer, sizeof(char), LEX_BUF_SIZE, lexer->source);
if (bytes_read < LEX_BUF_SIZE) {
lexer->flag_EOF = 1;
lexer->buffer[bytes_read] = '\0';
}
lexer->bytes_in_buffer = bytes_read;
} else {
char tmp = lexer->buffer[LEX_BUF_SIZE - 1];
bytes_read = fread(lexer->buffer, sizeof(char), LEX_BUF_SIZE - 1, lexer->source + 1);
lexer->buffer[0] = tmp;
if (bytes_read < LEX_BUF_SIZE - 1) {
lexer->flag_EOF = 1;
lexer->buffer[1 + bytes_read] = '\0';
}
lexer->bytes_in_buffer = bytes_read + 1;
}
lexer->curr = lexer->buffer;
}
void lexer_consume(Lexer *lexer) {
size_t read = lexer->curr - lexer->buffer;
if (read >= lexer->bytes_in_buffer) {
return;
}
if (read == LEX_BUF_SIZE - 2) {
lexer_fill_buffer(lexer);
} else {
lexer->curr++;
}
}
char lexer_curr(Lexer *lexer) {
return *(lexer->curr);
}
char lexer_peek(Lexer *lexer) {
return *(lexer->curr + 1);
}
Token lexer_next_token(Lexer *lexer) {
// TODO: implement
}
void free_lexer(Lexer *lexer) {
free(lexer->buffer);
free(lexer);
}