X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=blobdiff_plain;f=csrc%2Foceani.mdc;h=e032a7d5a268e76c5f6e459e666859640fbcab22;hp=0605d97b4a82918ddf952f1cbb761748d8855a32;hb=68bdd0987d4fc7c888f8f416d14a6ec70e49a7a8;hpb=e2a65d5ff4140a6bb67fc38845ddabf7928789bd diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 0605d97..e032a7d 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -2917,24 +2917,31 @@ function will be needed. } ###### top level grammar - DeclareStruct -> struct IDENTIFIER FieldBlock Newlines ${ { - struct type *t; - t = find_type(c, $ID.txt); - if (!t) - t = add_type(c, $ID.txt, &structure_prototype); - else if (t->size >= 0) { + $*type + StructName -> IDENTIFIER ${ { + struct type *t = find_type(c, $ID.txt); + + if (t && t->size >= 0) { tok_err(c, "error: type already declared", &$ID); tok_err(c, "info: this is location of declartion", &t->first_use); - /* Create a new one - duplicate */ - t = add_type(c, $ID.txt, &structure_prototype); - } else { - struct type tmp = *t; - *t = structure_prototype; - t->name = tmp.name; - t->next = tmp.next; + t = NULL; } - t->structure.field_list = $first_use = $ID; + $0 = t; + } }$ + $void + DeclareStruct -> struct StructName FieldBlock Newlines ${ { + struct type *t = $name = tmp.name; + t->next = tmp.next; + t->first_use = tmp.first_use; + + t->structure.field_list = $first_use = $ID; + t = add_type(c, $ID.txt, NULL); // UNTESTED + t->first_use = $ID; // UNTESTED } $0 = find_anon_type(c, &reference_prototype, "@%.*s", $ID.txt.len, $ID.txt.txt);