/** * Code string, either provided as part of an AST, * or the result of a compilation operation */ export type Code = string; /** Name of a variable */ export type VariableName = string; /** Name of a type */ export type TypeName = string; /** Base type for all AST elements */ export interface AstElementBase { astType: string; } export type AstElement = AstSequence | AstVar | AstConstVar | AstFunc | AstClass; export type AstSequenceContent = AstVar | AstConstVar | AstFunc | AstClass | Code; export interface AstSequence extends AstElementBase { astType: 'Sequence'; content: Array; } export interface AstVarBase extends AstElementBase { name: VariableName; type: TypeName; value?: AstElement; } export interface AstVar extends AstVarBase { astType: 'Var'; } export interface AstConstVar extends AstVarBase { astType: 'ConstVar'; value: AstElement; } export interface AstFunc extends AstElementBase { astType: 'Func'; name: VariableName | null; args: Array; returnType: TypeName; body: AstSequence; } export interface AstClass extends AstElementBase { astType: 'Class'; name: VariableName; members: Array; }