Documentation
containers.string lib
CCParse
Module
Very Simple Parser CombinatorsExamples:
parse recursive structuresopen Containers_string.Parse;;
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 *>
( (char '(' *> (pure mk_node <*> self <*> self) <* char ')')
<|>
(U.int >|= mk_leaf) )
;;
parse_string_exn "(1 (2 3))" ptree;;
parse_string_exn "((1 2) (3 (4 5)))" ptree;;
Parse a list of wordsopen Containers_string.Parse;;
let p = U.list ~sep:"," U.word;;
parse_string_exn "[abc , de, hello ,world ]" p;;
type 'a or_error = [
| `Ok of 'a
| `Error of string
]
position * message
This type changed at 0.13
The type of input, which must allow for backtracking somehow. This type is unstable and its details might change.
input_of_chan ic
reads lazily the content of ic
as parsing goes. All content that is read is saved to an internal buffer for backtracking.
CombinatorsAlways succeeds, without consuming its input
val (>|=) : 'a t -> ('a -> 'b ) -> 'b t
val (>>=) : 'a t -> ('a -> 'b t ) -> 'b t
val (<*>) : ('a -> 'b ) t -> 'a t -> 'b t
val (<*) : 'a t -> _ t -> 'a t
a <* b
parses a
into x
, parses b
and ignores its result, and returns x
val (*>) : _ 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 backtrack
Expect the end of input, fails otherwise
val char : char -> char t
char c
parses the char c
and nothing else
val 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
Same as chars_if
, but only non-empty strings
val skip_chars : (char -> bool) -> unit t
Skip 0 or more chars satisfying the predicate
Skip ' ' and '\t' and '\n'
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
True on ' ' and '\t' and '\n'
val (~~~) : (char -> bool) -> char -> bool
val (|||) : (char -> bool) -> (char -> bool) -> char -> bool
Disjunction on predicates
val (&&&) : (char -> bool) -> (char -> bool) -> char -> bool
Conjunction on predicates
val (<|>) : 'a t -> 'a t -> 'a t
a <|> b
tries to parse a
, and if a
fails, backtracks and tries to parse b
. Therefore, it succeeds if either succeeds
val string : string -> string t
string s
parses exactly the string s
, and nothing else
val 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
skip p
parses p
and ignores its result
val sep : by :_ t -> 'a t -> 'a list t
sep ~by p
parses a list of p
separated by by
val sep1 : by :_ 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
Memoize the parser. 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
Same as fix
, but the fixpoint is memoized.
Parseparse ~input p
applies p
on the input, and returns `Ok x
if p
succeeds with x
, or `Error s
otherwise
val parse_exn : input :input -> 'a t -> 'a
val parse_string : string -> 'a t -> 'a or_error
Specialization of parse
for string inputs
val parse_string_exn : string -> 'a t -> 'a
val parse_file : ?size :int -> file :string -> 'a t -> 'a or_error
parse_file ~file p
parses file
with p
by opening the file and using input_of_chan
.
val parse_file_exn : ?size :int -> file :string -> 'a t -> 'a
Utils