Change syntax back to "enum(...)" and "struct(...)"

This commit is contained in:
Bruce Hill 2024-02-18 02:07:12 -05:00
parent 16e663941a
commit e5f706b258
2 changed files with 51 additions and 49 deletions

10
parse.c
View File

@ -1429,7 +1429,7 @@ PARSER(parse_struct_def) {
if (!name) parser_err(ctx, start, pos, "I expected a name for this struct");
spaces(&pos);
if (!match(&pos, "{"))
if (!match(&pos, "("))
parser_err(ctx, pos, pos, "I expected a '(' and a list of fields here");
arg_ast_t *fields = parse_args(ctx, &pos, false);
@ -1449,7 +1449,7 @@ PARSER(parse_struct_def) {
}
}
expect_closing(ctx, &pos, "}", "I wasn't able to parse the rest of this struct");
expect_closing(ctx, &pos, ")", "I wasn't able to parse the rest of this struct");
const char *ns_pos = pos;
whitespace(&ns_pos);
@ -1474,7 +1474,7 @@ ast_t *parse_enum_def(parse_ctx_t *ctx, const char *pos) {
if (!name)
parser_err(ctx, start, pos, "I expected a name for this enum");
spaces(&pos);
if (!match(&pos, "[")) return NULL;
if (!match(&pos, "(")) return NULL;
tag_ast_t *tags = NULL;
int64_t next_value = 0;
@ -1518,7 +1518,7 @@ ast_t *parse_enum_def(parse_ctx_t *ctx, const char *pos) {
}
whitespace(&pos);
expect_closing(ctx, &pos, "]", "I wasn't able to parse the rest of this enum definition");
expect_closing(ctx, &pos, ")", "I wasn't able to parse the rest of this enum definition");
REVERSE_LIST(tags);
@ -1729,7 +1729,7 @@ ast_t *parse_file(file_t *file, jmp_buf *on_err) {
pos = ast->end;
whitespace(&pos);
if (pos < file->text + file->len) {
parser_err(&ctx, pos, pos + strlen(pos), "I couldn't parse this part of the file %zu");
parser_err(&ctx, pos, pos + strlen(pos), "I couldn't parse this part of the file");
}
return ast;
}

90
types.c
View File

@ -38,22 +38,23 @@ CORD type_to_cord(type_t *t) {
}
case StructType: {
auto struct_ = Match(t, StructType);
CORD c = CORD_asprintf("%s{", struct_->name);
int64_t i = 1;
for (arg_t *field = struct_->fields; field; field = field->next) {
const char *fname = field->name ? field->name : heap_strf("_%lu", i);
++i;
if (fname && !streq(fname, heap_strf("_%lu", i+1)))
c = CORD_cat(CORD_cat(c, fname), ":");
else
c = CORD_cat(c, ":");
return struct_->name;
// CORD c = CORD_asprintf("%s(", struct_->name);
// int64_t i = 1;
// for (arg_t *field = struct_->fields; field; field = field->next) {
// const char *fname = field->name ? field->name : heap_strf("_%lu", i);
// ++i;
// if (fname && !streq(fname, heap_strf("_%lu", i+1)))
// c = CORD_cat(CORD_cat(c, fname), ":");
// else
// c = CORD_cat(c, ":");
c = CORD_cat(c, type_to_cord(field->type));
// c = CORD_cat(c, type_to_cord(field->type));
if (field->next) c = CORD_cat(c, ", ");
}
c = CORD_cat(c, "}");
return c;
// if (field->next) c = CORD_cat(c, ", ");
// }
// c = CORD_cat(c, ")");
// return c;
}
case PointerType: {
auto ptr = Match(t, PointerType);
@ -63,40 +64,41 @@ CORD type_to_cord(type_t *t) {
}
case EnumType: {
auto tagged = Match(t, EnumType);
return tagged->name;
CORD c = CORD_asprintf("%s[", tagged->name);
int64_t next_tag = 0;
for (tag_t *tag = tagged->tags; tag; tag = tag->next) {
// name, tag_value, type
c = CORD_cat(c, tag->name);
if (tag->type) {
c = CORD_cat(c, "(");
auto struct_ = Match(tag->type, StructType);
int64_t i = 1;
for (arg_t *field = struct_->fields; field; field = field->next) {
if (field->name && !streq(field->name, heap_strf("_%lu", i)))
c = CORD_cat(CORD_cat(c, field->name), ":");
// CORD c = CORD_asprintf("%s(", tagged->name);
// int64_t next_tag = 0;
// for (tag_t *tag = tagged->tags; tag; tag = tag->next) {
// // name, tag_value, type
// c = CORD_cat(c, tag->name);
// if (tag->type) {
// c = CORD_cat(c, "(");
// auto struct_ = Match(tag->type, StructType);
// int64_t i = 1;
// for (arg_t *field = struct_->fields; field; field = field->next) {
// if (field->name && !streq(field->name, heap_strf("_%lu", i)))
// c = CORD_cat(CORD_cat(c, field->name), ":");
CORD fstr = type_to_cord(field->type);
c = CORD_cat(c, fstr);
if (field->next) c = CORD_cat(c, ",");
++i;
}
c = CORD_cat(c, ")");
}
// CORD fstr = type_to_cord(field->type);
// c = CORD_cat(c, fstr);
// if (field->next) c = CORD_cat(c, ",");
// ++i;
// }
// c = CORD_cat(c, ")");
// }
if (tag->tag_value != next_tag) {
CORD_sprintf(&c, "%r=%ld", c, tag->tag_value);
next_tag = tag->tag_value + 1;
} else {
++next_tag;
}
// if (tag->tag_value != next_tag) {
// CORD_sprintf(&c, "%r=%ld", c, tag->tag_value);
// next_tag = tag->tag_value + 1;
// } else {
// ++next_tag;
// }
if (tag->next)
c = CORD_cat(c, ", ");
}
c = CORD_cat(c, "]");
return c;
// if (tag->next)
// c = CORD_cat(c, ", ");
// }
// c = CORD_cat(c, ")");
// return c;
}
case PlaceholderType: {
return Match(t, PlaceholderType)->name;