diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-18 11:54:55 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-18 11:54:55 +0200 |
commit | d56cbdb065fa12d9e2bec375f65ef67d611c61bb (patch) | |
tree | 7e4568e606f060d638ebb1f79367f9509a4ee9c7 | |
parent | 9c3837060d1089131b351761db97544db8738de3 (diff) | |
download | bdl-d56cbdb065fa12d9e2bec375f65ef67d611c61bb.tar.gz bdl-d56cbdb065fa12d9e2bec375f65ef67d611c61bb.zip |
Add array types and array symbol access
-rw-r--r-- | src/main.c | 36 | ||||
-rw-r--r-- | tests/variables.bad | 5 |
2 files changed, 35 insertions, 6 deletions
@@ -76,7 +76,9 @@ typedef enum NodeKind { | |||
76 | NODE_SET, | 76 | NODE_SET, |
77 | NODE_STRUCT, | 77 | NODE_STRUCT, |
78 | // Helpers. | 78 | // Helpers. |
79 | NODE_SYMBOL_ARR, | ||
79 | NODE_TYPE, | 80 | NODE_TYPE, |
81 | NODE_ARR_TYPE, | ||
80 | NODE_COMPOUND_TYPE, | 82 | NODE_COMPOUND_TYPE, |
81 | NODE_STRUCT_FIELD, | 83 | NODE_STRUCT_FIELD, |
82 | } NodeKind; | 84 | } NodeKind; |
@@ -120,7 +122,9 @@ Str node_str[] = { | |||
120 | [NODE_STRUCT] = cstr("STRUCT DEF"), | 122 | [NODE_STRUCT] = cstr("STRUCT DEF"), |
121 | // Helpers. | 123 | // Helpers. |
122 | [NODE_TYPE] = cstr("TYPE"), | 124 | [NODE_TYPE] = cstr("TYPE"), |
123 | [NODE_COMPOUND_TYPE] = cstr("COMPOUND TYPE"), | 125 | [NODE_ARR_TYPE] = cstr("TYPE (ARR)"), |
126 | [NODE_SYMBOL_ARR] = cstr("SYMBOL (ARR)"), | ||
127 | [NODE_COMPOUND_TYPE] = cstr("TYPE (COMPOUND)"), | ||
124 | [NODE_STRUCT_FIELD] = cstr("FIELD"), | 128 | [NODE_STRUCT_FIELD] = cstr("FIELD"), |
125 | }; | 129 | }; |
126 | 130 | ||
@@ -143,7 +147,7 @@ typedef struct Node { | |||
143 | struct Node *right; | 147 | struct Node *right; |
144 | }; | 148 | }; |
145 | struct Node *next; | 149 | struct Node *next; |
146 | struct Node *initializer; | 150 | struct Node *arr_size; |
147 | struct { | 151 | struct { |
148 | struct Node *var_name; | 152 | struct Node *var_name; |
149 | struct Node *var_type; | 153 | struct Node *var_type; |
@@ -412,6 +416,16 @@ parse_type(Parser *parser) { | |||
412 | parse_consume(parser, TOK_SYMBOL, | 416 | parse_consume(parser, TOK_SYMBOL, |
413 | cstr("no type given for struct field")); | 417 | cstr("no type given for struct field")); |
414 | node->value.sym = parser->previous.val; | 418 | node->value.sym = parser->previous.val; |
419 | // Optional array value? | ||
420 | if (parse_match(parser, TOK_LSQUARE)) { | ||
421 | node->kind = NODE_ARR_TYPE, | ||
422 | parse_consume(parser, TOK_NUM_INT, | ||
423 | cstr("no array size given")); | ||
424 | parse_number(parser); | ||
425 | node->arr_size = array_pop(parser->nodes); | ||
426 | parse_consume(parser, TOK_RSQUARE, | ||
427 | cstr("unmatched brackets ']' in array type")); | ||
428 | } | ||
415 | } | 429 | } |
416 | array_push(parser->nodes, node, parser->storage); | 430 | array_push(parser->nodes, node, parser->storage); |
417 | } | 431 | } |
@@ -637,6 +651,15 @@ parse_symbol(Parser *parser) { | |||
637 | field->field_type = array_pop(parser->nodes); | 651 | field->field_type = array_pop(parser->nodes); |
638 | array_push(node->elements, field, parser->storage); | 652 | array_push(node->elements, field, parser->storage); |
639 | } | 653 | } |
654 | } else if (parse_match(parser, TOK_LSQUARE)) { | ||
655 | node = node_alloc(parser, NODE_SYMBOL_ARR, prev); | ||
656 | if (!node) return; | ||
657 | parse_consume(parser, TOK_NUM_INT, | ||
658 | cstr("no array size given")); | ||
659 | parse_number(parser); | ||
660 | node->arr_size = array_pop(parser->nodes); | ||
661 | parse_consume(parser, TOK_RSQUARE, | ||
662 | cstr("unmatched brackets ']' in array type")); | ||
640 | } else { | 663 | } else { |
641 | node = node_alloc(parser, NODE_SYMBOL, prev); | 664 | node = node_alloc(parser, NODE_SYMBOL, prev); |
642 | if (!node) return; | 665 | if (!node) return; |
@@ -667,10 +690,11 @@ graph_node(Node *node) { | |||
667 | case NODE_NUM_UINT: print("| Value: %x", node->value.u); break; | 690 | case NODE_NUM_UINT: print("| Value: %x", node->value.u); break; |
668 | case NODE_NUM_FLOAT: print("| Value: %f{2}", node->value.d); break; | 691 | case NODE_NUM_FLOAT: print("| Value: %f{2}", node->value.d); break; |
669 | case NODE_STRING: print("| Value: %s", node->value.str); break; | 692 | case NODE_STRING: print("| Value: %s", node->value.str); break; |
670 | case NODE_SYMBOL: print("| Value: %s", node->value.sym); break; | 693 | case NODE_SYMBOL_ARR: print("| Name: %s", node->value.sym); break; |
671 | case NODE_STRUCT: print("| Value: %s", node->value.sym); break; | 694 | case NODE_SYMBOL: print("| Name: %s", node->value.sym); break; |
672 | case NODE_STRUCT_LIT: print("| Value: %s", node->value.sym); break; | 695 | case NODE_STRUCT: print("| Name: %s", node->value.sym); break; |
673 | case NODE_TYPE: print("| Value: %s", node->value.sym); break; | 696 | case NODE_STRUCT_LIT: print("| Name: %s", node->value.sym); break; |
697 | case NODE_TYPE: print("| Name: %s", node->value.sym); break; | ||
674 | default: break; | 698 | default: break; |
675 | } | 699 | } |
676 | println("\"];"); | 700 | println("\"];"); |
diff --git a/tests/variables.bad b/tests/variables.bad index a653dc7..473bb3c 100644 --- a/tests/variables.bad +++ b/tests/variables.bad | |||
@@ -53,3 +53,8 @@ let particle = entity { | |||
53 | ; Missing initialization fields default to zero. | 53 | ; Missing initialization fields default to zero. |
54 | vel = vec { y = -3 } | 54 | vel = vec { y = -3 } |
55 | } | 55 | } |
56 | |||
57 | ; We can have static arrays and have indexed access. | ||
58 | let numbers: u32[0xff] | ||
59 | set numbers[0] = 32 | ||
60 | set numbers[1] = 42 | ||