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