summaryrefslogtreecommitdiff
path: root/src/lexer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.h')
-rw-r--r--src/lexer.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/lexer.h b/src/lexer.h
new file mode 100644
index 0000000..bac1d6a
--- /dev/null
+++ b/src/lexer.h
@@ -0,0 +1,74 @@
+#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 */