sig
  module type Id = Ast_smtlib.Id
  module type Term = Ast_smtlib.Term
  module type Statement = Ast_smtlib.Statement
  module Make :
    functor
      (L : ParseLocation.S) (I : Id) (T : sig
                                            type t
                                            val const : ?loc:L.t -> I.t -> t
                                            val int : ?loc:L.t -> string -> t
                                            val real :
                                              ?loc:L.t -> string -> t
                                            val hexa :
                                              ?loc:L.t -> string -> t
                                            val binary :
                                              ?loc:L.t -> string -> t
                                            val colon :
                                              ?loc:L.t -> t -> t -> t
                                            val apply :
                                              ?loc:L.t -> t -> t list -> t
                                            val letin :
                                              ?loc:L.t -> t list -> t -> t
                                            val forall :
                                              ?loc:L.t -> t list -> t -> t
                                            val exists :
                                              ?loc:L.t -> t list -> t -> t
                                            val sexpr :
                                              ?loc:L.t -> t list -> t
                                            val annot :
                                              ?loc:L.t -> t -> t list -> t
                                          end) (S : sig
                                                      type t
                                                      val pop :
                                                        ?loc:L.t -> int -> t
                                                      val push :
                                                        ?loc:L.t -> int -> t
                                                      val assert_ :
                                                        ?loc:L.t -> T.t -> t
                                                      val check_sat :
                                                        ?loc:L.t -> unit -> t
                                                      val set_logic :
                                                        ?loc:L.t ->
                                                        string -> t
                                                      val get_info :
                                                        ?loc:L.t ->
                                                        string -> t
                                                      val set_info :
                                                        ?loc:L.t ->
                                                        string * T.t option ->
                                                        t
                                                      val get_option :
                                                        ?loc:L.t ->
                                                        string -> t
                                                      val set_option :
                                                        ?loc:L.t ->
                                                        string * T.t option ->
                                                        t
                                                      val type_decl :
                                                        ?loc:L.t ->
                                                        I.t -> int -> t
                                                      val type_def :
                                                        ?loc:L.t ->
                                                        I.t ->
                                                        I.t list -> T.t -> t
                                                      val fun_decl :
                                                        ?loc:L.t ->
                                                        I.t ->
                                                        T.t list -> T.t -> t
                                                      val fun_def :
                                                        ?loc:L.t ->
                                                        I.t ->
                                                        T.t list ->
                                                        T.t -> T.t -> t
                                                      val get_proof :
                                                        ?loc:L.t -> unit -> t
                                                      val get_unsat_core :
                                                        ?loc:L.t -> unit -> t
                                                      val get_value :
                                                        ?loc:L.t ->
                                                        T.t list -> t
                                                      val get_assignment :
                                                        ?loc:L.t -> unit -> t
                                                      val get_assertions :
                                                        ?loc:L.t -> unit -> t
                                                      val exit :
                                                        ?loc:L.t -> unit -> t
                                                    end->
      sig
        type token
        type statement = S.t
        module Lexer :
          sig exception Error val token : Lexing.lexbuf -> token end
        module Parser :
          sig
            exception Error
            val file :
              (Lexing.lexbuf -> token) -> Lexing.lexbuf -> statement list
            val input :
              (Lexing.lexbuf -> token) -> Lexing.lexbuf -> statement option
            module MenhirInterpreter :
              sig
                type token = token
                type env
                type production
                type 'a checkpoint = private
                    InputNeeded of env
                  | Shifting of env * env * bool
                  | AboutToReduce of env * production
                  | HandlingError of env
                  | Accepted of 'a
                  | Rejected
                val offer :
                  'a checkpoint ->
                  token * Lexing.position * Lexing.position -> 'a checkpoint
                val resume : 'a checkpoint -> 'a checkpoint
                type supplier =
                    unit -> token * Lexing.position * Lexing.position
                val lexer_lexbuf_to_supplier :
                  (Lexing.lexbuf -> token) -> Lexing.lexbuf -> supplier
                val loop : supplier -> 'a checkpoint -> 'a
                val loop_handle :
                  ('-> 'answer) ->
                  ('a checkpoint -> 'answer) ->
                  supplier -> 'a checkpoint -> 'answer
                val loop_handle_undo :
                  ('-> 'answer) ->
                  ('a checkpoint -> 'a checkpoint -> 'answer) ->
                  supplier -> 'a checkpoint -> 'answer
                val loop_test :
                  (env -> 'accu -> 'accu) -> 'a checkpoint -> 'accu -> 'accu
                val acceptable :
                  'a checkpoint -> token -> Lexing.position -> bool
                type 'a lr1state
                val number : 'a lr1state -> int
                type element =
                    Element : 'a lr1state * 'a * Lexing.position *
                      Lexing.position -> element
                type stack = element MenhirLib.General.stream
                val stack : env -> stack
                val positions : env -> Lexing.position * Lexing.position
                val has_default_reduction : env -> bool
              end
            module Incremental :
              sig
                val input :
                  Lexing.position ->
                  statement option MenhirInterpreter.checkpoint
              end
          end
        val find : ?dir:string -> string -> string option
        val parse_file : string -> statement list
        val parse_input :
          [ `File of string | `Stdin ] -> unit -> statement option
      end
end