#include "nodes.h" static size_t node_gen_id = 0; Node * alloc_node(NodeType type) { // TODO: Use a bump allocator? // TODO: Free memory! Node *node = malloc(sizeof(Node)); node->id = node_gen_id++; node->type = type; node->line = 0; node->col = 0; node->expr_type = NULL; return node; } void print_node(Node *node) { if (node == NULL) { return; } switch (node->type) { case NODE_NUMBER: { if (node->number.negative) { printf("-"); } if (node->number.fractional != 0) { printf("%zu.%zu", node->number.integral, node->number.fractional); } else { printf("%zu", node->number.integral); } } break; case NODE_SYMBOL: case NODE_TYPE: case NODE_STRING: { sv_write(&node->string); } break; case NODE_BOOL: { if (node->boolean) { printf("true"); } else { printf("false"); } } break; case NODE_BUILTIN: { printf("({%s}", token_str[node->builtin.type]); size_t n_args = array_size(node->builtin.args); if (n_args != 0) { printf(" "); } for (size_t i = 0; i < n_args; ++i) { print_node(node->builtin.args[i]); if (i < n_args - 1) { printf(" "); } } printf(")"); } break; case NODE_DEF: { printf("(def "); print_node(node->def.symbol); printf(":"); print_node(node->def.type); printf(" "); print_node(node->def.value); printf(")"); } break; case NODE_SET: { printf("(set "); print_node(node->def.symbol); printf(" "); print_node(node->def.value); printf(")"); } break; case NODE_BLOCK: { size_t n_expr = array_size(node->block.expr); printf("{"); for (size_t i = 0; i < n_expr; ++i) { printf(" "); print_node(node->block.expr[i]); } printf(" }"); } break; case NODE_IF: { printf("(if "); print_node(node->ifexpr.cond); printf(" "); print_node(node->ifexpr.expr_true); if (node->ifexpr.expr_false != NULL) { printf(" "); print_node(node->ifexpr.expr_false); } printf(")"); } break; case NODE_FUN: { printf("(fun "); print_node(node->fun.name); printf(" ("); size_t n_params = array_size(node->fun.param_names); for (size_t i = 0; i < n_params; ++i) { print_node(node->fun.param_names[i]); printf(":"); print_node(node->fun.param_types[i]); if (i < n_params - 1) { printf(" "); } } printf(")"); printf(": "); print_node(node->fun.return_type); printf(" "); print_node(node->fun.body); printf(")"); } break; case NODE_FUNCALL: { printf("("); print_node(node->funcall.name); size_t n_args = array_size(node->funcall.args); if (n_args != 0) { printf(" "); } for (size_t i = 0; i < n_args; ++i) { print_node(node->funcall.args[i]); if (i < n_args - 1) { printf(" "); } } printf(")"); } break; default: { printf("{#unknown#}"); } break; } }