aboutsummaryrefslogtreecommitdiffstats
path: root/src/nodes.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-03-31 08:18:36 +0200
committerBad Diode <bd@badd10de.dev>2022-03-31 08:18:36 +0200
commit483a64aa0c5ee8dc925b7957e39c42744b892288 (patch)
tree86564a19bfc3255a04872815f7e1ac76d3b19cdc /src/nodes.c
parent4d5d49b0d1282df08e3dc7dec3c550c544fbfccb (diff)
downloadbdl-483a64aa0c5ee8dc925b7957e39c42744b892288.tar.gz
bdl-483a64aa0c5ee8dc925b7957e39c42744b892288.zip
Add type signature to def statements
Currently mandatory, may be optional once we have type inference.
Diffstat (limited to 'src/nodes.c')
-rw-r--r--src/nodes.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/nodes.c b/src/nodes.c
new file mode 100644
index 0000000..63e9b1f
--- /dev/null
+++ b/src/nodes.c
@@ -0,0 +1,61 @@
1#include "nodes.h"
2
3Node *
4alloc_node(NodeType type) {
5 // TODO: Use a bump allocator?
6 // TODO: Free memory!
7 Node *node = malloc(sizeof(Node));
8 node->type = type;
9 return node;
10}
11
12void
13print_node(Node *node) {
14 switch (node->type) {
15 case NODE_NUMBER: {
16 if (node->number.negative) {
17 printf("-");
18 }
19 if (node->number.fractional != 0) {
20 printf("%zu.%zu", node->number.integral, node->number.fractional);
21 } else {
22 printf("%zu", node->number.integral);
23 }
24 } break;
25 case NODE_SYMBOL:
26 case NODE_STRING: {
27 sv_write(&node->string);
28 } break;
29 case NODE_BOOL: {
30 if (node->boolean) {
31 printf("true");
32 } else {
33 printf("false");
34 }
35 } break;
36 case NODE_BUILTIN: {
37 printf("({%s}", token_str[node->builtin.type]);
38 size_t n_args = array_size(node->builtin.args);
39 if (n_args != 0) {
40 printf(" ");
41 }
42 for (size_t i = 0; i < n_args; ++i) {
43 print_node(node->builtin.args[i]);
44 if (i < n_args - 1) {
45 printf(" ");
46 }
47 }
48 printf(")");
49 } break;
50 case NODE_DEF: {
51 printf("(def ");
52 print_node(node->def.symbol);
53 printf(":");
54 sv_write(&node->def.type);
55 printf(" ");
56 print_node(node->def.value);
57 printf(")");
58 } break;
59 default: { printf("{#unknown#}"); } break;
60 }
61}