blob: 63e9b1f7682fdbe41fdb723d3710b037e767b4d7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#include "nodes.h"
Node *
alloc_node(NodeType type) {
// TODO: Use a bump allocator?
// TODO: Free memory!
Node *node = malloc(sizeof(Node));
node->type = type;
return node;
}
void
print_node(Node *node) {
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_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(":");
sv_write(&node->def.type);
printf(" ");
print_node(node->def.value);
printf(")");
} break;
default: { printf("{#unknown#}"); } break;
}
}
|