aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-18 10:02:38 +0200
committerBad Diode <bd@badd10de.dev>2024-06-18 10:02:38 +0200
commit9c3837060d1089131b351761db97544db8738de3 (patch)
treec76087681b4a947dece76be90161c0a89918abd3 /src
parentf392b0818e651ece33cec091eac0639883a126ec (diff)
downloadbdl-9c3837060d1089131b351761db97544db8738de3.tar.gz
bdl-9c3837060d1089131b351761db97544db8738de3.zip
Add struct literals
Diffstat (limited to 'src')
-rw-r--r--src/main.c67
1 files changed, 33 insertions, 34 deletions
diff --git a/src/main.c b/src/main.c
index 3466f44..558e0fc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -113,11 +113,11 @@ Str node_str[] = {
113 [NODE_TRUE] = cstr("TRUE"), 113 [NODE_TRUE] = cstr("TRUE"),
114 [NODE_FALSE] = cstr("FALSE"), 114 [NODE_FALSE] = cstr("FALSE"),
115 [NODE_NIL] = cstr("NIL"), 115 [NODE_NIL] = cstr("NIL"),
116 [NODE_STRUCT_LIT] = cstr("STRUCT LITERAL"), 116 [NODE_STRUCT_LIT] = cstr("STRUCT LIT"),
117 // Keywords. 117 // Keywords.
118 [NODE_LET] = cstr("LET"), 118 [NODE_LET] = cstr("LET"),
119 [NODE_SET] = cstr("SET"), 119 [NODE_SET] = cstr("SET"),
120 [NODE_STRUCT] = cstr("STRUCT"), 120 [NODE_STRUCT] = cstr("STRUCT DEF"),
121 // Helpers. 121 // Helpers.
122 [NODE_TYPE] = cstr("TYPE"), 122 [NODE_TYPE] = cstr("TYPE"),
123 [NODE_COMPOUND_TYPE] = cstr("COMPOUND TYPE"), 123 [NODE_COMPOUND_TYPE] = cstr("COMPOUND TYPE"),
@@ -154,10 +154,7 @@ typedef struct Node {
154 struct Node *field_type; 154 struct Node *field_type;
155 struct Node *field_val; 155 struct Node *field_val;
156 }; 156 };
157 struct { 157 struct Node **struct_field;
158 struct Node *struct_name;
159 struct Node **struct_field;
160 };
161 struct Node **elements; 158 struct Node **elements;
162 }; 159 };
163} Node; 160} Node;
@@ -391,28 +388,6 @@ parse_literal(Parser *parser) {
391 array_push(parser->nodes, node, parser->storage); 388 array_push(parser->nodes, node, parser->storage);
392} 389}
393 390
394// Node *
395// parse_struct_field(Parser *parser) {
396// #if DEBUG == 1
397// println("parsing struct field ");
398// print_token(parser->previous);
399// #endif
400// parse_consume(parser, TOK_SYMBOL, cstr("expected struct field name"));
401// parse_symbol(parser);
402// Node *field = array_pop(parser->nodes);
403// parse_consume(parser, TOK_COLON,
404// cstr("invalid type name given for struct field"));
405// field->right = parse_type(parser);
406// if (parse_match(parser, TOK_ASSIGN)) {
407// parse_expr(parser, PREC_LOW);
408// field->left = array_pop(parser->nodes);
409// }
410
411// Node *list = node_alloc(NODE_NODE_LIST, parser->previous, parser);
412// list->left = field;
413// return list;
414// }
415
416void 391void
417parse_type(Parser *parser) { 392parse_type(Parser *parser) {
418 Token prev = parser->previous; 393 Token prev = parser->previous;
@@ -458,6 +433,11 @@ parse_keyword(Parser *parser) {
458 cstr("expected symbol name on let expression")); 433 cstr("expected symbol name on let expression"));
459 parse_symbol(parser); 434 parse_symbol(parser);
460 node->var_name = array_pop(parser->nodes); 435 node->var_name = array_pop(parser->nodes);
436 if (node->var_name->next) {
437 parse_emit_err(parser, prev,
438 cstr("invalid symbol name in let expression"));
439 return;
440 }
461 441
462 // Optional type declaration. 442 // Optional type declaration.
463 if (parse_match(parser, TOK_COLON)) { 443 if (parse_match(parser, TOK_COLON)) {
@@ -488,8 +468,8 @@ parse_keyword(Parser *parser) {
488 if (!node) return; 468 if (!node) return;
489 parse_consume(parser, TOK_SYMBOL, 469 parse_consume(parser, TOK_SYMBOL,
490 cstr("expected symbol name on struct definition")); 470 cstr("expected symbol name on struct definition"));
491 parse_symbol(parser); 471 // Just consume this to avoid conflicts with struct literals.
492 node->struct_name = array_pop(parser->nodes); 472 node->value.sym = parser->previous.val;
493 473
494 parse_consume(parser, TOK_LCURLY, 474 parse_consume(parser, TOK_LCURLY,
495 cstr("expected '{' on struct definition")); 475 cstr("expected '{' on struct definition"));
@@ -503,6 +483,11 @@ parse_keyword(Parser *parser) {
503 cstr("expected symbol name on struct definition")); 483 cstr("expected symbol name on struct definition"));
504 parse_symbol(parser); 484 parse_symbol(parser);
505 field->field_name = array_pop(parser->nodes); 485 field->field_name = array_pop(parser->nodes);
486 if (field->field_name->next) {
487 parse_emit_err(parser, prev,
488 cstr("invalid symbol name in struct field"));
489 return;
490 }
506 parse_consume( 491 parse_consume(
507 parser, TOK_COLON, 492 parser, TOK_COLON,
508 cstr("expected symbol name on struct definition")); 493 cstr("expected symbol name on struct definition"));
@@ -636,6 +621,22 @@ parse_symbol(Parser *parser) {
636 if (!node) return; 621 if (!node) return;
637 parse_symbol(parser); 622 parse_symbol(parser);
638 node->next = array_pop(parser->nodes); 623 node->next = array_pop(parser->nodes);
624 } else if (parse_match(parser, TOK_LCURLY)) {
625 // Struct literal.
626 node = node_alloc(parser, NODE_STRUCT_LIT, prev);
627 if (!node) return;
628
629 while (!parse_match(parser, TOK_RCURLY) && !parser->panic) {
630 Node *field =
631 node_alloc(parser, NODE_STRUCT_FIELD, parser->current);
632 parse_consume(parser, TOK_SYMBOL, cstr("expected symbol name"));
633 parse_symbol(parser);
634 field->field_name = array_pop(parser->nodes);
635 parse_consume(parser, TOK_ASSIGN, cstr("expected assignment"));
636 parse_expr(parser, PREC_LOW);
637 field->field_type = array_pop(parser->nodes);
638 array_push(node->elements, field, parser->storage);
639 }
639 } else { 640 } else {
640 node = node_alloc(parser, NODE_SYMBOL, prev); 641 node = node_alloc(parser, NODE_SYMBOL, prev);
641 if (!node) return; 642 if (!node) return;
@@ -667,6 +668,7 @@ graph_node(Node *node) {
667 case NODE_NUM_FLOAT: print("| Value: %f{2}", node->value.d); break; 668 case NODE_NUM_FLOAT: print("| Value: %f{2}", node->value.d); break;
668 case NODE_STRING: print("| Value: %s", node->value.str); break; 669 case NODE_STRING: print("| Value: %s", node->value.str); break;
669 case NODE_SYMBOL: print("| Value: %s", node->value.sym); break; 670 case NODE_SYMBOL: print("| Value: %s", node->value.sym); break;
671 case NODE_STRUCT: print("| Value: %s", node->value.sym); break;
670 case NODE_STRUCT_LIT: print("| Value: %s", node->value.sym); break; 672 case NODE_STRUCT_LIT: print("| Value: %s", node->value.sym); break;
671 case NODE_TYPE: print("| Value: %s", node->value.sym); break; 673 case NODE_TYPE: print("| Value: %s", node->value.sym); break;
672 default: break; 674 default: break;
@@ -674,6 +676,7 @@ graph_node(Node *node) {
674 println("\"];"); 676 println("\"];");
675 677
676 switch (node->kind) { 678 switch (node->kind) {
679 case NODE_STRUCT_LIT:
677 case NODE_COMPOUND_TYPE: { 680 case NODE_COMPOUND_TYPE: {
678 for (sz i = 0; i < array_size(node->elements); i++) { 681 for (sz i = 0; i < array_size(node->elements); i++) {
679 Node *next = node->elements[i]; 682 Node *next = node->elements[i];
@@ -682,10 +685,6 @@ graph_node(Node *node) {
682 } 685 }
683 } break; 686 } break;
684 case NODE_STRUCT: { 687 case NODE_STRUCT: {
685 if (node->struct_name) {
686 println("%d:e->%d:w;", node->id, node->struct_name->id);
687 graph_node(node->struct_name);
688 }
689 for (sz i = 0; i < array_size(node->struct_field); i++) { 688 for (sz i = 0; i < array_size(node->struct_field); i++) {
690 Node *next = node->struct_field[i]; 689 Node *next = node->struct_field[i];
691 println("%d:e->%d:w;", node->id, next->id); 690 println("%d:e->%d:w;", node->id, next->id);