| [/ |
| / 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] |