aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-23 21:18:44 +0200
committerBad Diode <bd@badd10de.dev>2024-06-23 21:18:44 +0200
commit25444d18759bb7dde28dc6cb7a1554a08a125e34 (patch)
tree8e934c5e72bf124e6a558acc1dfa2607740652a1 /src/parser.c
parent42046a947e1ad636a1ee23be58ce0be2d8abbab2 (diff)
downloadbdl-25444d18759bb7dde28dc6cb7a1554a08a125e34.tar.gz
bdl-25444d18759bb7dde28dc6cb7a1554a08a125e34.zip
Add non-exhaustive typechecking for cond/match expr
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/parser.c b/src/parser.c
index 9079df9..b82579b 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -47,8 +47,9 @@ typedef enum NodeKind {
47 NODE_STRUCT, 47 NODE_STRUCT,
48 NODE_IF, 48 NODE_IF,
49 NODE_MATCH, 49 NODE_MATCH,
50 NODE_CASE,
51 NODE_COND, 50 NODE_COND,
51 NODE_CASE_MATCH,
52 NODE_CASE_COND,
52 NODE_ENUM, 53 NODE_ENUM,
53 NODE_BREAK, 54 NODE_BREAK,
54 NODE_CONTINUE, 55 NODE_CONTINUE,
@@ -111,8 +112,9 @@ Str node_str[] = {
111 [NODE_STRUCT] = cstr("STRUCT DEF"), 112 [NODE_STRUCT] = cstr("STRUCT DEF"),
112 [NODE_IF] = cstr("IF"), 113 [NODE_IF] = cstr("IF"),
113 [NODE_MATCH] = cstr("MATCH"), 114 [NODE_MATCH] = cstr("MATCH"),
114 [NODE_CASE] = cstr("CASE"),
115 [NODE_COND] = cstr("COND"), 115 [NODE_COND] = cstr("COND"),
116 [NODE_CASE_MATCH] = cstr("CASE"),
117 [NODE_CASE_COND] = cstr("CASE"),
116 [NODE_ENUM] = cstr("ENUM"), 118 [NODE_ENUM] = cstr("ENUM"),
117 [NODE_BREAK] = cstr("BREAK"), 119 [NODE_BREAK] = cstr("BREAK"),
118 [NODE_CONTINUE] = cstr("CONTINUE"), 120 [NODE_CONTINUE] = cstr("CONTINUE"),
@@ -609,7 +611,8 @@ parse_keyword(Parser *parser) {
609 parse_consume(parser, TOK_LCURLY, 611 parse_consume(parser, TOK_LCURLY,
610 cstr("expected block of match cases")); 612 cstr("expected block of match cases"));
611 while (!parse_match(parser, TOK_RCURLY) && !parser->panic) { 613 while (!parse_match(parser, TOK_RCURLY) && !parser->panic) {
612 Node *tmp = node_alloc(parser, NODE_CASE, parser->previous); 614 Node *tmp =
615 node_alloc(parser, NODE_CASE_MATCH, parser->previous);
613 if (!tmp) return; 616 if (!tmp) return;
614 // Are we on the default case. 617 // Are we on the default case.
615 if (!parse_match(parser, TOK_ELSE)) { 618 if (!parse_match(parser, TOK_ELSE)) {
@@ -668,12 +671,11 @@ parse_keyword(Parser *parser) {
668 parse_consume(parser, TOK_LCURLY, 671 parse_consume(parser, TOK_LCURLY,
669 cstr("expected '{' on cond expression")); 672 cstr("expected '{' on cond expression"));
670 while (!parse_match(parser, TOK_RCURLY) && !parser->panic) { 673 while (!parse_match(parser, TOK_RCURLY) && !parser->panic) {
671 Node *tmp = node_alloc(parser, NODE_CASE, parser->previous); 674 Node *tmp =
675 node_alloc(parser, NODE_CASE_COND, parser->previous);
672 if (!tmp) return; 676 if (!tmp) return;
673 // Are we on the default case. 677 // Are we on the default case.
674 if (!parse_match(parser, TOK_ELSE)) { 678 if (!parse_match(parser, TOK_ELSE)) {
675 parse_consume(parser, TOK_CASE,
676 cstr("expected case statement"));
677 parse_expr(parser, PREC_LOW); 679 parse_expr(parser, PREC_LOW);
678 tmp->case_value = array_pop(parser->nodes); 680 tmp->case_value = array_pop(parser->nodes);
679 } 681 }