From 7ccae1c362a45b28f4fbf96da4f479730e4b382b Mon Sep 17 00:00:00 2001 From: Elis Eriksson Date: Sat, 13 Jun 2026 17:40:25 +0200 Subject: Initial Commit, probably needs heavy code cleanup --- src/lexer.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/lexer.c (limited to 'src/lexer.c') diff --git a/src/lexer.c b/src/lexer.c new file mode 100644 index 0000000..4f1fcd0 --- /dev/null +++ b/src/lexer.c @@ -0,0 +1,72 @@ +#include "all.h" +#include "ivec.h" +#include +#include +#include +#include + +lexer_t lex_init(str *src) { + lexer_t lx = {0}; + + lx.src = src; + lx.pos = 0; + lx.tokens = (ivec){0}; + + return lx; +} + +void lex_run(lexer_t *lx) { + for (size_t i = 0; i < lx->src->length; i++) { + + char c = lx->src->data[i]; + lex_tok_e tok; + + switch (c) { + case '+': + tok = LEX_PINC; + break; + case '-': + tok = LEX_PDEC; + break; + case '>': + tok = LEX_VINC; + break; + case '<': + tok = LEX_VDEC; + break; + case '.': + tok = LEX_OUT; + break; + case ',': + tok = LEX_IN; + break; + case '[': + tok = LEX_LB; + break; + case ']': + tok = LEX_RB; + break; + default: + continue; + } + + iv_push(&lx->tokens, tok); + } + + iv_push(&lx->tokens, LEX_EOF); +} + +void lex_free(lexer_t *lx) { + if (!lx) + return; + + iv_free(&lx->tokens); + + if (lx->src) { + free(lx->src->data); + free(lx->src); + } + + lx->src = NULL; + lx->pos = 0; +} -- cgit v1.3-7-ge9ab