#include "node.h" #include #include #include #include const char* node_types[] = {"prog-ir", "func-ir", "stmt-ir", "expr-ir", "const-ir"}; const char* node_ops[] = {"not-ir", "neg-ir", "plus-ir", "minus-ir", "mult-ir", "div-ir", "mod-ir"}; Node *create_node(enum node_type type) { Node *node = malloc(sizeof(Node)); node->type = type; node->children = NULL; node->num_children = 0; return node; } Node *create_function(char *name) { Node *node = malloc(sizeof(Node)); node->type = FUNC; node->field.name = name; node->children = NULL; node->num_children = 0; return node; } Node *create_expr(enum node_op op) { Node *node = malloc(sizeof(Node)); node->type = EXPR; node->field.op = op; node->children = NULL; node->num_children = 0; return node; } Node *create_const(int val) { Node *node = malloc(sizeof(Node)); node->type = CONST; node->field.val = val; node->children = NULL; node->num_children = 0; return node; } void add_child(Node *parent, Node *child) { size_t new_size = sizeof(Node*) * (parent->num_children + 1); parent->children = realloc(parent->children, new_size); parent->children[parent->num_children] = child; parent->num_children++; } void free_node(Node *node) { for (size_t i = 0; i < node->num_children; ++i) { free_node(node->children[i]); } if (node->type == FUNC) free(node->field.name); free(node->children); free(node); } void *print_node(Node *node, int indent) { if (node == NULL) { return; } for (int i = 0; i < indent; ++i) printf(" "); printf("type: %s", node_types[node->type]); if (node->type == FUNC) printf(", name: \"%s\"", node->field.name); if (node->type == EXPR) printf(", op: %s", node_ops[node->field.op]); if (node->type == CONST) printf(", val: %d", node->field.val); printf("\n"); for (size_t i = 0; i < node->num_children; ++i) { print_node(node->children[i], indent + 1); } }