diff options
author | Bad Diode <bd@badd10de.dev> | 2024-06-18 10:02:38 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-06-18 10:02:38 +0200 |
commit | 9c3837060d1089131b351761db97544db8738de3 (patch) | |
tree | c76087681b4a947dece76be90161c0a89918abd3 /src | |
parent | f392b0818e651ece33cec091eac0639883a126ec (diff) | |
download | bdl-9c3837060d1089131b351761db97544db8738de3.tar.gz bdl-9c3837060d1089131b351761db97544db8738de3.zip |
Add struct literals
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 67 |
1 files changed, 33 insertions, 34 deletions
@@ -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 | |||
416 | void | 391 | void |
417 | parse_type(Parser *parser) { | 392 | parse_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); |