module CCParse:sig..end
status still a bit unstable, the type 'a t might still change.
Examples:
open 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;;
open Containers_string.Parse;;
let p = U.list ~sep:"," U.word;;
parse_string_exn "[abc , de, hello ,world ]" p;;
let p = CCParse.(U.list ~sep:"," U.int);;
let l = CCList.(1 -- 100_000);;
let l_printed =
CCFormat.to_string (CCList.print ~sep:"," ~start:"[" ~stop:"]" CCInt.print) l;;
let l' = CCParse.parse_string_exn ~p l_printed;;
assert (l=l');;
type'aor_error =[ `Error of string | `Ok of 'a ]
typeline_num =int
typecol_num =int
exception ParseError of line_num * col_num * (unit -> string)
This type changed at 0.13
module MemoTbl:sig..end
type input = {
|
is_done : |
(* |
End of input?
| *) |
|
cur : |
(* |
Current char
| *) |
|
next : |
(* |
Returns current char;
if not
is_done, move to next char,
otherwise throw ParseError | *) |
|
pos : |
(* |
Current pos
| *) |
|
lnum : |
(* |
Line number
Since 0.13 | *) |
|
cnum : |
(* |
Column number
Since 0.13 | *) |
|
memo : |
(* |
Memoization table, if any
| *) |
|
backtrack : |
(* |
Restore to previous pos
| *) |
|
sub : |
(* | sub pos len extracts slice from pos with len | *) |
val input_of_string : string -> inputval input_of_chan : ?size:int -> Pervasives.in_channel -> inputinput_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.size : number of bytes read at once from ictype'at =input -> 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 tval pure : 'a -> 'a tCCParse.returnval (>|=) : 'a t -> ('a -> 'b) -> 'b tval (>>=) : 'a t -> ('a -> 'b t) -> 'b tval (<*>) : ('a -> 'b) t -> 'a t -> 'b tval ( <* ) : 'a t -> 'b t -> 'a ta <* b parses a into x, parses b and ignores its result,
and returns xval ( *> ) : 'b t -> 'a t -> 'a ta *> b parses a, then parses b into x, and returns x. The
results of a is ignored.val fail : string -> 'a tfail msg fails with the given message. It can trigger a backtrackval eoi : unit tval nop : unit t()val char : char -> char tchar c parses the char c and nothing elseval char_if : (char -> bool) -> char tchar_if f parses a character c if f c = trueval chars_if : (char -> bool) -> string tchars_if f parses a string of chars that satisfy fval chars1_if : (char -> bool) -> string tCCParse.chars_if, but only non-empty stringsval endline : char tval space : char tval white : char tval skip_chars : (char -> bool) -> unit tval skip_space : unit tval skip_white : unit tval is_alpha : char -> boolval is_num : char -> boolval is_alpha_num : char -> bool
val is_space : char -> boolval is_white : char -> boolval (~~~) : (char -> bool) -> char -> boolval (|||) : (char -> bool) -> (char -> bool) -> char -> boolval (&&&) : (char -> bool) -> (char -> bool) -> char -> boolval (<|>) : 'a t -> 'a t -> 'a ta <|> b tries to parse a, and if a fails, backtracks and tries
to parse b. Therefore, it succeeds if either succeedsval string : string -> string tstring s parses exactly the string s, and nothing elseval many : 'a t -> 'a list tmany p parses a list of p, eagerly (as long as possible)val many1 : 'a t -> 'a list tval skip : 'a t -> unit tskip p parses p and ignores its resultval sep : by:'b t -> 'a t -> 'a list tsep ~by p parses a list of p separated by byval sep1 : by:'b t -> 'a t -> 'a list tsep1 ~by p parses a non empty list of p, separated by byval fix : ('a t -> 'a t) -> 'a tval memo : 'a t -> 'a tmemo 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.
Since 0.13
val fix_memo : ('a t -> 'a t) -> 'a t
Those functions have a label ~p on the parser, since 0.14.
val parse : input:input -> p:'a t -> 'a or_errorparse ~input p applies p on the input, and returns `Ok x if
p succeeds with x, or `Error s otherwiseval parse_exn : input:input -> p:'a t -> 'aParseError if it failsval parse_string : string -> p:'a t -> 'a or_errorCCParse.parse for string inputsval parse_string_exn : string -> p:'a t -> 'aParseError if it failsval parse_file : ?size:int -> file:string -> p:'a t -> 'a or_errorparse_file ~file p parses file with p by opening the file
and using CCParse.input_of_chan.size : size of chunks read from fileval parse_file_exn : ?size:int -> file:string -> p:'a t -> 'a
module U:sig..end