#ifndef __ARCANA_LISP_LEXER_H__ #define __ARCANA_LISP_LEXER_H__ #include "tokens.h" #include #define LEXER_BUFFER_SLEN 1023 #define LEXER_BUFFER_SIZE (LEXER_BUFFER_SLEN + 1) #define LEXER_DELETE(lexer) do { \ Lexer_delete(lexer); \ lexer = NULL; \ } while (0) enum Lexer_State { STATE_INIT, STATE_WHITESPACE, STATE_COMMENT_LINE, STATE_ROUND_OPEN, STATE_ROUND_CLOSE, STATE_SQUARE_OPEN, STATE_SQUARE_CLOSE, STATE_CURLY_OPEN, STATE_CURLY_CLOSE, STATE_QUOTE, STATE_QUASI_QUOTE, STATE_QUASI_UNQUOTE, STATE_SHARP, STATE_TAG, STATE_IDENT, STATE_NUM, STATE_STRING_START, STATE_STRING_INSIDE, STATE_STRING_END, STATE_STRING_ESCAPE, }; typedef struct Lexer { Tokens tokens; enum Lexer_State state; char buffer[LEXER_BUFFER_SIZE]; size_t buffer_index; } *Lexer; Lexer Lexer_new(Tokens tokens); void Lexer_delete(Lexer lexer); void Lexer_lex(Lexer self, char chr); #endif