module CCParse:sig
..end
open CCParse;;
type tree = L of int | N of tree * tree;;
let mk_leaf x = L x
let mk_node x y = N(x,y)
let ptree = fix @@ fun self ->
skip_space *>
( (try_ (char '(') *> (pure mk_node <*> self <*> self) <* char ')')
<|>
(U.int >|= mk_leaf) )
;;
parse_string_exn ptree "(1 (2 3))" ;;
parse_string_exn ptree "((1 2) (3 (4 5)))" ;;
open Containers.Parse;;
let p = U.list ~sep:"," U.word;;
parse_string_exn p "[abc , de, hello ,world ]";;
let p = CCParse.(U.list ~sep:"," U.int);;
let l = CCList.(1 -- 100_000);;
let l_printed =
CCFormat.(to_string (within "[" "]" (list ~sep:(return ",@,") int))) l;;
let l' = CCParse.parse_string_exn p l_printed;;
assert (l=l');;
type'a
or_error =('a, string) Result.result
typeline_num =
int
typecol_num =
int
type
parse_branch
val string_of_branch : parse_branch -> string
exception ParseError of parse_branch * (unit -> string)
type
position
type
state
val state_of_string : string -> state
type'a
t =state -> ok:('a -> unit) -> err:(exn -> unit) -> unit
ok
to call with the result when it's doneerr
to call when the parser met an errorParseError
in case of failureval return : 'a -> 'a t
val pure : 'a -> 'a t
CCParse.return
val (>|=) : 'a t -> ('a -> 'b) -> 'b t
val map : ('a -> 'b) -> 'a t -> 'b t
val map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t
val map3 : ('a -> 'b -> 'c -> 'd) ->
'a t -> 'b t -> 'c t -> 'd t
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t
val (<*>) : ('a -> 'b) t -> 'a t -> 'b t
val ( <* ) : 'a t -> 'b t -> 'a t
a <* b
parses a
into x
, parses b
and ignores its result,
and returns x
val ( *> ) : 'b t -> 'a t -> 'a t
a *> b
parses a
, then parses b
into x
, and returns x
. The
results of a
is ignored.val fail : string -> 'a t
fail msg
fails with the given message. It can trigger a backtrackval failf : ('a, unit, string, 'b t) Pervasives.format4 -> 'a
val parsing : string -> 'a t -> 'a t
parsing s p
behaves the same as p
, with the information that
we are parsing s
, if p
failsval eoi : unit t
val nop : unit t
()
val char : char -> char t
char c
parses the char c
and nothing elseval char_if : (char -> bool) -> char t
char_if f
parses a character c
if f c = true
val chars_if : (char -> bool) -> string t
chars_if f
parses a string of chars that satisfy f
val chars1_if : (char -> bool) -> string t
CCParse.chars_if
, but only non-empty stringsval endline : char t
val space : char t
val white : char t
val skip_chars : (char -> bool) -> unit t
val skip_space : unit t
val skip_white : unit 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 (<|>) : 'a t -> 'a t -> 'a t
a <|> b
tries to parse a
, and if a
fails without
consuming any input, backtracks and tries
to parse b
, otherwise it fails as a
.
See CCParse.try_
to ensure a
does not consume anything (but it is best
to avoid wrapping large parsers with CCParse.try_
)val (<?>) : 'a t -> string -> 'a t
a <?> msg
behaves like a
, but if a
fails without
consuming any input, it fails with msg
instead. Useful as the last choice in a series of <|>
:
a <|> b <|> c <?> "expected a|b|c"
val try_ : 'a t -> 'a t
try_ p
tries to parse like p
, but backtracks if p
fails.
Useful in combination with <|>
val suspend : (unit -> 'a t) -> 'a t
suspend f
is the same as f ()
, but evaluates f ()
only
when neededval string : string -> string t
string s
parses exactly the string s
, and nothing elseval many : 'a t -> 'a list t
many p
parses a list of p
, eagerly (as long as possible)val many1 : 'a t -> 'a list t
val skip : 'a t -> unit t
skip p
parses zero or more times p
and ignores its resultval sep : by:'b t -> 'a t -> 'a list t
sep ~by p
parses a list of p
separated by by
val sep1 : by:'b t -> 'a t -> 'a list t
sep1 ~by p
parses a non empty list of p
, separated by by
val fix : ('a t -> 'a t) -> 'a t
val memo : 'a t -> 'a t
memo p
will behave like p
, but when called
in a state (read: position in input) it has already processed, memo p
returns a result directly. The implementation uses an underlying
hashtable.
This can be costly in memory, but improve the run time a lot if there
is a lot of backtracking involving p
.
This function is not thread-safe.
val fix_memo : ('a t -> 'a t) -> 'a t
CCParse.fix
, but the fixpoint is memoized.val get_lnum : int t
val get_cnum : int t
val get_pos : (int * int) t
Those functions have a label ~p
on the parser, since 0.14.
val parse : 'a t -> state -> 'a or_error
parse p st
applies p
on the input, and returns Ok x
if
p
succeeds with x
, or Error s
otherwiseval parse_exn : 'a t -> state -> 'a
val parse_string : 'a t -> string -> 'a or_error
CCParse.parse
for string inputsval parse_string_exn : 'a t -> string -> 'a
ParseError
if it failsval parse_file : 'a t -> string -> 'a or_error
parse_file p file
parses file
with p
by opening the file
and reading it whole.val parse_file_exn : 'a t -> string -> 'a
ParseError
if it failsmodule Infix:sig
..end
This is useful to parse OCaml-like values in a simple way.
module U:sig
..end