diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-23 21:18:44 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-23 21:18:44 +0200 |
commit | 25444d18759bb7dde28dc6cb7a1554a08a125e34 (patch) | |
tree | 8e934c5e72bf124e6a558acc1dfa2607740652a1 /src/parser.c | |
parent | 42046a947e1ad636a1ee23be58ce0be2d8abbab2 (diff) | |
download | bdl-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.c | 14 |
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 | } |