#pragma once #include #include #include #include typedef enum Token { TOKEN_NONE = 0, TOKEN_IDENTIFIER, TOKEN_NUMBER, TOKEN_STRING, TOKEN_OPERATOR, TOKEN_OPERATOR_PARENTHESES_OPEN, TOKEN_OPERATOR_PARENTHESES_CLOSE, TOKEN_OPERATOR_CURLY_BRACKET_OPEN, TOKEN_OPERATOR_CURLY_BRACKET_CLOSE, TOKEN_OPERATOR_ASSIGN, TOKEN_OPERATOR_EQUAL, TOKEN_OPERATOR_COLON, TOKEN_OPERATOR_COMMA, TOKEN_OPERATOR_EOL, TOKEN_OPERATOR_FUNCTION, TOKEN_SYMBOL, TOKEN_KEYWORD_STRUCT, TOKEN_KEYWORD_EXTERNAL, TOKEN_KEYWORD_IMPORT, TOKEN_PARSED, } Token; extern const char *TOKEN_STRINGS[]; struct ParsedNode; typedef struct Node { char const *strBegin; char const *strEnd; Token token; struct ParsedNode *parsedNode; } Node; typedef struct Nodes { Node *nodes; size_t size; } Nodes; extern void printNodes(Nodes nodes); extern void deleteNodes(Nodes nodes); extern Nodes lexer(char const *const restrict code); extern void push_if_not_empty(Node **restrict nodes, size_t *restrict nodes_size, size_t *restrict nodes_inserted, Node *restrict node, char const *restrict str, int i, Token token); extern void push_clear_without_check(Node **restrict nodes, size_t *restrict nodes_size, size_t *restrict nodes_inserted, Node *node, char const *restrict str, int i, Token token); extern bool isSpace(char c); extern bool isIdentifier(char c); extern bool isIdentifierSymbol(char c); extern bool isNumber(char c); extern bool isString(char c); extern bool isOperator(char c); extern bool isSymbol(char c); extern Token getTokenInStrings(char const *strBegin, char const *strEnd, const char *strings[], const Token tokens[], const size_t size); extern Token getKeyword(char const *strBegin, char const *strEnd); extern Token getOperator(char const *strBegin, char const *strEnd);