#pragma once #include typedef enum ParsedToken { PARSED_TOKEN_NONE = 0, PARSED_TOKEN_ROOT, PARSED_TOKEN_PARENTHESIS, PARSED_TOKEN_FUNCTION_CALL, PARSED_TOKEN_VALUE_STRING, PARSED_TOKEN_EOL, } ParsedToken; extern const char *PARSED_TOKEN_STRINGS[]; typedef struct ParseOrder { bool ltr; size_t size; Token tokens[10]; // TODO: change this } ParseOrder; typedef struct ParsedNode { char const *strBegin; char const *strEnd; ParsedToken token; void *metadata; struct ParsedNode *parent; } ParsedNode; typedef struct ScopeMetadata { struct ParsedNode **operands; size_t operands_size; } ScopeMetadata; typedef struct FunctionCallMetadata { char const *functionNameBegin; char const *functionNameEnd; ScopeMetadata *scope; } FunctionCallMetadata ; typedef ParsedNode PrintMetadata; typedef ParsedNode EOLMetadata; extern ParsedNode *newParsedNode(char const *strBegin, char const *strEnd, ParsedToken token, void *metadata, ParsedNode *parent); extern void _printParsedNode(const ParsedNode *parsedNode, int indent); extern void printParsedNode(const ParsedNode *parsedNode); extern ParsedNode *getUntilCommonFather(ParsedNode *parsedNode, ParsedNode *parent); extern void deleteParsedNode(ParsedNode *parsedNode); extern ParsedNode *parser(Nodes lexedNodes); extern ScopeMetadata *parserScope(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, bool (*isAllowed)(ParsedToken)); extern ScopeMetadata *parserScopeCode(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent); extern ScopeMetadata *parserScopeParenthesis(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent); extern ParsedNode *parseNode(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent); extern ParsedNode *parseParenthesis(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent); extern ParsedNode *parseString(Node *node, ParsedNode *parent); extern ParsedNode *parseEOL(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent);