1
0
Fork 0
lesson-lisp/src/lexer.h

52 lines
1007 B
C

#ifndef __ARCANA_LISP_LEXER_H__
#define __ARCANA_LISP_LEXER_H__
#include "tokens.h"
#include <stddef.h>
#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