diff options
Diffstat (limited to 'src/compiler/lexer.h')
-rw-r--r-- | src/compiler/lexer.h | 66 |
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); |