sig
  type 'a or_error = [ `Error of string | `Ok of 'a ]
  type line_num = int
  type col_num = int
  exception ParseError of CCParse.line_num * CCParse.col_num *
              (unit -> string)
  module MemoTbl : sig type t val create : int -> CCParse.MemoTbl.t end
  type input = {
    is_done : unit -> bool;
    cur : unit -> char;
    next : unit -> char;
    pos : unit -> int;
    lnum : unit -> CCParse.line_num;
    cnum : unit -> CCParse.col_num;
    memo : CCParse.MemoTbl.t;
    backtrack : int -> unit;
    sub : int -> int -> string;
  }
  val input_of_string : string -> CCParse.input
  val input_of_chan : ?size:int -> Pervasives.in_channel -> CCParse.input
  type 'a t = CCParse.input -> ok:('-> unit) -> err:(exn -> unit) -> unit
  val return : '-> 'CCParse.t
  val pure : '-> 'CCParse.t
  val ( >|= ) : 'CCParse.t -> ('-> 'b) -> 'CCParse.t
  val ( >>= ) : 'CCParse.t -> ('-> 'CCParse.t) -> 'CCParse.t
  val ( <*> ) : ('-> 'b) CCParse.t -> 'CCParse.t -> 'CCParse.t
  val ( <* ) : 'CCParse.t -> 'CCParse.t -> 'CCParse.t
  val ( *> ) : 'CCParse.t -> 'CCParse.t -> 'CCParse.t
  val fail : string -> 'CCParse.t
  val eoi : unit CCParse.t
  val nop : unit CCParse.t
  val char : char -> char CCParse.t
  val char_if : (char -> bool) -> char CCParse.t
  val chars_if : (char -> bool) -> string CCParse.t
  val chars1_if : (char -> bool) -> string CCParse.t
  val endline : char CCParse.t
  val space : char CCParse.t
  val white : char CCParse.t
  val skip_chars : (char -> bool) -> unit CCParse.t
  val skip_space : unit CCParse.t
  val skip_white : unit CCParse.t
  val is_alpha : char -> bool
  val is_num : char -> bool
  val is_alpha_num : char -> bool
  val is_space : char -> bool
  val is_white : char -> bool
  val ( ~~~ ) : (char -> bool) -> char -> bool
  val ( ||| ) : (char -> bool) -> (char -> bool) -> char -> bool
  val ( &&& ) : (char -> bool) -> (char -> bool) -> char -> bool
  val ( <|> ) : 'CCParse.t -> 'CCParse.t -> 'CCParse.t
  val string : string -> string CCParse.t
  val many : 'CCParse.t -> 'a list CCParse.t
  val many1 : 'CCParse.t -> 'a list CCParse.t
  val skip : 'CCParse.t -> unit CCParse.t
  val sep : by:'CCParse.t -> 'CCParse.t -> 'a list CCParse.t
  val sep1 : by:'CCParse.t -> 'CCParse.t -> 'a list CCParse.t
  val fix : ('CCParse.t -> 'CCParse.t) -> 'CCParse.t
  val memo : 'CCParse.t -> 'CCParse.t
  val fix_memo : ('CCParse.t -> 'CCParse.t) -> 'CCParse.t
  val parse : input:CCParse.input -> p:'CCParse.t -> 'CCParse.or_error
  val parse_exn : input:CCParse.input -> p:'CCParse.t -> 'a
  val parse_string : string -> p:'CCParse.t -> 'CCParse.or_error
  val parse_string_exn : string -> p:'CCParse.t -> 'a
  val parse_file :
    ?size:int -> file:string -> p:'CCParse.t -> 'CCParse.or_error
  val parse_file_exn : ?size:int -> file:string -> p:'CCParse.t -> 'a
  module U :
    sig
      val list :
        ?start:string ->
        ?stop:string -> ?sep:string -> 'CCParse.t -> 'a list CCParse.t
      val int : int CCParse.t
      val word : string CCParse.t
      val map : ('-> 'b) -> 'CCParse.t -> 'CCParse.t
      val map2 :
        ('-> '-> 'c) -> 'CCParse.t -> 'CCParse.t -> 'CCParse.t
      val map3 :
        ('-> '-> '-> 'd) ->
        'CCParse.t -> 'CCParse.t -> 'CCParse.t -> 'CCParse.t
      val pair :
        ?start:string ->
        ?stop:string ->
        ?sep:string -> 'CCParse.t -> 'CCParse.t -> ('a * 'b) CCParse.t
      val triple :
        ?start:string ->
        ?stop:string ->
        ?sep:string ->
        'CCParse.t ->
        'CCParse.t -> 'CCParse.t -> ('a * 'b * 'c) CCParse.t
    end
end