#include "node.h" MK_ENUM_C(NodeKind, NODE_KIND); void node_init(struct node* self, NodeKind kind, struct token* token, int line) { assert(self); self->kind = kind; self->token = token; vec_init(&self->children); self->line = line; } void node_free(struct node* self) { assert(self); if (self->token) { token_free(self->token); free(self->token); } vec_free_elements(&self->children, (void*) node_free); vec_free(&self->children); } void node_str(struct node* self, struct str* str) { assert(self); assert(str); str_format(str, "%s", NodeKindStr[self->kind] + strlen("NODE_")); if (self->token && self->token->value) { str_format(str, "[%s]", self->token->value); } if (self->children.size > 0) { str_push(str, '('); for (size_t i=0; ichildren.size; i++) { if (i > 0) { str_push(str, ','); } struct str child_str; str_init(&child_str); node_str(self->children.data[i], &child_str); str_extend(str, child_str.value); str_free(&child_str); } str_push(str, ')'); } } void node_add_new_child(struct node* self, struct node* child) { assert(self); assert(child); vec_push(&self->children, child); }