diff options
| author | Elis Eriksson <spelis@spelis.li> | 2026-06-13 17:40:25 +0200 |
|---|---|---|
| committer | Elis Eriksson <spelis@spelis.li> | 2026-06-13 17:40:25 +0200 |
| commit | 7ccae1c362a45b28f4fbf96da4f479730e4b382b (patch) | |
| tree | f59ba4d76221590901784464a03a6a871d774305 /src/lexer.c | |
| download | bfc-7ccae1c362a45b28f4fbf96da4f479730e4b382b.tar bfc-7ccae1c362a45b28f4fbf96da4f479730e4b382b.tar.gz bfc-7ccae1c362a45b28f4fbf96da4f479730e4b382b.tar.bz2 bfc-7ccae1c362a45b28f4fbf96da4f479730e4b382b.tar.lz bfc-7ccae1c362a45b28f4fbf96da4f479730e4b382b.tar.xz bfc-7ccae1c362a45b28f4fbf96da4f479730e4b382b.tar.zst bfc-7ccae1c362a45b28f4fbf96da4f479730e4b382b.zip | |
Initial Commit, probably needs heavy code cleanup
Diffstat (limited to 'src/lexer.c')
| -rw-r--r-- | src/lexer.c | 72 |
1 files changed, 72 insertions, 0 deletions
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 <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +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; +} |
