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