package tyre
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=63ca1915da896640534b5cf928d220198709ec74b899d55b830fb0ceccebd633
sha512=536440d090046569449c7752315d568b3447e84c8c0e555a35a20a504a96a538ed9bc4e8e5f78e5860744ba863023331aa0a9893bf2028ae280cad678ec8d59c
doc/tyre/Tyre/index.html
Module TyreSource
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.
A 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.
liftpp is equivalent to lift, but uses Stdlib.Format for better performance.
unlift e Turn an expression into a pattern. Equivalent to (e :> _ pattern)
Combinators
pcre 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
rep1 tyre is seq tyre (rep tyre). Similar to Re.rep1.
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
t <||> t' is alt_either t t'.
Useful combinators
int matches -?[0-9]+ and returns the matched integer.
Integers that do not fit in an int will fail.
pos_int matches [0-9]+ and returns the matched positive integer.
Integers that do not fit in an int will fail.
float 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.
terminated_list ~sep tyre is list (tyre <* sep) .
separated_list ~sep tyre is equivalent to opt (e <&> list (sep *> e)).
charset 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
matches the same strings as rep any but returns the matched string instead of a list of chars.
see Charset.wordc
see Charset.alpha
see Charset.alnum
see Charset.ascii
see Charset.blank
see Charset.cntrl
see Charset.digit.
There are combinators for ints and floats, using them is advisable.
see Charset.graph
see Charset.lower
see Charset.print
see Charset.punct
see Charset.space
see Charset.upper
see Charset.xdigit
Other combinators
See Re for details on the semantics of those combinators.
Matching
A compiled typed (_, regular) t.
exec 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.
execp 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.
evalpp 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 v