Started lexer
This commit is contained in:
parent
7c6fdfd40b
commit
c7e2eb8c34
|
|
@ -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);
|
||||
Loading…
Reference in New Issue