import { Pos } from "./Token.ts"; import { VType } from "./vtypes.ts"; export type UnaryType = "not"; export type BinaryType = | "+" | "*" | "==" | "-" | "/" | "!=" | "<" | ">" | "<=" | ">=" | "or" | "and"; export type Param = { ident: string; etype?: EType; pos: Pos; vtype?: VType; }; export type Stmt = { kind: StmtKind; pos: Pos; vtype?: VType; id: number; }; export type StmtKind = | { type: "error" } | { type: "break"; expr?: Expr } | { type: "return"; expr?: Expr } | { type: "fn"; ident: string; params: Param[]; returnType?: EType; body: Expr; } | { type: "let"; param: Param; value: Expr } | { type: "assign"; subject: Expr; value: Expr } | { type: "expr"; expr: Expr }; export type Expr = { kind: ExprKind; pos: Pos; vtype?: VType; id: number; }; export type ExprKind = | { type: "error" } | { type: "int"; value: number } | { type: "string"; value: string } | { type: "ident"; value: string } | { type: "group"; expr: Expr } | { type: "field"; subject: Expr; value: string } | { type: "index"; subject: Expr; value: Expr } | { type: "call"; subject: Expr; args: Expr[] } | { type: "unary"; unaryType: UnaryType; subject: Expr } | { type: "binary"; binaryType: BinaryType; left: Expr; right: Expr } | { type: "if"; cond: Expr; truthy: Expr; falsy?: Expr } | { type: "bool"; value: boolean } | { type: "null" } | { type: "loop"; body: Expr } | { type: "block"; stmts: Stmt[]; expr?: Expr } | { type: "sym"; ident: string; defType: "let" | "fn" | "fn_param" | "builtin"; stmt?: Stmt; param?: Param; }; export type Sym = { ident: string; type: "let" | "fn" | "fn_param" | "builtin"; pos?: Pos; stmt?: Stmt; param?: Param; }; export type EType = { kind: ETypeKind; pos: Pos; id: number; }; export type ETypeKind = | { type: "error" } | { type: "ident"; value: string } | { type: "array"; inner: EType } | { type: "struct"; fields: Param[] };