allocators and type aliases

This commit is contained in:
nora 2023-08-03 13:22:35 +02:00
parent 60c743d656
commit f05e5520f3
16 changed files with 283 additions and 121 deletions

View file

@ -31,6 +31,7 @@ import {
ItemId,
GlobalItem,
StructLiteralField,
TypeDefKind,
} from "./ast";
import { CompilerError, LoadedFile, Span } from "./error";
import {
@ -107,32 +108,46 @@ function parseItem(t: State): [State, Item<Parsed>] {
let name;
[t, name] = expectNext<TokenIdent>(t, "identifier");
[t] = expectNext(t, "=");
[t] = expectNext(t, "{");
let fields;
[t, fields] = parseCommaSeparatedList<FieldDef<Parsed>>(t, "}", (t) => {
let name;
[t, name] = expectNext<TokenIdent>(t, "identifier");
[t] = expectNext(t, ":");
let type;
[t, type] = parseType(t);
return [
t,
{
name: {
name: name.ident,
span: name.span,
let type: TypeDefKind<Parsed>;
let struct;
[t, struct] = eat(t, "struct");
if (struct) {
[t] = expectNext(t, "{");
let fields;
[t, fields] = parseCommaSeparatedList<FieldDef<Parsed>>(t, "}", (t) => {
let name;
[t, name] = expectNext<TokenIdent>(t, "identifier");
[t] = expectNext(t, ":");
let type;
[t, type] = parseType(t);
return [
t,
{
name: {
name: name.ident,
span: name.span,
},
type,
},
type,
},
];
});
];
});
type = { kind: "struct", fields };
} else {
let aliased: Type<Parsed>;
[t, aliased] = parseType(t);
type = { kind: "alias", type: aliased };
}
[t] = expectNext(t, ";");
const def: TypeDef<Parsed> = {
name: name.ident,
fields,
type,
};
return [