Library
Module
Module type
Parameter
Class
Class type
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
.
val pcre : string -> string t
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))
alt tyreL tyreR
matches either tyreL
(and will then return `Left v
) or tyreR
(and will then return `Right v
).
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.
module Infix : sig ... end
val str : string -> unit t
str s
matches s
and evaluates to s
.
val char : char -> unit t
char c
matches c
and evaluates to c
.
val blanks : unit t
blanks
matches Re.(rep blank)
and doesn't return anything.
val int : int t
int
matches -?[0-9]+
and returns the matched integer.
Integers that do not fit in an int
will fail.
val pos_int : int t
pos_int
matches [0-9]+
and returns the matched positive integer.
Integers that do not fit in an int
will fail.
val float : float t
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
.
val bool : bool t
bool
matches true|false
and returns the matched boolean.
separated_list ~sep tyre
is equivalent to opt (e <&> list (sep *> e))
.
See Re
for details on the semantics of those combinators.
val start : unit t
val stop : unit t
val pp_error : Format.formatter -> _ error -> unit
val exec :
?pos:int ->
?len:int ->
'a re ->
string ->
('a, 'a error) Result.result
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
.
val execp : ?pos:int -> ?len:int -> 'a re -> string -> bool
execp ctyre s
returns true
if ctyre
matches s
. Converters are never called.
val all :
?pos:int ->
?len:int ->
'a re ->
string ->
('a list, 'a error) Result.result
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.
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
.
val eval : 'a t -> 'a -> string
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 : 'a t -> Format.formatter -> 'a -> unit
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
val pp : Format.formatter -> 'a t -> unit
val pp_re : Format.formatter -> 'a re -> unit