type ast = Ast.t = | Atom of Stdune.Loc.t * Atom.t |
| Quoted_string of Stdune.Loc.t * string |
| Template of Template.t |
| List of Stdune.Loc.t * ast list |
Monad producing a value of type 'a by parsing an input composed of a sequence of S-expressions.
The input can be seen either as a plain sequence of S-expressions or a list of fields. The 'kind parameter indicates how the input is seen:
- with
'kind = [values], the input is seen as an ordered sequence of S-expressions
- with
!'kind = [fields], the input is seen as an unordered sequence of fields
A field is a S-expression of the form: (<atom> <values>...) where atom is a plain atom, i.e. not a quoted string and not containing variables. values is a sequence of zero, one or more S-expressions.
It is possible to switch between the two mode at any time using the appropriate combinator. Some primitives can be used in both mode while some are specific to one mode.
val parse : 'a t -> Stdune.Univ_map.t -> ast -> 'aparse parser context sexp parse a S-expression using the following parser. The input consist of a single S-expression. context allows to pass extra information such as versions to individual parsers.
val return : 'a -> ('a, _) parserval get : 'a Stdune.Univ_map.Key.t -> ('a option, _) parserAccess to the context
val set : 'a Stdune.Univ_map.Key.t -> 'a -> ('b, 'k) parser -> ('b, 'k) parserval get_all : (Stdune.Univ_map.t, _) parserval set_many : Stdune.Univ_map.t -> ('a, 'k) parser -> ('a, 'k) parserval loc : (Stdune.Loc.t, _) parserReturn the location of the list currently being parsed.
a <|> b is either a or b. If a fails to parse the input, then try b. If b fails as well, raise the error from the parser that consumed the most input.
val atom_matching : (string -> 'a option) -> desc:string -> 'a tatom_matching f expects the next element to be an atom for which f returns Some v. desc is used to describe the atom in case of error. f must not raise.
val keyword : string -> unit tkeyword s is a short-hand for
atom_matching (String.equal s) ~desc:(sprintf "'%s'" s) Use before to parse elements until the keyword is reached. Then use after to parse the rest.
What is currently being parsed. The second argument is the atom at the beginnig of the list when inside a sum ... or field ....
repeat t use t to consume all remaning elements of the input until the end of sequence is reached.
enter t expect the next element of the input to be a list and parse its contents with t.
val fields : 'a fields_parser -> 'a tfields fp converts the rest of the current input to a list of fields and parse them with fp. This operation fails if one the S-expression in the input is not of the form (<atom> <values>...)
val string : string tConsume the next element of the input as a string, int, bool, ...
val int : int tval float : float tval bool : bool tval duration : int tConsume the next element as a duration, requiring 's', 'm' or 'h' suffix
val bytes_unit : int64 tConsume the next element as a number of bytes, requiring 'B', 'KB', 'MB' or 'GB' suffix
val junk : unit tConsume and ignore the next element of the input
val junk_everything : (unit, _) parserIgnore all the rest of the input
val plain_string : (loc:Stdune.Loc.t -> string -> 'a) -> 'a tplain_string f expects the next element of the input to be a plain string, i.e. either an atom or a quoted string, but not a template nor a list.
val filename : string tA valid filename, i.e. a string other than "." or ".."
val located : ('a, 'k) parser -> (Stdune.Loc.t * 'a, 'k) parserval enum : (string * 'a) list -> 'a tParser that parse a S-expression of the form (<atom> <s-exp1> <s-exp2> ...) or <atom>. <atom> is looked up in the list and the remaining s-expressions are parsed using the corresponding list parser.
If force_parens is true, then the form <atom> is never accepted. The default is false.
val map_validate : ('a, 'k) parser -> f:('a -> ('b, Stdune.User_message.t) Stdune.Result.t) -> ('b, 'k) parserCheck the result of a list parser, and raise a properly located error in case of failure.
Parsing record fields
val field : string -> ?default:'a -> ?on_dup:(Stdune.Univ_map.t -> string -> Ast.t list -> unit) -> 'a t -> 'a fields_parserval field_o : string -> ?on_dup:(Stdune.Univ_map.t -> string -> Ast.t list -> unit) -> 'a t -> 'a option fields_parserval fields_mutually_exclusive : ?on_dup:(Stdune.Univ_map.t -> string -> Ast.t list -> unit) -> ?default:'a -> (string * 'a t) list -> 'a fields_parserParser for mutually exclusive fields. If default is provided, allow fields absence.
val field_b : ?check:unit t -> ?on_dup:(Stdune.Univ_map.t -> string -> Ast.t list -> unit) -> string -> bool fields_parserval field_o_b : ?check:unit t -> ?on_dup:(Stdune.Univ_map.t -> string -> Ast.t list -> unit) -> string -> bool option fields_parserval multi_field : string -> 'a t -> 'a list fields_parserA field that can appear multiple times
val leftover_fields_as_sums : (string * 'a t) list -> 'a list fields_parserTreat the remainig fields as a list of sum values
val field_present_too_many_times : Stdune.Univ_map.t -> string -> Ast.t list -> _Default value for on_dup. It fails with an appropriate error message.
val leftover_fields : Ast.t list fields_parser