#ifndef RZ_NODE_H #define RZ_NODE_H #include "commons.h" #define NODE_TYPE(G) \ G(NODE_MOD), \ G(NODE_NUM), G(NODE_BOOL), G(NODE_STR), \ G(NODE_ASSERT), \ G(NODE_EQ), G(NODE_NE), \ G(NODE_LT), G(NODE_LE), G(NODE_GT), G(NODE_GE), \ G(NODE_ADD), G(NODE_SUB), G(NODE_MUL), G(NODE_DIV), \ G(NODE_MODULO), G(NODE_POW), G(NODE_OPAR), G(NODE_CPAR), \ G(NODE_AND), G(NODE_OR), G(NODE_NOT), \ G(NODE_LET), G(NODE_IDENT), G(NODE_ASSIGN), G(NODE_VARDECL), \ G(NODE_VARSET), G(NODE_BEGIN), G(NODE_END), G(NODE_BLOCK), \ G(NODE_SCOPE), G(NODE_IF), G(NODE_THEN), G(NODE_ELSE) RZ_ENUM_H(NodeType, NODE_TYPE); typedef struct { NodeType type; str_t value; int line; struct node_t* parent; struct { struct node_t** data; size_t size; size_t cap; } children; } node_t; void node_init(node_t* node, NodeType type, char* value, int line); void node_free(node_t* node); node_t* node_try_find_parent(node_t* node, NodeType type); void node_add_new_child(node_t* node, node_t* child); node_t* node_child(node_t* node, size_t index); size_t node_str(node_t* node, char* buffer, size_t size); node_t* node_find_first(node_t* node, NodeType type); #endif