#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_IDENTIFIER, PARSED_TOKEN_DEFINE_VARIABLE, PARSED_TOKEN_DEFINE_CONSTANT, PARSED_TOKEN_EOL, PARSED_TOKEN_COMMA, PARSED_TOKEN_STRUCT, PARSED_TOKEN_FUNCTION, PARSED_TOKEN_FUNCTION_PARAMS, PARSED_TOKEN_CODE_BODY, PARSED_TOKEN_IMPORT, } 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 ParserScopeMetadata { ParsedNode **operands; size_t operands_size; } ParserScopeMetadata; typedef ParsedNode ParserParenthesisMetadata; typedef struct ParserFunctionCallMetadata { char const *functionNameBegin; char const *functionNameEnd; ParserScopeMetadata *scope; } ParserFunctionCallMetadata; typedef ParsedNode ParserPrintMetadata; typedef struct ParserVariableDefine { ParsedNode *name; ParsedNode *type; ParsedNode *value; } ParserVariableDefineMetadata; typedef ParsedNode ParserEOLMetadata; typedef ParsedNode ParserCommaMetadata; typedef struct ParserStructMetadata { ParsedNode *body; } ParserStructMetadata; typedef struct ParserFunctionMetadata { ParsedNode *params; ParsedNode *type; ParsedNode *body; } ParserFunctionMetadata; typedef ParsedNode ParserImportMetadata; 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(SourceCode *code,size_t sourceIndex); extern ParsedNode *_parser(Nodes lexedNodes, SourceCode *code); extern ParserScopeMetadata *parserScope( Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, bool (*isAllowed)(ParsedToken token, bool isLast), SourceCode *code); extern ParserScopeMetadata *parserScopeCode(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, SourceCode *code); extern ParserScopeMetadata *parserScopeParenthesis(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, SourceCode *code); extern ParserScopeMetadata *parserScopeFunctionCall(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, SourceCode *code); extern ParserScopeMetadata *parserScopeFunctionParam(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, SourceCode *code); extern ParserScopeMetadata *parserScopeStruct(Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseNode(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseParenthesis(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseCurly(Node *nodesBegin, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseString(Node *node, ParsedNode *parent); extern ParsedNode *parseIdentifier(Node *node, ParsedNode *parent); extern ParsedNode *parseEOL(Node *nodesBegin, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseVariable(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseComma(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseStruct(Node *nodesEnd, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseFunction(Node *nodesBegin, Node *nodesEnd, Node *node, ParsedNode *parent, SourceCode *code); extern ParsedNode *parseImport(Node *nodesEnd, Node *node, ParsedNode *parent, SourceCode *code);