60 lines
3.2 KiB
Plaintext
60 lines
3.2 KiB
Plaintext
[/
|
|
/ Copyright (c) 2008 Eric Niebler
|
|
/
|
|
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
/]
|
|
|
|
[section Preface]
|
|
|
|
[:['Wife:] New Shimmer is a floor wax!\n
|
|
['Husband:] No, new Shimmer is a dessert topping!\n
|
|
['Wife:] It's a floor wax!\n
|
|
['Husband:] It's a dessert topping!\n
|
|
['Wife:] It's a floor wax, I'm telling you!\n
|
|
['Husband:] It's a dessert topping, you cow!\n
|
|
['Announcer:] Hey, hey, hey, calm down, you two. New Shimmer is both a floor wax ['and] a dessert topping!]
|
|
[:[*['-- Saturday Night Live]]]
|
|
|
|
[h2 Description]
|
|
|
|
xpressive is an advanced, object-oriented regular expression template library for C++.
|
|
Regular expressions can be written as strings that are parsed at run-time, or as expression
|
|
templates that are parsed at compile-time. Regular expressions can refer to each other and
|
|
to themselves recursively, allowing you to build arbitrarily complicated grammars out of
|
|
them.
|
|
|
|
[h2 Motivation]
|
|
|
|
If you need to manipulate text in C++, you have typically had two disjoint options: a regular
|
|
expression engine or a parser generator. Regular expression engines (like _regexpp_) are powerful
|
|
and flexible; patterns are represented as strings which can be specified at runtime. However,
|
|
that means that syntax errors are likewise not detected until runtime. Also, regular expressions
|
|
are ill-suited to advanced text processing tasks such as matching balanced, nested tags. Those
|
|
tasks have traditionally been handled by parser generators (like the _spirit_fx_). These
|
|
beasts are more powerful but less flexible. They generally don't allow you to arbitrarily modify
|
|
your grammar rules on the fly. In addition, they don't have the exhaustive backtracking semantics
|
|
of regular expressions, which can make it more challenging to author some types of patterns.
|
|
|
|
xpressive brings these two approaches seamlessly together and occupies a unique niche in the
|
|
world of C++ text processing. With xpressive, you can choose to use it much as you would use
|
|
_regexpp_, representing regular expressions as strings. Or you can use it as you would use _spirit_,
|
|
writing your regexes as C++ expressions, enjoying all the benefits of an embedded language
|
|
dedicated to text manipulation. What's more, you can mix the two to get the benefits of
|
|
both, writing regular expression ['grammars] in which some of the regular expressions are
|
|
statically bound -- hard-coded and syntax\-checked by the compiler \-- and others are dynamically
|
|
bound and specified at runtime. These regular expressions can refer to each other recursively,
|
|
matching patterns in strings that ordinary regular expressions cannot.
|
|
|
|
[h2 Influences and Related Work]
|
|
|
|
The design of xpressive's interface has been strongly influenced by John Maddock's
|
|
_regexpp_ library and his _proposal_
|
|
to add regular expressions to the Standard Library. I also drew a great deal of
|
|
inspiration from Joel de Guzman's _spirit_fx_, which served as the model
|
|
for static xpressive. Other sources of inspiration are the _perl6_ redesign and _greta_.
|
|
(You can read a summary of the changes Perl 6 will bring to regex culture
|
|
[@http://dev.perl.org/perl6/doc/design/syn/S05.html here].)
|
|
|
|
[endsect]
|