summaryrefslogtreecommitdiff
path: root/src/compiler/lexer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/lexer.h')
-rw-r--r--src/compiler/lexer.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h
new file mode 100644
index 0000000..3c3bc3f
--- /dev/null
+++ b/src/compiler/lexer.h
@@ -0,0 +1,66 @@
+#pragma once
+
+#include <stddef.h>
+
+typedef enum LexerToken {
+ LEXER_TOKEN_IDENTIFIER,
+ LEXER_TOKEN_KEYWORD_VOID,
+ LEXER_TOKEN_KEYWORD_PRINT,
+
+ LEXER_TOKEN_NUMBER,
+
+ LEXER_TOKEN_SYMBOL,
+ LEXER_TOKEN_SYMBOL_EOL,
+ LEXER_TOKEN_SYMBOL_OPEN_PARENTHESIS,
+ LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS,
+ LEXER_TOKEN_SYMBOL_OPEN_CURLY_BRACKET,
+ LEXER_TOKEN_SYMBOL_CLOSE_CURLY_BRACKET,
+ LEXER_TOKEN_SYMBOL_FUNCTION_ARROW,
+ LEXER_TOKEN_SYMBOL_COLON,
+
+ LEXER_TOKEN_NONE,
+} LexerToken;
+
+extern const char *LEXER_TOKEN_STRINGS[];
+
+extern const char *LEXER_SYMBOL_STRINGS[];
+extern const LexerToken LEXER_SYMBOL_TOKENS[];
+extern const size_t LEXER_SYMBOL_SIZE;
+
+extern const char *LEXER_KEYWORD_STRINGS[];
+extern const LexerToken LEXER_KEYWORD_TOKENS[];
+extern const size_t LEXER_KEYWORD_SIZE;
+
+struct ParserNode;
+
+typedef struct LexerNode {
+ char *str_begin;
+ char *str_end;
+ LexerToken token;
+ struct ParserNode *parserNode;
+} LexerNode;
+
+typedef struct LexerNodeArray {
+ LexerNode *data;
+ size_t size;
+} LexerNodeArray;
+
+constexpr LexerNodeArray LEXER_NODE_ARRAY_ERROR = {
+ .size = -1ULL,
+};
+
+extern bool lexerNodeArrayIsError(LexerNodeArray array);
+extern void lexerNodeArrayPrint(LexerNodeArray array);
+extern void lexerNodeArrayDestroy(LexerNodeArray array);
+
+extern LexerNodeArray lexer(char *str);
+
+extern void lexerPushClear(LexerNodeArray *array, size_t *array_size,
+ char *iter, char **node_str_begin,
+ LexerToken *node_token, LexerToken token);
+
+extern bool isIdentifier(char c);
+extern bool isNumber(char c);
+extern bool isSymbol(char c);
+extern bool isSingleSymbol(char c);
+extern bool isSpace(char c);