sig
  module Graph :
    sig
      type graph
      type vertex
      exception Edge_not_unique
      val create : unit -> Pxp_dfa.Graph.graph
      val new_vertex : Pxp_dfa.Graph.graph -> Pxp_dfa.Graph.vertex
      val new_edge :
        Pxp_dfa.Graph.vertex -> string -> Pxp_dfa.Graph.vertex -> unit
      val union : Pxp_dfa.Graph.graph -> Pxp_dfa.Graph.graph -> unit
      val outgoing_edges :
        Pxp_dfa.Graph.vertex -> (string * Pxp_dfa.Graph.vertex) list
      val follow_edge :
        Pxp_dfa.Graph.vertex -> string -> Pxp_dfa.Graph.vertex
      val ingoing_edges :
        Pxp_dfa.Graph.vertex -> (Pxp_dfa.Graph.vertex * string) list
    end
  module VertexSet :
    sig
      type elt = Graph.vertex
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  type dfa_definition = {
    dfa_graph : Pxp_dfa.Graph.graph;
    dfa_start : Pxp_dfa.Graph.vertex;
    dfa_stops : Pxp_dfa.VertexSet.t;
    dfa_null : bool;
  }
  val dfa_of_regexp_content_model :
    Pxp_core_types.regexp_spec -> Pxp_dfa.dfa_definition
end