Started lexer

This commit is contained in:
Kyler Olsen 2025-11-02 22:13:19 -07:00
parent 7c6fdfd40b
commit c7e2eb8c34
1 changed files with 73 additions and 0 deletions

73
SLS_C/src/lexer.c Normal file
View File

@ -0,0 +1,73 @@
// Kyler Olsen
// YREA SLS
// Lexer
// November 2025
#include <ctype.h>
#include <string.h>
#include <stdint.h>
#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);