#ifndef PARSER_H #define PARSER_H #include typedef enum { TokenType_Error, TokenType_Id, TokenType_Int, TokenType_Not, TokenType_And, TokenType_Or, TokenType_Loop, TokenType_Fn, TokenType_Break, TokenType_LParen, TokenType_RParen, TokenType_LBrace, TokenType_RBrace, TokenType_LBracket, TokenType_RBracket, TokenType_Comma, TokenType_Semicolon, TokenType_Exclamation, TokenType_Plus, TokenType_Minus, TokenType_Asterisk, TokenType_EE, TokenType_NE, TokenType_LT, TokenType_GT, TokenType_LTE, TokenType_GTE, } TokenType; typedef struct { TokenType token; size_t index; size_t length; int line; } Token; typedef enum { ASTNodeType_Error, ASTNodeType_Id, ASTNodeType_Int, ASTNodeType_Block, ASTNodeType_If, ASTNodeType_Loop, ASTNodeType_Call, ASTNodeType_Index, ASTNodeType_Unary, ASTNodeType_Binary, ASTNodeType_Assign, ASTNodeType_Let, ASTNodeType_Break, ASTNodeType_Fn, } ASTNodeType; typedef struct ASTNode ASTNode; typedef struct { ASTNode** data; size_t length; size_t capacity; } ASTNodeVec; void ast_node_vec_construct(ASTNodeVec* vec); void ast_node_vec_destroy(ASTNodeVec* vec); void ast_node_vec_push(ASTNodeVec* vec, ASTNode* item); typedef struct { ASTNode* condition; ASTNode* truthy; ASTNode* falsy; } ASTIfNode; typedef struct { ASTNode* body; } ASTLoopNode; typedef struct { ASTNode* subject; ASTNodeVec args; } ASTCallNode; typedef struct { ASTNode* subject; ASTNode* value; } ASTIndexNode; typedef enum { UnaryType_Not, UnaryType_Negate, } UnaryType; typedef struct { UnaryType unary_type; ASTNode* subject; } ASTUnaryNode; typedef enum { BinaryType_And, BinaryType_Or, BinaryType_Add, BinaryType_Subtract, BinaryType_Multiply, BinaryType_EE, BinaryType_NE, BinaryType_LT, BinaryType_GT, BinaryType_LTE, BinaryType_GTE, } BinaryType; typedef struct { BinaryType binary_type; ASTNode* left; ASTNode* right; } ASTBinaryNode; typedef enum { AssignType_Assign, AssignType_Add, AssignType_Subtract, AssignType_Multiply, } AssignType; typedef struct { AssignType assign_type; ASTNode* subject; ASTNode* value; } ASTAssignNode; typedef struct { char* id; ASTNode* value; } ASTLetNode; typedef struct { char* id; ASTNodeVec params; ASTNode* body; } ASTFnNode; struct ASTNode { ASTNodeType node_type; int line; union { char* id_value; int int_value; ASTNodeVec statements; ASTIfNode if_node; ASTLoopNode loop_node; ASTCallNode call_node; ASTIndexNode index_node; ASTUnaryNode unary_node; ASTBinaryNode binary_node; ASTAssignNode assign_node; ASTLetNode let_node; ASTFnNode fn_node; }; }; void ast_node_destroy(ASTNode* node); #endif