sig
  class ['a] cursor :
    int ->
    object ('b)
      val position_ : int
      method advance : '-> 'b
      method error : int -> ('a * 'b) Cf_seq.t -> unit
      method position : int
    end
  module type Symbol_T =
    sig
      type t
      val size : int
      val to_int : Cf_dfa.Symbol_T.t -> int
      val of_int : int -> Cf_dfa.Symbol_T.t
    end
  module type T =
    sig
      module S : Symbol_T
      type ('a, 'b) t = ('a, S.t, 'b) Cf_parser.X.t
        constraint 'a = S.t #Cf_dfa.cursor
      type expr_t
      type ('a, 'b) rule_t constraint 'a = S.t #Cf_dfa.cursor
      val nil : Cf_dfa.T.expr_t
      module Op :
        sig
          val ( $| ) : Cf_dfa.T.expr_t -> Cf_dfa.T.expr_t -> Cf_dfa.T.expr_t
          val ( $& ) : Cf_dfa.T.expr_t -> Cf_dfa.T.expr_t -> Cf_dfa.T.expr_t
          val ( !* ) : Cf_dfa.T.expr_t -> Cf_dfa.T.expr_t
          val ( !+ ) : Cf_dfa.T.expr_t -> Cf_dfa.T.expr_t
          val ( !? ) : Cf_dfa.T.expr_t -> Cf_dfa.T.expr_t
          val ( !: ) : S.t -> Cf_dfa.T.expr_t
          val ( !^ ) : (S.t -> bool) -> Cf_dfa.T.expr_t
          val ( !~ ) : S.t Cf_seq.t -> Cf_dfa.T.expr_t
          val ( $= ) :
            Cf_dfa.T.expr_t -> '-> (S.t #Cf_dfa.cursor, 'a) Cf_dfa.T.rule_t
          val ( $> ) :
            Cf_dfa.T.expr_t ->
            (S.t Cf_seq.t -> 'a) -> (S.t #Cf_dfa.cursor, 'a) Cf_dfa.T.rule_t
          val ( $@ ) :
            Cf_dfa.T.expr_t ->
            (int -> (S.t #Cf_dfa.cursor as 'a, 'b) Cf_dfa.T.t) ->
            ('a, 'b) Cf_dfa.T.rule_t
          val ( !@ ) :
            (S.t #Cf_dfa.cursor as 'a, 'b) Cf_dfa.T.rule_t list ->
            ('a, 'b) Cf_dfa.T.rule_t
        end
      val create :
        (S.t #Cf_dfa.cursor as 'a, 'b) Cf_dfa.T.rule_t -> ('a, 'b) Cf_dfa.T.t
    end
  module Create :
    functor (S : Symbol_T->
      sig
        module S :
          sig
            type t = S.t
            val size : int
            val to_int : t -> int
            val of_int : int -> t
          end
        type ('a, 'b) t = ('a, S.t, 'b) Cf_parser.X.t
          constraint 'a = S.t #cursor
        type expr_t
        type ('a, 'b) rule_t constraint 'a = S.t #cursor
        val nil : expr_t
        module Op :
          sig
            val ( $| ) : expr_t -> expr_t -> expr_t
            val ( $& ) : expr_t -> expr_t -> expr_t
            val ( !* ) : expr_t -> expr_t
            val ( !+ ) : expr_t -> expr_t
            val ( !? ) : expr_t -> expr_t
            val ( !: ) : S.t -> expr_t
            val ( !^ ) : (S.t -> bool) -> expr_t
            val ( !~ ) : S.t Cf_seq.t -> expr_t
            val ( $= ) : expr_t -> '-> (S.t #cursor, 'a) rule_t
            val ( $> ) :
              expr_t -> (S.t Cf_seq.t -> 'a) -> (S.t #cursor, 'a) rule_t
            val ( $@ ) :
              expr_t -> (int -> (S.t #cursor as 'a, 'b) t) -> ('a, 'b) rule_t
            val ( !@ ) :
              (S.t #cursor as 'a, 'b) rule_t list -> ('a, 'b) rule_t
          end
        val create : (S.t #cursor as 'a, 'b) rule_t -> ('a, 'b) t
      end
end