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