aboutsummaryrefslogtreecommitdiffstats
path: root/src/nodes.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-04-03 18:54:51 -0300
committerBad Diode <bd@badd10de.dev>2022-04-03 18:54:51 -0300
commitc8b53cb4590d8d6cbfc5cbf891809ddd99e33fe5 (patch)
tree716f3676abb4a777add1683390cfc37a605fe911 /src/nodes.c
parent496ec36c8002a85dc0c3bb62de6d176e369b40af (diff)
downloadbdl-c8b53cb4590d8d6cbfc5cbf891809ddd99e33fe5.tar.gz
bdl-c8b53cb4590d8d6cbfc5cbf891809ddd99e33fe5.zip
Add parsing for function definitions
This commits also changes the structure of some existing functions. Namely, parse_* functions other than parse_next check that the type of the token to parse is correct. This allow us to use them directly in the rest of the code to consume tokens and properly produce an error if the token type is not the expected one. In the same fashion, two new functions consume_lparen and consume_rparen are implemented. They only report true/false and report errors if something went wrong.
Diffstat (limited to 'src/nodes.c')
-rw-r--r--src/nodes.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/nodes.c b/src/nodes.c
index 855d186..fc39d8e 100644
--- a/src/nodes.c
+++ b/src/nodes.c
@@ -23,6 +23,7 @@ print_node(Node *node) {
23 } 23 }
24 } break; 24 } break;
25 case NODE_SYMBOL: 25 case NODE_SYMBOL:
26 case NODE_TYPE:
26 case NODE_STRING: { 27 case NODE_STRING: {
27 sv_write(&node->string); 28 sv_write(&node->string);
28 } break; 29 } break;
@@ -51,7 +52,7 @@ print_node(Node *node) {
51 printf("(def "); 52 printf("(def ");
52 print_node(node->def.symbol); 53 print_node(node->def.symbol);
53 printf(":"); 54 printf(":");
54 sv_write(&node->def.type); 55 print_node(node->def.type);
55 printf(" "); 56 printf(" ");
56 print_node(node->def.value); 57 print_node(node->def.value);
57 printf(")"); 58 printf(")");
@@ -63,6 +64,31 @@ print_node(Node *node) {
63 print_node(node->def.value); 64 print_node(node->def.value);
64 printf(")"); 65 printf(")");
65 } break; 66 } break;
67 case NODE_FUN: {
68 printf("(fun ");
69 print_node(node->fun.name);
70 printf(" (");
71 size_t n_params = array_size(node->fun.param_names);
72 for (size_t i = 0; i < n_params; ++i) {
73 print_node(node->fun.param_names[i]);
74 printf(":");
75 print_node(node->fun.param_types[i]);
76 if (i < n_params - 1) {
77 printf(" ");
78 }
79 }
80 printf(")");
81 printf(": ");
82 print_node(node->fun.return_type);
83
84 size_t n_expr = array_size(node->fun.body);
85 for (size_t i = 0; i < n_expr; ++i) {
86 printf(" ");
87 print_node(node->fun.body[i]);
88 }
89
90 printf(")");
91 } break;
66 default: { printf("{#unknown#}"); } break; 92 default: { printf("{#unknown#}"); } break;
67 } 93 }
68} 94}