type instr = | SELF of unit | LEFT of State.t | RIGHT of State.t type opcode = | OP_NOP of unit | OP_LEFT1 of State.t | OP_LEFT2 of State.t * State.t | OP_RIGHT1 of State.t | OP_RIGHT2 of State.t * State.t | OP_LEFT1_RIGHT1 of State.t * State.t | OP_LEFT2_RIGHT1 of State.t * State.t * State.t | OP_LEFT1_RIGHT2 of State.t * State.t * State.t | OP_LEFT2_RIGHT2 of State.t * State.t * State.t * State.t | OP_SELF of unit | OP_SELF_LEFT1 of State.t | OP_SELF_LEFT2 of State.t * State.t | OP_SELF_RIGHT1 of State.t | OP_SELF_RIGHT2 of State.t * State.t | OP_SELF_LEFT1_RIGHT1 of State.t * State.t | OP_SELF_LEFT2_RIGHT1 of State.t * State.t * State.t | OP_SELF_LEFT1_RIGHT2 of State.t * State.t * State.t | OP_SELF_LEFT2_RIGHT2 of State.t * State.t * State.t * State.t | OP_OTHER of instr array type code = Nil | Cons of State.t * opcode * code val compile : (State.t * instr list) list -> code * bool module type S = sig module NS : NodeSet.S type t = NS.t array val exec : t -> t -> t -> Tree.node -> code -> unit end module Count : sig module NS : NodeSet.S with type t = int type t = NS.t array val exec : t -> t -> t -> Tree.node -> code -> unit end module Mat : sig module NS : NodeSet.S with type t = Tree.node NodeSet.mat type t = NS.t array val exec : t -> t -> t -> Tree.node -> code -> unit end