From c7e2eb8c34f9514503ced1d98d8a1cb13be793af Mon Sep 17 00:00:00 2001 From: Kyler Date: Sun, 2 Nov 2025 22:13:19 -0700 Subject: [PATCH] Started lexer --- SLS_C/src/lexer.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 SLS_C/src/lexer.c diff --git a/SLS_C/src/lexer.c b/SLS_C/src/lexer.c new file mode 100644 index 0000000..f917f1b --- /dev/null +++ b/SLS_C/src/lexer.c @@ -0,0 +1,73 @@ +// Kyler Olsen +// YREA SLS +// Lexer +// November 2025 + +#include +#include +#include + +#include "sls/sls_errors.h" +#include "sls/lexer.h" + +void init_lexer(LexerInfo *lexer_info, const char *filename, const char *source_code) { + lexer_info->filename = filename; + lexer_info->source_code = source_code; + lexer_info->pos = 0; + lexer_info->column = 1; + lexer_info->line = 1; +} + +static FileInfo get_file_info(LexerInfo *lexer_info, size_t start, size_t start_line) { + return (FileInfo){ + .filename = lexer_info->filename, + .line = lexer_info->line, + .column = lexer_info->column, + .length = lexer_info->pos - start, + .lines = lexer_info->line - start_line + }; +} + +static char peek(LexerInfo *lexer_info) { + return lexer_info->source_code[lexer_info->pos]; +} + +static char far_peek(LexerInfo *lexer_info, size_t index) { + return lexer_info->source_code[lexer_info->pos + index]; +} + +static void advance(LexerInfo *lexer_info) { + if (lexer_info->source_code[lexer_info->pos] == '\n') { + lexer_info->line++; + lexer_info->column = 1; + } else { + lexer_info->column++; + } + lexer_info->source_code[lexer_info->pos++]; +} + +static LexerResult lexer_result(LexerInfo *lexer_info, Token token, size_t start, size_t start_line) { + LexerTokenResult *result = (LexerTokenResult *)malloc(sizeof(LexerTokenResult)); + if (result == NULL) + return (LexerResult){SLS_ERROR, .error = (SlsError){"Failed to allocate memory.", 1}}; + result->type = SLS_RESULT; + result->result = token; + result->file_info = get_file_info(lexer_info, start, start_line); + result->next = NULL; + return (LexerResult){SLS_RESULT, .result = result}; +} + +static LexerResult lexer_error(LexerInfo *lexer, const char* message, size_t start, size_t start_line) { + LexerTokenResult *result = (LexerTokenResult *)malloc(sizeof(LexerTokenResult)); + if (result == NULL) + return (LexerResult){SLS_ERROR, .error = (SlsError){"Failed to allocate memory.", 1}}; + result->type = SLS_ERROR; + result->error.message = message; + result->error.code = 1; + result->file_info = get_file_info(lexer, start, start_line); + result->next = NULL; + return (LexerResult){SLS_RESULT, .result = result}; +} + +LexerResult lexical_analysis(LexerInfo *lexer_info); +void clean_token_result(LexerTokenResult *head);