summaryrefslogtreecommitdiff
path: root/include/obe/lexer.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/obe/lexer.h')
-rw-r--r--include/obe/lexer.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/include/obe/lexer.h b/include/obe/lexer.h
new file mode 100644
index 0000000..9761aa7
--- /dev/null
+++ b/include/obe/lexer.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2025 Johnny Richard <johnny@johnnyrichard.com>
+ *
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ *
+ * This file is part of obe.
+ *
+ * obe is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * obe 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 Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with obe. If not, see <https://www.gnu.org/licenses/>.
+ */
+#ifndef OBE_LEXER_H
+#define OBE_LEXER_H
+
+#include <obe/string.h>
+#include <stddef.h>
+
+typedef enum obe_token_kind
+{
+ TOKEN_KW_RETURN,
+ TOKEN_KW_FN,
+ TOKEN_KW_BR,
+ TOKEN_IDENT,
+ TOKEN_LABEL,
+ TOKEN_NUMBER,
+ TOKEN_INT,
+ TOKEN_EQ,
+ TOKEN_COLON,
+ TOKEN_SEMICOLON,
+ TOKEN_LBRACE,
+ TOKEN_RBRACE,
+ TOKEN_EOF,
+ TOKEN_UNKOWN
+} obe_token_kind_t;
+
+typedef struct obe_lexer_loc
+{
+ size_t offset;
+ size_t lineoffset;
+ size_t lineno;
+} obe_lexer_loc_t;
+
+typedef struct obe_token
+{
+ obe_token_kind_t kind;
+ obe_string_t value;
+ obe_lexer_loc_t loc;
+} obe_token_t;
+
+typedef struct obe_lexer
+{
+ char* filename;
+ obe_string_t source;
+ obe_lexer_loc_t loc;
+} obe_lexer_t;
+
+void
+obe_lexer_init(obe_lexer_t* lexer, char* filename);
+
+bool
+obe_lexer_is_eof(obe_lexer_t* lexer);
+
+char
+obe_lexer_current_char(obe_lexer_t* lexer);
+
+char
+obe_lexer_next_char(obe_lexer_t* lexer);
+
+void
+obe_lexer_next_token(obe_lexer_t* lexer, obe_token_t* token);
+
+char*
+obe_token_to_cstr(obe_token_kind_t kind);
+
+#endif /* OBE_LEXER_H */