#include "all.h" #include "ivec.h" #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; }