sig
  module type S =
    sig
      module Loc : Sig.Loc
      module Token :
        sig
          module Loc :
            sig
              type t = Loc.t
              val mk : string -> t
              val ghost : t
              val of_lexing_position : Lexing.position -> t
              val to_ocaml_location : t -> Camlp4_import.Location.t
              val of_ocaml_location : Camlp4_import.Location.t -> t
              val of_lexbuf : Lexing.lexbuf -> t
              val of_tuple :
                string * int * int * int * int * int * int * bool -> t
              val to_tuple :
                t -> string * int * int * int * int * int * int * bool
              val merge : t -> t -> t
              val join : t -> t
              val move : [ `both | `start | `stop ] -> int -> t -> t
              val shift : int -> t -> t
              val move_line : int -> t -> t
              val file_name : t -> string
              val start_line : t -> int
              val stop_line : t -> int
              val start_bol : t -> int
              val stop_bol : t -> int
              val start_off : t -> int
              val stop_off : t -> int
              val start_pos : t -> Lexing.position
              val stop_pos : t -> Lexing.position
              val is_ghost : t -> bool
              val ghostify : t -> t
              val set_file_name : string -> t -> t
              val strictly_before : t -> t -> bool
              val make_absolute : t -> t
              val print : Format.formatter -> t -> unit
              val dump : Format.formatter -> t -> unit
              val to_string : t -> string
              exception Exc_located of t * exn
              val raise : t -> exn -> 'a
              val name : string ref
            end
          type t
          val to_string : t -> string
          val print : Format.formatter -> t -> unit
          val match_keyword : string -> t -> bool
          val extract_string : t -> string
          module Filter :
            sig
              type token_filter = (t, Loc.t) Sig.stream_filter
              type t
              val mk : (string -> bool) -> t
              val define_filter : t -> (token_filter -> token_filter) -> unit
              val filter : t -> token_filter
              val keyword_added : t -> string -> bool -> unit
              val keyword_removed : t -> string -> unit
            end
          module Error : Sig.Error
        end
      module Lexer :
        sig
          module Loc :
            sig
              type t = Loc.t
              val mk : string -> t
              val ghost : t
              val of_lexing_position : Lexing.position -> t
              val to_ocaml_location : t -> Camlp4_import.Location.t
              val of_ocaml_location : Camlp4_import.Location.t -> t
              val of_lexbuf : Lexing.lexbuf -> t
              val of_tuple :
                string * int * int * int * int * int * int * bool -> t
              val to_tuple :
                t -> string * int * int * int * int * int * int * bool
              val merge : t -> t -> t
              val join : t -> t
              val move : [ `both | `start | `stop ] -> int -> t -> t
              val shift : int -> t -> t
              val move_line : int -> t -> t
              val file_name : t -> string
              val start_line : t -> int
              val stop_line : t -> int
              val start_bol : t -> int
              val stop_bol : t -> int
              val start_off : t -> int
              val stop_off : t -> int
              val start_pos : t -> Lexing.position
              val stop_pos : t -> Lexing.position
              val is_ghost : t -> bool
              val ghostify : t -> t
              val set_file_name : string -> t -> t
              val strictly_before : t -> t -> bool
              val make_absolute : t -> t
              val print : Format.formatter -> t -> unit
              val dump : Format.formatter -> t -> unit
              val to_string : t -> string
              exception Exc_located of t * exn
              val raise : t -> exn -> 'a
              val name : string ref
            end
          module Token :
            sig
              module Loc :
                sig
                  type t = Loc.t
                  val mk : string -> t
                  val ghost : t
                  val of_lexing_position : Lexing.position -> t
                  val to_ocaml_location : t -> Camlp4_import.Location.t
                  val of_ocaml_location : Camlp4_import.Location.t -> t
                  val of_lexbuf : Lexing.lexbuf -> t
                  val of_tuple :
                    string * int * int * int * int * int * int * bool -> t
                  val to_tuple :
                    t -> string * int * int * int * int * int * int * bool
                  val merge : t -> t -> t
                  val join : t -> t
                  val move : [ `both | `start | `stop ] -> int -> t -> t
                  val shift : int -> t -> t
                  val move_line : int -> t -> t
                  val file_name : t -> string
                  val start_line : t -> int
                  val stop_line : t -> int
                  val start_bol : t -> int
                  val stop_bol : t -> int
                  val start_off : t -> int
                  val stop_off : t -> int
                  val start_pos : t -> Lexing.position
                  val stop_pos : t -> Lexing.position
                  val is_ghost : t -> bool
                  val ghostify : t -> t
                  val set_file_name : string -> t -> t
                  val strictly_before : t -> t -> bool
                  val make_absolute : t -> t
                  val print : Format.formatter -> t -> unit
                  val dump : Format.formatter -> t -> unit
                  val to_string : t -> string
                  exception Exc_located of t * exn
                  val raise : t -> exn -> 'a
                  val name : string ref
                end
              type t = Token.t
              val to_string : t -> string
              val print : Format.formatter -> t -> unit
              val match_keyword : string -> t -> bool
              val extract_string : t -> string
              module Filter :
                sig
                  type token_filter = (t, Loc.t) Sig.stream_filter
                  type t = Token.Filter.t
                  val mk : (string -> bool) -> t
                  val define_filter :
                    t -> (token_filter -> token_filter) -> unit
                  val filter : t -> token_filter
                  val keyword_added : t -> string -> bool -> unit
                  val keyword_removed : t -> string -> unit
                end
              module Error :
                sig
                  type t = Token.Error.t
                  exception E of t
                  val to_string : t -> string
                  val print : Format.formatter -> t -> unit
                end
            end
          module Error : Sig.Error
          val mk :
            unit -> Loc.t -> char Stream.t -> (Token.t * Loc.t) Stream.t
        end
      module Action : Sig.Grammar.Action
      type gram = {
        gfilter : Camlp4.Struct.Grammar.Structure.S.Token.Filter.t;
        gkeywords : (string, int Pervasives.ref) Hashtbl.t;
        glexer :
          Camlp4.Struct.Loc.t ->
          char Stream.t ->
          (Camlp4.Struct.Grammar.Structure.S.Token.t * Camlp4.Struct.Loc.t)
          Stream.t;
        warning_verbose : bool Pervasives.ref;
        error_verbose : bool Pervasives.ref;
      }
      type token_info = {
        prev_loc : Camlp4.Struct.Loc.t;
        cur_loc : Camlp4.Struct.Loc.t;
      }
      type token_stream =
          (Camlp4.Struct.Grammar.Structure.S.Token.t *
           Camlp4.Struct.Grammar.Structure.S.token_info)
          Stream.t
      type efun = Camlp4.Struct.Grammar.Structure.S.token_stream -> Action.t
      type token_pattern =
          (Camlp4.Struct.Grammar.Structure.S.Token.t -> bool) * string
      type internal_entry = {
        egram : Camlp4.Struct.Grammar.Structure.S.gram;
        ename : string;
        mutable estart : int -> Camlp4.Struct.Grammar.Structure.S.efun;
        mutable econtinue :
          int ->
          Camlp4.Struct.Loc.t ->
          Action.t -> Camlp4.Struct.Grammar.Structure.S.efun;
        mutable edesc : Camlp4.Struct.Grammar.Structure.S.desc;
      }
      and desc =
          Dlevels of Camlp4.Struct.Grammar.Structure.S.level list
        | Dparser of
            (Camlp4.Struct.Grammar.Structure.S.token_stream -> Action.t)
      and level = {
        assoc : Camlp4.Sig.Grammar.assoc;
        lname : string option;
        lsuffix : Camlp4.Struct.Grammar.Structure.S.tree;
        lprefix : Camlp4.Struct.Grammar.Structure.S.tree;
      }
      and symbol =
          Smeta of string * Camlp4.Struct.Grammar.Structure.S.symbol list *
            Action.t
        | Snterm of Camlp4.Struct.Grammar.Structure.S.internal_entry
        | Snterml of Camlp4.Struct.Grammar.Structure.S.internal_entry *
            string
        | Slist0 of Camlp4.Struct.Grammar.Structure.S.symbol
        | Slist0sep of Camlp4.Struct.Grammar.Structure.S.symbol *
            Camlp4.Struct.Grammar.Structure.S.symbol
        | Slist1 of Camlp4.Struct.Grammar.Structure.S.symbol
        | Slist1sep of Camlp4.Struct.Grammar.Structure.S.symbol *
            Camlp4.Struct.Grammar.Structure.S.symbol
        | Sopt of Camlp4.Struct.Grammar.Structure.S.symbol
        | Stry of Camlp4.Struct.Grammar.Structure.S.symbol
        | Sself
        | Snext
        | Stoken of Camlp4.Struct.Grammar.Structure.S.token_pattern
        | Skeyword of string
        | Stree of Camlp4.Struct.Grammar.Structure.S.tree
      and tree =
          Node of Camlp4.Struct.Grammar.Structure.S.node
        | LocAct of Action.t * Action.t list
        | DeadEnd
      and node = {
        node : Camlp4.Struct.Grammar.Structure.S.symbol;
        son : Camlp4.Struct.Grammar.Structure.S.tree;
        brother : Camlp4.Struct.Grammar.Structure.S.tree;
      }
      type production_rule =
          Camlp4.Struct.Grammar.Structure.S.symbol list * Action.t
      type single_extend_statment =
          string option * Camlp4.Sig.Grammar.assoc option *
          Camlp4.Struct.Grammar.Structure.S.production_rule list
      type extend_statment =
          Camlp4.Sig.Grammar.position option *
          Camlp4.Struct.Grammar.Structure.S.single_extend_statment list
      type delete_statment = Camlp4.Struct.Grammar.Structure.S.symbol list
      type ('a, 'b, 'c) fold =
          Camlp4.Struct.Grammar.Structure.S.internal_entry ->
          Camlp4.Struct.Grammar.Structure.S.symbol list ->
          ('Stream.t -> 'b) -> 'Stream.t -> 'c
      type ('a, 'b, 'c) foldsep =
          Camlp4.Struct.Grammar.Structure.S.internal_entry ->
          Camlp4.Struct.Grammar.Structure.S.symbol list ->
          ('Stream.t -> 'b) -> ('Stream.t -> unit) -> 'Stream.t -> 'c
      val get_filter :
        Camlp4.Struct.Grammar.Structure.S.gram ->
        Camlp4.Struct.Grammar.Structure.S.Token.Filter.t
      val using : Camlp4.Struct.Grammar.Structure.S.gram -> string -> unit
      val removing : Camlp4.Struct.Grammar.Structure.S.gram -> string -> unit
    end
  module Make :
    functor (Lexer : Sig.Lexer->
      sig
        module Loc :
          sig
            type t = Lexer.Loc.t
            val mk : string -> t
            val ghost : t
            val of_lexing_position : Lexing.position -> t
            val to_ocaml_location : t -> Camlp4_import.Location.t
            val of_ocaml_location : Camlp4_import.Location.t -> t
            val of_lexbuf : Lexing.lexbuf -> t
            val of_tuple :
              string * int * int * int * int * int * int * bool -> t
            val to_tuple :
              t -> string * int * int * int * int * int * int * bool
            val merge : t -> t -> t
            val join : t -> t
            val move : [ `both | `start | `stop ] -> int -> t -> t
            val shift : int -> t -> t
            val move_line : int -> t -> t
            val file_name : t -> string
            val start_line : t -> int
            val stop_line : t -> int
            val start_bol : t -> int
            val stop_bol : t -> int
            val start_off : t -> int
            val stop_off : t -> int
            val start_pos : t -> Lexing.position
            val stop_pos : t -> Lexing.position
            val is_ghost : t -> bool
            val ghostify : t -> t
            val set_file_name : string -> t -> t
            val strictly_before : t -> t -> bool
            val make_absolute : t -> t
            val print : Format.formatter -> t -> unit
            val dump : Format.formatter -> t -> unit
            val to_string : t -> string
            exception Exc_located of t * exn
            val raise : t -> exn -> 'a
            val name : string ref
          end
        module Token :
          sig
            module Loc :
              sig
                type t = Lexer.Loc.t
                val mk : string -> t
                val ghost : t
                val of_lexing_position : Lexing.position -> t
                val to_ocaml_location : t -> Camlp4_import.Location.t
                val of_ocaml_location : Camlp4_import.Location.t -> t
                val of_lexbuf : Lexing.lexbuf -> t
                val of_tuple :
                  string * int * int * int * int * int * int * bool -> t
                val to_tuple :
                  t -> string * int * int * int * int * int * int * bool
                val merge : t -> t -> t
                val join : t -> t
                val move : [ `both | `start | `stop ] -> int -> t -> t
                val shift : int -> t -> t
                val move_line : int -> t -> t
                val file_name : t -> string
                val start_line : t -> int
                val stop_line : t -> int
                val start_bol : t -> int
                val stop_bol : t -> int
                val start_off : t -> int
                val stop_off : t -> int
                val start_pos : t -> Lexing.position
                val stop_pos : t -> Lexing.position
                val is_ghost : t -> bool
                val ghostify : t -> t
                val set_file_name : string -> t -> t
                val strictly_before : t -> t -> bool
                val make_absolute : t -> t
                val print : Format.formatter -> t -> unit
                val dump : Format.formatter -> t -> unit
                val to_string : t -> string
                exception Exc_located of t * exn
                val raise : t -> exn -> 'a
                val name : string ref
              end
            type t = Lexer.Token.t
            val to_string : t -> string
            val print : Format.formatter -> t -> unit
            val match_keyword : string -> t -> bool
            val extract_string : t -> string
            module Filter :
              sig
                type token_filter = (t, Loc.t) Sig.stream_filter
                type t = Lexer.Token.Filter.t
                val mk : (string -> bool) -> t
                val define_filter :
                  t -> (token_filter -> token_filter) -> unit
                val filter : t -> token_filter
                val keyword_added : t -> string -> bool -> unit
                val keyword_removed : t -> string -> unit
              end
            module Error :
              sig
                type t = Lexer.Token.Error.t
                exception E of t
                val to_string : t -> string
                val print : Format.formatter -> t -> unit
              end
          end
        module Action : Sig.Grammar.Action
        module Lexer :
          sig
            module Loc :
              sig
                type t = Lexer.Loc.t
                val mk : string -> t
                val ghost : t
                val of_lexing_position : Lexing.position -> t
                val to_ocaml_location : t -> Camlp4_import.Location.t
                val of_ocaml_location : Camlp4_import.Location.t -> t
                val of_lexbuf : Lexing.lexbuf -> t
                val of_tuple :
                  string * int * int * int * int * int * int * bool -> t
                val to_tuple :
                  t -> string * int * int * int * int * int * int * bool
                val merge : t -> t -> t
                val join : t -> t
                val move : [ `both | `start | `stop ] -> int -> t -> t
                val shift : int -> t -> t
                val move_line : int -> t -> t
                val file_name : t -> string
                val start_line : t -> int
                val stop_line : t -> int
                val start_bol : t -> int
                val stop_bol : t -> int
                val start_off : t -> int
                val stop_off : t -> int
                val start_pos : t -> Lexing.position
                val stop_pos : t -> Lexing.position
                val is_ghost : t -> bool
                val ghostify : t -> t
                val set_file_name : string -> t -> t
                val strictly_before : t -> t -> bool
                val make_absolute : t -> t
                val print : Format.formatter -> t -> unit
                val dump : Format.formatter -> t -> unit
                val to_string : t -> string
                exception Exc_located of t * exn
                val raise : t -> exn -> 'a
                val name : string ref
              end
            module Token :
              sig
                module Loc :
                  sig
                    type t = Loc.t
                    val mk : string -> t
                    val ghost : t
                    val of_lexing_position : Lexing.position -> t
                    val to_ocaml_location : t -> Camlp4_import.Location.t
                    val of_ocaml_location : Camlp4_import.Location.t -> t
                    val of_lexbuf : Lexing.lexbuf -> t
                    val of_tuple :
                      string * int * int * int * int * int * int * bool -> t
                    val to_tuple :
                      t -> string * int * int * int * int * int * int * bool
                    val merge : t -> t -> t
                    val join : t -> t
                    val move : [ `both | `start | `stop ] -> int -> t -> t
                    val shift : int -> t -> t
                    val move_line : int -> t -> t
                    val file_name : t -> string
                    val start_line : t -> int
                    val stop_line : t -> int
                    val start_bol : t -> int
                    val stop_bol : t -> int
                    val start_off : t -> int
                    val stop_off : t -> int
                    val start_pos : t -> Lexing.position
                    val stop_pos : t -> Lexing.position
                    val is_ghost : t -> bool
                    val ghostify : t -> t
                    val set_file_name : string -> t -> t
                    val strictly_before : t -> t -> bool
                    val make_absolute : t -> t
                    val print : Format.formatter -> t -> unit
                    val dump : Format.formatter -> t -> unit
                    val to_string : t -> string
                    exception Exc_located of t * exn
                    val raise : t -> exn -> 'a
                    val name : string ref
                  end
                type t = Lexer.Token.t
                val to_string : t -> string
                val print : Format.formatter -> t -> unit
                val match_keyword : string -> t -> bool
                val extract_string : t -> string
                module Filter :
                  sig
                    type token_filter = (t, Loc.t) Sig.stream_filter
                    type t = Lexer.Token.Filter.t
                    val mk : (string -> bool) -> t
                    val define_filter :
                      t -> (token_filter -> token_filter) -> unit
                    val filter : t -> token_filter
                    val keyword_added : t -> string -> bool -> unit
                    val keyword_removed : t -> string -> unit
                  end
                module Error :
                  sig
                    type t = Lexer.Token.Error.t
                    exception E of t
                    val to_string : t -> string
                    val print : Format.formatter -> t -> unit
                  end
              end
            module Error :
              sig
                type t = Lexer.Error.t
                exception E of t
                val to_string : t -> string
                val print : Format.formatter -> t -> unit
              end
            val mk :
              unit -> Loc.t -> char Stream.t -> (Token.t * Loc.t) Stream.t
          end
        type gram = {
          gfilter : Camlp4.Struct.Grammar.Structure.Make.Token.Filter.t;
          gkeywords : (string, int Pervasives.ref) Hashtbl.t;
          glexer :
            Camlp4.Struct.Grammar.Structure.Make.Loc.t ->
            char Stream.t ->
            (Camlp4.Struct.Grammar.Structure.Make.Token.t *
             Camlp4.Struct.Grammar.Structure.Make.Loc.t)
            Stream.t;
          warning_verbose : bool Pervasives.ref;
          error_verbose : bool Pervasives.ref;
        }
        type token_info = {
          prev_loc : Camlp4.Struct.Grammar.Structure.Make.Loc.t;
          cur_loc : Camlp4.Struct.Grammar.Structure.Make.Loc.t;
        }
        type token_stream =
            (Camlp4.Struct.Grammar.Structure.Make.Token.t *
             Camlp4.Struct.Grammar.Structure.Make.token_info)
            Stream.t
        type efun =
            Camlp4.Struct.Grammar.Structure.Make.token_stream -> Action.t
        type token_pattern =
            (Camlp4.Struct.Grammar.Structure.Make.Token.t -> bool) * string
        type internal_entry = {
          egram : Camlp4.Struct.Grammar.Structure.Make.gram;
          ename : string;
          mutable estart : int -> Camlp4.Struct.Grammar.Structure.Make.efun;
          mutable econtinue :
            int ->
            Camlp4.Struct.Grammar.Structure.Make.Loc.t ->
            Action.t -> Camlp4.Struct.Grammar.Structure.Make.efun;
          mutable edesc : Camlp4.Struct.Grammar.Structure.Make.desc;
        }
        and desc =
            Dlevels of Camlp4.Struct.Grammar.Structure.Make.level list
          | Dparser of
              (Camlp4.Struct.Grammar.Structure.Make.token_stream -> Action.t)
        and level = {
          assoc : Camlp4.Sig.Grammar.assoc;
          lname : string option;
          lsuffix : Camlp4.Struct.Grammar.Structure.Make.tree;
          lprefix : Camlp4.Struct.Grammar.Structure.Make.tree;
        }
        and symbol =
            Smeta of string *
              Camlp4.Struct.Grammar.Structure.Make.symbol list * Action.t
          | Snterm of Camlp4.Struct.Grammar.Structure.Make.internal_entry
          | Snterml of Camlp4.Struct.Grammar.Structure.Make.internal_entry *
              string
          | Slist0 of Camlp4.Struct.Grammar.Structure.Make.symbol
          | Slist0sep of Camlp4.Struct.Grammar.Structure.Make.symbol *
              Camlp4.Struct.Grammar.Structure.Make.symbol
          | Slist1 of Camlp4.Struct.Grammar.Structure.Make.symbol
          | Slist1sep of Camlp4.Struct.Grammar.Structure.Make.symbol *
              Camlp4.Struct.Grammar.Structure.Make.symbol
          | Sopt of Camlp4.Struct.Grammar.Structure.Make.symbol
          | Stry of Camlp4.Struct.Grammar.Structure.Make.symbol
          | Sself
          | Snext
          | Stoken of Camlp4.Struct.Grammar.Structure.Make.token_pattern
          | Skeyword of string
          | Stree of Camlp4.Struct.Grammar.Structure.Make.tree
        and tree =
            Node of Camlp4.Struct.Grammar.Structure.Make.node
          | LocAct of Action.t * Action.t list
          | DeadEnd
        and node = {
          node : Camlp4.Struct.Grammar.Structure.Make.symbol;
          son : Camlp4.Struct.Grammar.Structure.Make.tree;
          brother : Camlp4.Struct.Grammar.Structure.Make.tree;
        }
        type production_rule =
            Camlp4.Struct.Grammar.Structure.Make.symbol list * Action.t
        type single_extend_statment =
            string option * Camlp4.Sig.Grammar.assoc option *
            Camlp4.Struct.Grammar.Structure.Make.production_rule list
        type extend_statment =
            Camlp4.Sig.Grammar.position option *
            Camlp4.Struct.Grammar.Structure.Make.single_extend_statment list
        type delete_statment =
            Camlp4.Struct.Grammar.Structure.Make.symbol list
        type ('a, 'b, 'c) fold =
            Camlp4.Struct.Grammar.Structure.Make.internal_entry ->
            Camlp4.Struct.Grammar.Structure.Make.symbol list ->
            ('Stream.t -> 'b) -> 'Stream.t -> 'c
        type ('a, 'b, 'c) foldsep =
            Camlp4.Struct.Grammar.Structure.Make.internal_entry ->
            Camlp4.Struct.Grammar.Structure.Make.symbol list ->
            ('Stream.t -> 'b) -> ('Stream.t -> unit) -> 'Stream.t -> 'c
        val get_filter :
          Camlp4.Struct.Grammar.Structure.Make.gram ->
          Camlp4.Struct.Grammar.Structure.Make.Token.Filter.t
        val token_location :
          Camlp4.Struct.Grammar.Structure.Make.token_info ->
          Camlp4.Struct.Grammar.Structure.Make.Loc.t
        type 'a not_filtered = 'a
        val using :
          Camlp4.Struct.Grammar.Structure.Make.gram -> string -> unit
        val removing :
          Camlp4.Struct.Grammar.Structure.Make.gram -> string -> unit
      end
end