sig
  module VarMap :
    sig
      type key = string
      type +'a t
      val empty : 'a t
      val is_empty : 'a t -> bool
      val add : key -> '-> 'a t -> 'a t
      val find : key -> 'a t -> 'a
      val remove : key -> 'a t -> 'a t
      val mem : key -> 'a t -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val map : ('-> 'b) -> 'a t -> 'b t
      val mapi : (key -> '-> 'b) -> 'a t -> 'b t
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val compare : ('-> '-> int) -> 'a t -> 'a t -> int
      val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
    end
  type varmap_t = string Flx_mtypes2.VarMap.t
  module TypecodeSet :
    sig
      type elt = Flx_ast.typecode_t
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  type typecodeset_t = Flx_mtypes2.TypecodeSet.t
  val typecodeset_of_list :
    Flx_mtypes2.TypecodeSet.elt list -> Flx_mtypes2.TypecodeSet.t
  val typecodeset_map :
    (Flx_mtypes2.TypecodeSet.elt -> Flx_mtypes2.TypecodeSet.elt) ->
    Flx_mtypes2.TypecodeSet.t -> Flx_mtypes2.TypecodeSet.t
  module PosSet :
    sig
      type elt = int
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  module PosSetSet :
    sig
      type elt = PosSet.t
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  module CharSet :
    sig
      type elt = int
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  type instance_registry_t =
      (int * Flx_types.btypecode_t list, int) Hashtbl.t
  type felix_compiler_options_t = {
    print_flag : bool;
    debug : bool;
    optimise : bool;
    trace : bool;
    include_dirs : string list;
    files : string list;
    raw_options : (string * string) list;
    reverse_return_parity : bool;
    max_inline_length : int;
    compile_only : bool;
    force_recompile : bool;
  }
  type sym_state_t = {
    dfns : Flx_types.symbol_table_t;
    counter : int Pervasives.ref;
    varmap : Flx_types.typevarmap_t;
    ticache : (int, Flx_types.btypecode_t) Hashtbl.t;
    glr_cache : (int, Flx_types.btypecode_t) Hashtbl.t;
    env_cache : (int, Flx_types.env_t) Hashtbl.t;
    registry : Flx_types.type_registry_t;
    compiler_options : Flx_mtypes2.felix_compiler_options_t;
    instances : Flx_mtypes2.instance_registry_t;
    include_files : string list Pervasives.ref;
    roots : Flx_mtypes1.IntSet.t Pervasives.ref;
    wrappers : (int, int) Hashtbl.t;
    lexers : (int * Flx_types.tbexpr_t, int) Hashtbl.t;
    parsers : (int * Flx_types.btypecode_t * int list, int) Hashtbl.t;
  }
end