package tyre
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=63ca1915da896640534b5cf928d220198709ec74b899d55b830fb0ceccebd633
sha512=536440d090046569449c7752315d568b3447e84c8c0e555a35a20a504a96a538ed9bc4e8e5f78e5860744ba863023331aa0a9893bf2028ae280cad678ec8d59c
doc/tyre/Tyre/index.html
Module Tyre
Typed regular expressions
Tyre is a set of combinators to build type-safe regular expressions, allowing automatic extraction and modification of matched groups.
Tyre is bi-directional: a typed regular expressions can be used both for matching and evaluation. Multiple tyregexs can be combined in order to do routing in similar manner as switches/pattern matching. Typed regular expressions are strictly as expressive as regular expressions from re (and are, as such, regular expressions, not PCREs). Performances should be exactly the same.
# let dim = Tyre.( str"dim:" *> int <&> str"x" *> int ) ;;
val dim : (int * int) Tyre.t
# let dim_re = Tyre.compile dim ;;
val dim_re : (int * int) Tyre.re
# Tyre.exec dim_re "dim:3x4" ;;
- : (int * int, (int * int) Tyre.error) result = Result.Ok (3, 4)
# Tyre.eval dim (2, 5) ;;
- : string = "dim:2x5"ppx_tyre allows to use the usual regular syntax, if prefered:
# let dim = [%tyre "dim:(?&int)x(?&int)"] ;;
val dim : (int * int) Tyre.tA typed regular expression.
The type variable is the type of the returned value when the typed regular expression (tyregex) is executed.
For example tyre : (_, int) t can be used to return an int. In the rest of the documentation, we will use «tyre» to designate a value of type t.
A value of type (non_evaluable, a) t can only be used with functions that match a string, it can't be used to produce an example string. Because its only usable for matching, it is called a pattern.
A value of type (evaluable, a) t can be used with the eval function to returns a string s such that exec (compile tyre) s = v. We call such a value expressions, but they don't have a type binding because every expression is also a pattern.
type 'a pattern = (non_evaluable, 'a) tA regexp only usable for matching
lift f p makes the pattern p evaluable by providing a conversion function.
Correctness is not checked, if you provide a string that does not match the regex, eval will just return that.
val liftpp : (Format.formatter -> 'a -> unit) -> ('b, 'a) t -> ('c, 'a) tliftpp is equivalent to lift, but uses Stdlib.Format for better performance.
unlift e Turn an expression into a pattern. Equivalent to (e :> _ pattern)
Combinators
val pcre : string -> (_, string) tpcre s is a tyregex that matches the PCRE s and return the corresponding string. Groups in s are ignored.
regex re is a tyregex that matches re and return the corresponding string. Groups inside re are erased.
matched_string t matches the same string as t, but return the matched text, discarding the result computed by t.
conv to_ from_ tyre matches the same text as tyre, but converts back and forth to a different data type.
to_ is allowed to raise an exception exn. In this case, exec will return `ConverterFailure exn.
For example, this is the implementation of pos_int:
let pos_int =
Tyre.conv
int_of_string string_of_int
(Tyre.regex (Re.rep1 Re.digit))map f tyre is a regexp that matches tyre and returns f v. It cannot be used for evaluating.
app f v matches seq f v and returns the application of the value returned by f with the value returned by v
const v tyre matches tyre but has value v. Is a simplification of conv for unit regular expressions.
opt tyre matches either tyre or the empty string. Similar to Re.opt.
either tyreL tyreR matches either tyreL (and will then return Left v) or tyreR (and will then return Right v).
alt l r matches either l or r and return the value of the one that matched.
It is not compatible with eval, either might be used instead.
The reason is that when evaluating alt l r with a value v, eval has no way to know if the value could have been returned by l or by r.
alt_eval from_ l r is alt l r but uses from_ when eval is called on it. from_ v should indicate whether v is compatible with l or with r.
Repetitions
Sequences
seq tyre1 tyre2 matches tyre1 then tyre2 and return both values.
prefix tyre_i tyre matches tyre_i, ignores the result, and then matches tyre and returns its result. Converters in tyre_i are never called.
Let operators
(and+) x y is seq x y.
Be warned that this is not an applicative functor: let+ x = t1 and+ y = t2 in z is not the same as let+ y = t2 and+ x = t1 in z.
Infix operators
module Infix : sig ... endUseful combinators
val str : string -> (_, unit) tstr s matches s and evaluates to s.
val char : char -> (_, unit) tchar c matches c and evaluates to c.
val blanks : (_, unit) tblanks matches Re.(rep blank) and doesn't return anything.
val int : (_, int) tint matches -?[0-9]+ and returns the matched integer.
Integers that do not fit in an int will fail.
val pos_int : (_, int) tpos_int matches [0-9]+ and returns the matched positive integer.
Integers that do not fit in an int will fail.
val float : (_, float) tfloat matches -?[0-9]+( .[0-9]* )? and returns the matched floating point number.
Floating point numbers that do not fit in a float returns infinity or neg_infinity.
val bool : (_, bool) tbool matches true|false and returns the matched boolean.
terminated_list ~sep tyre is list (tyre <* sep) .
separated_list ~sep tyre is equivalent to opt (e <&> list (sep *> e)).
module Charset : sig ... endcharset cs is a (_, regular) t that matches any character in cs.
rep_charset cs matches the same text as rep (charset cs), but directly returns a string instead of a char Seq.t.
Predefined character sets as char expressions
val any : (_, char) tany character including newline
val rep_any : (_, string) tmatches the same strings as rep any but returns the matched string instead of a list of chars.
val notnl : (_, char) tany character except a new line
val wordc : (_, char) tsee Charset.wordc
val alpha : (_, char) tsee Charset.alpha
val alnum : (_, char) tsee Charset.alnum
val ascii : (_, char) tsee Charset.ascii
val blank : (_, char) tsee Charset.blank
val cntrl : (_, char) tsee Charset.cntrl
val digit : (_, char) tsee Charset.digit.
There are combinators for ints and floats, using them is advisable.
val graph : (_, char) tsee Charset.graph
val lower : (_, char) tsee Charset.lower
val print : (_, char) tsee Charset.print
val punct : (_, char) tsee Charset.punct
val space : (_, char) tsee Charset.space
val upper : (_, char) tsee Charset.upper
val xdigit : (_, char) tsee Charset.xdigit
Other combinators
See Re for details on the semantics of those combinators.
val start : (_, unit) tval stop : (_, unit) tMatching
val pp_error : Format.formatter -> _ error -> unitexec ctyre s matches the string s using the compiled tyregex ctyre and returns the extracted value.
Returns Error (`NoMatch (tyre, s) if tyre doesn't match s. Returns Error (`ConverterFailure exn) if a converter failed with the exception exn.
val execp : ?pos:int -> ?len:int -> 'a re -> string -> boolexecp ctyre s returns true if ctyre matches s. Converters are never called.
val replace :
?pos:int ->
?len:int ->
?all:bool ->
'a re ->
('a -> string) ->
string ->
(string, [> `ConverterFailure of exn ]) resultreplace r f s returns s where every match of r has been replaced by f v where v is the value associated with r. If all is set to false, it only replaces the first match.
Repeated Matching
all ctyre s calls to exec repeatedly and returns the list of all the matches.
all_seq ctyre s is all ctyre s but returns a seq instead. Matches are enumerated lazily.
Exceptions raised by converters are not caught.
Routing
route [ tyre1 --> f1 ; tyre2 --> f2 ] produces a compiled tyregex such that, if tyre1 matches, f1 is called, and so on.
The compiled tyregex shoud be used with exec.
Evaluating
eval tyre v returns a string s such that exec (compile tyre) s = v.
Note that such string s is not unique. eval will usually returns a very simple witness.
val evalpp : (evaluable, 'a) t -> Format.formatter -> 'a -> unitevalpp tyre ppf v is equivalent to Format.fprintf ppf "%s" (eval tyre v), but more efficient.
Is is generally used with "%a":
let my_pp = Tyre.evalpp tyre in
Format.printf "%a@." my_pp vPretty printing
val pp : Format.formatter -> (_, 'a) t -> unitval pp_re : Format.formatter -> 'a re -> unit