aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-18 11:54:55 +0200
committerBad Diode <bd@badd10de.dev>2024-06-18 11:54:55 +0200
commitd56cbdb065fa12d9e2bec375f65ef67d611c61bb (patch)
tree7e4568e606f060d638ebb1f79367f9509a4ee9c7 /src
parent9c3837060d1089131b351761db97544db8738de3 (diff)
downloadbdl-d56cbdb065fa12d9e2bec375f65ef67d611c61bb.tar.gz
bdl-d56cbdb065fa12d9e2bec375f65ef67d611c61bb.zip
Add array types and array symbol access
Diffstat (limited to 'src')
-rw-r--r--src/main.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index 558e0fc..57d09bd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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("\"];");