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