/* * Copyright (C) 2025 Johnny Richard * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #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 */