128 lines
2.6 KiB
TypeScript
128 lines
2.6 KiB
TypeScript
import { Position } from "./token.ts";
|
|
|
|
export type UnaryType =
|
|
| "negate"
|
|
| "log_not"
|
|
| "bit_not"
|
|
| "addressof"
|
|
| "dereference";
|
|
|
|
export type BinaryType =
|
|
| "add"
|
|
| "subtract"
|
|
| "log_and"
|
|
| "log_or"
|
|
| "bit_and"
|
|
| "bit_or"
|
|
| "bit_xor"
|
|
| "equal"
|
|
| "inequal"
|
|
| "lt"
|
|
| "gt"
|
|
| "ltequal"
|
|
| "gtequal";
|
|
|
|
export type AssignType =
|
|
| "equal"
|
|
| "add"
|
|
| "subtract"
|
|
| "and"
|
|
| "or"
|
|
| "xor";
|
|
|
|
export type ParsedExpr =
|
|
& {
|
|
pos: Position;
|
|
}
|
|
& ({ exprType: "error"; message: string } | {
|
|
exprType: "unit";
|
|
} | {
|
|
exprType: "id";
|
|
value: string;
|
|
} | {
|
|
exprType: "int";
|
|
value: number;
|
|
} | {
|
|
exprType: "if";
|
|
condition: ParsedExpr;
|
|
truthy: ParsedExpr;
|
|
falsy: ParsedExpr | null;
|
|
} | {
|
|
exprType: "block";
|
|
body: ParsedExpr[];
|
|
value: ParsedExpr | null;
|
|
} | {
|
|
exprType: "call";
|
|
subject: ParsedExpr;
|
|
args: ParsedExpr[];
|
|
} | {
|
|
exprType: "index";
|
|
subject: ParsedExpr;
|
|
value: ParsedExpr;
|
|
} | {
|
|
exprType: "increment" | "decrement";
|
|
subject: ParsedExpr;
|
|
} | {
|
|
exprType: "unary";
|
|
unaryType: UnaryType;
|
|
subject: ParsedExpr;
|
|
} | {
|
|
exprType: "binary";
|
|
binaryType: BinaryType;
|
|
left: ParsedExpr;
|
|
right: ParsedExpr;
|
|
} | {
|
|
exprType: "assign";
|
|
assignType: AssignType;
|
|
subject: ParsedExpr;
|
|
value: ParsedExpr;
|
|
} | {
|
|
exprType: "let";
|
|
param: ParsedParameter;
|
|
value: ParsedExpr;
|
|
} | {
|
|
exprType: "fn";
|
|
subject: string;
|
|
params: ParsedParameter[];
|
|
returnType: ParsedType | null;
|
|
body: ParsedExpr;
|
|
} | {
|
|
exprType: "return";
|
|
value: ParsedExpr | null;
|
|
} | {
|
|
exprType: "loop";
|
|
body: ParsedExpr;
|
|
} | {
|
|
exprType: "while";
|
|
condition: ParsedExpr;
|
|
body: ParsedExpr;
|
|
} | {
|
|
exprType: "break";
|
|
} | {
|
|
exprType: "continue";
|
|
});
|
|
|
|
export type ParsedParameter =
|
|
& {
|
|
pos: Position;
|
|
}
|
|
& ({ paramType: "error"; message: string } | {
|
|
paramType: "value";
|
|
subject: string;
|
|
valueType: ParsedType | null;
|
|
mutable: boolean;
|
|
});
|
|
|
|
export type ParsedType =
|
|
& { pos: Position }
|
|
& ({ typeType: "error"; message: string } | {
|
|
typeType: "unit";
|
|
} | {
|
|
typeType: "id";
|
|
value: string;
|
|
} | {
|
|
typeType: "pointer";
|
|
subject: ParsedType;
|
|
mutable: boolean;
|
|
});
|