aboutsummaryrefslogtreecommitdiffstats
path: root/src/nodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nodes.c')
-rw-r--r--src/nodes.c133
1 files changed, 0 insertions, 133 deletions
diff --git a/src/nodes.c b/src/nodes.c
deleted file mode 100644
index 6978acc..0000000
--- a/src/nodes.c
+++ /dev/null
@@ -1,133 +0,0 @@
1#include "nodes.h"
2
3static size_t node_gen_id = 0;
4
5Node *
6alloc_node(NodeType type) {
7 // TODO: Use a bump allocator?
8 // TODO: Free memory!
9 Node *node = malloc(sizeof(Node));
10 node->id = node_gen_id++;
11 node->type = type;
12 node->line = 0;
13 node->col = 0;
14 node->expr_type = NULL;
15 return node;
16}
17
18void
19print_node(Node *node) {
20 if (node == NULL) {
21 return;
22 }
23 switch (node->type) {
24 case NODE_NUMBER: {
25 if (node->number.negative) {
26 printf("-");
27 }
28 if (node->number.fractional != 0) {
29 printf("%zu.%zu", node->number.integral, node->number.fractional);
30 } else {
31 printf("%zu", node->number.integral);
32 }
33 } break;
34 case NODE_SYMBOL:
35 case NODE_TYPE:
36 case NODE_STRING: {
37 sv_write(&node->string);
38 } break;
39 case NODE_BOOL: {
40 if (node->boolean) {
41 printf("true");
42 } else {
43 printf("false");
44 }
45 } break;
46 case NODE_BUILTIN: {
47 printf("({%s}", token_str[node->builtin.type]);
48 size_t n_args = array_size(node->builtin.args);
49 if (n_args != 0) {
50 printf(" ");
51 }
52 for (size_t i = 0; i < n_args; ++i) {
53 print_node(node->builtin.args[i]);
54 if (i < n_args - 1) {
55 printf(" ");
56 }
57 }
58 printf(")");
59 } break;
60 case NODE_DEF: {
61 printf("(def ");
62 print_node(node->def.symbol);
63 printf(":");
64 print_node(node->def.type);
65 printf(" ");
66 print_node(node->def.value);
67 printf(")");
68 } break;
69 case NODE_SET: {
70 printf("(set ");
71 print_node(node->def.symbol);
72 printf(" ");
73 print_node(node->def.value);
74 printf(")");
75 } break;
76 case NODE_BLOCK: {
77 size_t n_expr = array_size(node->block.expr);
78 printf("{");
79 for (size_t i = 0; i < n_expr; ++i) {
80 printf(" ");
81 print_node(node->block.expr[i]);
82 }
83 printf(" }");
84 } break;
85 case NODE_IF: {
86 printf("(if ");
87 print_node(node->ifexpr.cond);
88 printf(" ");
89 print_node(node->ifexpr.expr_true);
90 if (node->ifexpr.expr_false != NULL) {
91 printf(" ");
92 print_node(node->ifexpr.expr_false);
93 }
94 printf(")");
95 } break;
96 case NODE_FUN: {
97 printf("(fun ");
98 print_node(node->fun.name);
99 printf(" (");
100 size_t n_params = array_size(node->fun.param_names);
101 for (size_t i = 0; i < n_params; ++i) {
102 print_node(node->fun.param_names[i]);
103 printf(":");
104 print_node(node->fun.param_types[i]);
105 if (i < n_params - 1) {
106 printf(" ");
107 }
108 }
109 printf(")");
110 printf(": ");
111 print_node(node->fun.return_type);
112 printf(" ");
113 print_node(node->fun.body);
114 printf(")");
115 } break;
116 case NODE_FUNCALL: {
117 printf("(");
118 print_node(node->funcall.name);
119 size_t n_args = array_size(node->funcall.args);
120 if (n_args != 0) {
121 printf(" ");
122 }
123 for (size_t i = 0; i < n_args; ++i) {
124 print_node(node->funcall.args[i]);
125 if (i < n_args - 1) {
126 printf(" ");
127 }
128 }
129 printf(")");
130 } break;
131 default: { printf("{#unknown#}"); } break;
132 }
133}