package tyre
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=7aa07fada72aa71bb9855942e0eb3ee007c339e623e145c5dd2ff80a491e9b69
sha512=ed4d48c9c00f1160540e390e676476490dfca2067da84b2b30e6bae48e34f2b7923841b9c815feefc7d62f09b31f31ba4c0d097b29e1811c9737fba5972e9cb9
doc/tyre/Tyre/index.html
Module Tyre
Source
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.t
A 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
.
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.
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))
opt tyre
matches either tyre
or the empty string. Similar to Re.opt
.
alt tyreL tyreR
matches either tyreL
(and will then return `Left v
) or tyreR
(and will then return `Right v
).
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.
Infix operators
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))
.
Other combinators
See Re
for details on the semantics of those combinators.
Matching
A compiled typed regular expression.
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.
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 gen
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