#ifndef LEXER_H #define LEXER_H #include "string_view.h" typedef enum token_kind { TOKEN_KW_PUSH, TOKEN_KW_DUP, TOKEN_KW_COPY, TOKEN_KW_SWAP, TOKEN_KW_DROP, TOKEN_KW_SLIDE, TOKEN_KW_ADD, TOKEN_KW_SUB, TOKEN_KW_MUL, TOKEN_KW_DIV, TOKEN_KW_MOD, TOKEN_KW_STORE, TOKEN_KW_LOAD, TOKEN_KW_CALL, TOKEN_KW_RET, TOKEN_KW_JMP, TOKEN_KW_JMPZ, TOKEN_KW_JMPN, TOKEN_KW_PRINTI, TOKEN_KW_PRINTC, TOKEN_KW_READI, TOKEN_KW_READC, TOKEN_KW_END, TOKEN_EOS, TOKEN_NUMBER, TOKEN_IDENT, TOKEN_COLON, TOKEN_UNKOWN, TOKEN_EOF } token_kind_t; typedef struct lex_loc { size_t offset; size_t lineoffset; size_t lineno; } lex_loc_t; typedef struct token { token_kind_t kind; string_view_t value; lex_loc_t loc; } token_t; typedef struct lexer { char *file_name; string_view_t source; lex_loc_t loc; } lexer_t; void lexer_init(lexer_t *lexer, char *file_name); bool lexer_is_eof(lexer_t *lexer); char lexer_current_char(lexer_t *lexer); char lexer_next_char(lexer_t *lexer); void lexer_next_token(lexer_t *lexer, token_t *token); char * token_to_cstr(token_kind_t kind); #endif /* LEXER_H */