import { Literal } from "./literal"; import { AnyStaticType, Trait, Type } from "./type"; import { Predicate } from "./logic"; import { SimulationGoal } from "./goal"; declare type Metadata = number; declare type uint32 = number; export declare enum OpTag { DROP = 1, LET = 2, PUSH_VARIABLE = 3, PUSH_SELF = 4, PUSH_GLOBAL = 5, PUSH_LITERAL = 6, PUSH_RETURN = 7, PUSH_LIST = 8, PUSH_NEW = 9, PUSH_STATIC_TYPE = 10, PUSH_RECORD = 11, RECORD_AT_PUT = 12, PROJECT = 13, PROJECT_STATIC = 14, INTERPOLATE = 15, PUSH_LAZY = 16, FORCE = 17, PUSH_LAMBDA = 18, INVOKE_FOREIGN = 19, INVOKE = 20, APPLY = 21, RETURN = 22, PUSH_PARTIAL = 23, ASSERT = 24, BRANCH = 25, TYPE_TEST = 26, TRAIT_TEST = 27, INTRINSIC_EQUAL = 28, REGISTER_INSTANCE = 29, SEARCH = 30, MATCH_SEARCH = 31, FACT = 32, FORGET = 33, SIMULATE = 34, HANDLE = 35, PERFORM = 36, CONTINUE_WITH = 37, DSL = 38 } export declare enum AssertType { PRECONDITION = 1, POSTCONDITION = 2, RETURN_TYPE = 3, ASSERT = 4, UNREACHABLE = 5 } export declare class BasicBlock { readonly ops: Op[]; constructor(ops: Op[]); } export declare type Op = Drop | Let | PushVariable | PushSelf | PushGlobal | PushLiteral | PushReturn | PushList | PushNew | PushStaticType | PushRecord | RecordAtPut | Project | ProjectStatic | PushLazy | Force | Interpolate | PushLambda | InvokeForeign | Invoke | Apply | Return | PushPartial | Assert | Branch | TypeTest | TraitTest | IntrinsicEqual | RegisterInstance | Search | MatchSearch | Fact | Forget | Simulate | Handle | Perform | ContinueWith | Dsl; export declare abstract class BaseOp { abstract tag: OpTag; abstract meta: Metadata | null; } export declare class Drop extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.DROP; constructor(meta: Metadata); } export declare class Let extends BaseOp { readonly meta: Metadata; readonly name: string; readonly tag = OpTag.LET; constructor(meta: Metadata, name: string); } export declare class PushVariable extends BaseOp { readonly meta: Metadata; readonly name: string; readonly tag = OpTag.PUSH_VARIABLE; constructor(meta: Metadata, name: string); } export declare class PushSelf extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.PUSH_SELF; constructor(meta: Metadata); } export declare class PushGlobal extends BaseOp { readonly meta: Metadata; readonly name: string; readonly tag = OpTag.PUSH_GLOBAL; constructor(meta: Metadata, name: string); } export declare class PushLiteral extends BaseOp { readonly value: Literal; readonly tag = OpTag.PUSH_LITERAL; readonly meta: null; constructor(value: Literal); } export declare class PushReturn extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.PUSH_RETURN; constructor(meta: Metadata); } export declare class PushList extends BaseOp { readonly meta: Metadata; readonly arity: uint32; readonly tag = OpTag.PUSH_LIST; constructor(meta: Metadata, arity: uint32); } export declare class PushNew extends BaseOp { readonly meta: Metadata; readonly type: Type; readonly arity: uint32; readonly tag = OpTag.PUSH_NEW; constructor(meta: Metadata, type: Type, arity: uint32); } export declare class PushStaticType extends BaseOp { readonly meta: Metadata; readonly type: AnyStaticType; readonly tag = OpTag.PUSH_STATIC_TYPE; constructor(meta: Metadata, type: AnyStaticType); } export declare class PushRecord extends BaseOp { readonly meta: Metadata; readonly keys: string[]; readonly tag = OpTag.PUSH_RECORD; constructor(meta: Metadata, keys: string[]); } export declare class RecordAtPut extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.RECORD_AT_PUT; constructor(meta: Metadata); } export declare class Project extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.PROJECT; constructor(meta: Metadata); } export declare class ProjectStatic extends BaseOp { readonly meta: Metadata; readonly key: string; readonly tag = OpTag.PROJECT_STATIC; constructor(meta: Metadata, key: string); } export declare class PushLazy extends BaseOp { readonly meta: Metadata; readonly body: BasicBlock; readonly tag = OpTag.PUSH_LAZY; constructor(meta: Metadata, body: BasicBlock); } export declare class Force extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.FORCE; constructor(meta: Metadata); } export declare class Interpolate extends BaseOp { readonly meta: Metadata; readonly parts: (string | null)[]; readonly tag = OpTag.INTERPOLATE; constructor(meta: Metadata, parts: (string | null)[]); } export declare class PushLambda extends BaseOp { readonly meta: Metadata; readonly parameters: string[]; readonly body: BasicBlock; readonly tag = OpTag.PUSH_LAMBDA; constructor(meta: Metadata, parameters: string[], body: BasicBlock); } export declare class InvokeForeign extends BaseOp { readonly meta: Metadata; readonly name: string; readonly arity: uint32; readonly tag = OpTag.INVOKE_FOREIGN; constructor(meta: Metadata, name: string, arity: uint32); } export declare class Invoke extends BaseOp { readonly meta: Metadata; readonly name: string; readonly arity: uint32; readonly tag = OpTag.INVOKE; constructor(meta: Metadata, name: string, arity: uint32); } export declare class Apply extends BaseOp { readonly meta: Metadata; readonly arity: uint32; readonly tag = OpTag.APPLY; constructor(meta: Metadata, arity: uint32); } export declare class Return extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.RETURN; constructor(meta: Metadata); } export declare class PushPartial extends BaseOp { readonly meta: Metadata; readonly name: string; readonly arity: number; readonly tag = OpTag.PUSH_PARTIAL; constructor(meta: Metadata, name: string, arity: number); } export declare class Assert extends BaseOp { readonly meta: Metadata; readonly kind: AssertType; readonly assert_tag: string; readonly message: string; readonly expression: null | [string, string[]]; readonly tag = OpTag.ASSERT; constructor(meta: Metadata, kind: AssertType, assert_tag: string, message: string, expression: null | [string, string[]]); } export declare class Branch extends BaseOp { readonly meta: Metadata; readonly consequent: BasicBlock; readonly alternate: BasicBlock; readonly tag = OpTag.BRANCH; constructor(meta: Metadata, consequent: BasicBlock, alternate: BasicBlock); } export declare class TypeTest extends BaseOp { readonly meta: Metadata; readonly type: Type; readonly tag = OpTag.TYPE_TEST; constructor(meta: Metadata, type: Type); } export declare class TraitTest extends BaseOp { readonly meta: Metadata; readonly trait: Trait; readonly tag = OpTag.TRAIT_TEST; constructor(meta: Metadata, trait: Trait); } export declare class IntrinsicEqual extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.INTRINSIC_EQUAL; constructor(meta: Metadata); } export declare class RegisterInstance extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.REGISTER_INSTANCE; constructor(meta: Metadata); } export declare class Search extends BaseOp { readonly meta: Metadata; readonly predicate: Predicate; readonly tag = OpTag.SEARCH; constructor(meta: Metadata, predicate: Predicate); } export declare class MatchSearch extends BaseOp { readonly meta: Metadata; readonly block: BasicBlock; readonly alternate: BasicBlock; readonly tag = OpTag.MATCH_SEARCH; constructor(meta: Metadata, block: BasicBlock, alternate: BasicBlock); } export declare class Fact extends BaseOp { readonly meta: Metadata; readonly relation: string; readonly arity: uint32; readonly tag = OpTag.FACT; constructor(meta: Metadata, relation: string, arity: uint32); } export declare class Forget extends BaseOp { readonly meta: Metadata; readonly relation: string; readonly arity: uint32; readonly tag = OpTag.FORGET; constructor(meta: Metadata, relation: string, arity: uint32); } export declare class SimulationSignal { readonly meta: Metadata; readonly parameters: string[]; readonly name: string; readonly body: BasicBlock; constructor(meta: Metadata, parameters: string[], name: string, body: BasicBlock); } export declare class Simulate extends BaseOp { readonly meta: Metadata; readonly context: string | null; readonly goal: SimulationGoal; readonly signals: SimulationSignal[]; readonly tag = OpTag.SIMULATE; constructor(meta: Metadata, context: string | null, goal: SimulationGoal, signals: SimulationSignal[]); } export declare class Handle extends BaseOp { readonly meta: Metadata; readonly body: BasicBlock; readonly handlers: HandlerCase[]; readonly tag = OpTag.HANDLE; constructor(meta: Metadata, body: BasicBlock, handlers: HandlerCase[]); } export declare class HandlerCase { readonly meta: Metadata; readonly effect: string; readonly variant: string; readonly parameters: string[]; readonly block: BasicBlock; constructor(meta: Metadata, effect: string, variant: string, parameters: string[], block: BasicBlock); } export declare class Perform extends BaseOp { readonly meta: Metadata; readonly effect: string; readonly variant: string; readonly arity: number; readonly tag = OpTag.PERFORM; constructor(meta: Metadata, effect: string, variant: string, arity: number); } export declare class ContinueWith extends BaseOp { readonly meta: Metadata; readonly tag = OpTag.CONTINUE_WITH; constructor(meta: Metadata); } export declare class Dsl extends BaseOp { readonly meta: Metadata; readonly type: Type; readonly ast: DslNode[]; readonly tag = OpTag.DSL; constructor(meta: Metadata, type: Type, ast: DslNode[]); } export declare enum DslNodeTag { NODE = 1, LITERAL = 2, VARIABLE = 3, LIST = 4, INTERPOLATION = 5, EXPRESSION = 6 } export declare type DslNode = DslAstNode | DslAstLiteral | DslAstVariable | DslAstExpression | DslAstInterpolation | DslAstNodeList; export declare type DslMeta = { line: number; column: number; }; export declare class DslAstNode { readonly meta: DslMeta; readonly name: string; readonly children: DslNode[]; readonly attributes: Map; readonly tag = DslNodeTag.NODE; constructor(meta: DslMeta, name: string, children: DslNode[], attributes: Map); } export declare class DslAstLiteral { readonly meta: DslMeta; readonly value: Literal; readonly tag = DslNodeTag.LITERAL; constructor(meta: DslMeta, value: Literal); } export declare class DslAstVariable { readonly meta: DslMeta; readonly name: string; readonly tag = DslNodeTag.VARIABLE; constructor(meta: DslMeta, name: string); } export declare class DslAstNodeList { readonly meta: DslMeta; readonly children: DslNode[]; readonly tag = DslNodeTag.LIST; constructor(meta: DslMeta, children: DslNode[]); } export declare class DslAstExpression { readonly meta: DslMeta; readonly source: string; readonly value: BasicBlock; readonly tag = DslNodeTag.EXPRESSION; constructor(meta: DslMeta, source: string, value: BasicBlock); } export declare class DslAstInterpolation { readonly meta: DslMeta; readonly parts: DslInterpolationPart[]; readonly tag = DslNodeTag.INTERPOLATION; constructor(meta: DslMeta, parts: DslInterpolationPart[]); } export declare enum DslInterpolationTag { STATIC = 0, DYNAMIC = 1 } export declare type DslInterpolationPart = DslInterpolationStatic | DslInterpolationDynamic; export declare class DslInterpolationStatic { readonly text: string; readonly tag = DslInterpolationTag.STATIC; constructor(text: string); } export declare class DslInterpolationDynamic { readonly node: DslNode; readonly tag = DslInterpolationTag.DYNAMIC; constructor(node: DslNode); } export {};