diff options
author | Bad Diode <bd@badd10de.dev> | 2022-03-31 08:18:36 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-03-31 08:18:36 +0200 |
commit | 483a64aa0c5ee8dc925b7957e39c42744b892288 (patch) | |
tree | 86564a19bfc3255a04872815f7e1ac76d3b19cdc /src/nodes.c | |
parent | 4d5d49b0d1282df08e3dc7dec3c550c544fbfccb (diff) | |
download | bdl-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.c | 61 |
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 | |||
3 | Node * | ||
4 | alloc_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 | |||
12 | void | ||
13 | print_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 | } | ||