Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/xpressive/test/misc1.cpp @ 29

Last change on this file since 29 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 6.2 KB
Line 
1///////////////////////////////////////////////////////////////////////////////
2// misc1.hpp
3//
4//  Copyright 2004 Eric Niebler. Distributed under the Boost
5//  Software License, Version 1.0. (See accompanying file
6//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
8#include <iostream>
9#include <boost/xpressive/xpressive.hpp>
10#include <boost/xpressive/traits/cpp_regex_traits.hpp>
11#include "./test_minimal.hpp"
12
13using namespace boost::xpressive;
14
15void test1()
16{
17    // make sure the following compiles:
18    sregex a = _;
19    sregex b = _;
20    sregex c = a >> b;
21    c = a | b;
22    c = !a;
23    c = *a;
24    c = +a;
25}
26
27///////////////////////////////////////////////////////////////////////////////
28// test for basic_regex in a keep
29//
30void test2()
31{
32    std::locale loc;
33    std::string str("Its a mad Mad mAd maD world");
34    sregex word = +_w;
35    sregex sentence = imbue(loc)(*(keep(word) >> +_s) >> word);
36    smatch what;
37
38    BOOST_REQUIRE(regex_match(str, what, sentence));
39    BOOST_REQUIRE(7 == what.nested_results().size());
40    smatch::nested_results_type::const_iterator pword = what.nested_results().begin();
41    BOOST_CHECK((*pword++)[0] == "Its");
42    BOOST_CHECK((*pword++)[0] == "a");
43    BOOST_CHECK((*pword++)[0] == "mad");
44    BOOST_CHECK((*pword++)[0] == "Mad");
45    BOOST_CHECK((*pword++)[0] == "mAd");
46    BOOST_CHECK((*pword++)[0] == "maD");
47    BOOST_CHECK((*pword++)[0] == "world");
48    BOOST_CHECK(pword == what.nested_results().end());
49}
50
51///////////////////////////////////////////////////////////////////////////////
52// test for a simple non-recursive grammar
53//
54void test3()
55{
56    // test for a simple regex grammar
57    std::string buffer =
58        "FROGGIE\r\n"
59        "Volume = 1\r\n"
60        "Other1= 2\r\n"
61        "Channel=3\r\n"
62        "Other =4\r\n"
63        "\r\n"
64        "FROGGIE\r\n"
65        "Volume = 5\r\n"
66        "Other1= 6\r\n"
67        "Channel=7\r\n"
68        "Other =8\r\n"
69        "\r\n"
70        "FROGGIE\r\n"
71        "Volume = 9\r\n"
72        "Other1= 0\r\n"
73        "Channel=10\r\n"
74        "\r\n";
75
76    mark_tag name(1), value(2);
77
78    sregex name_value_pair_ =
79        (name= +alnum) >> *_s >> "=" >> *_s >>
80        (value= +_d) >> *_s >> _ln;
81
82    sregex message_ =
83        *_s >> "FROGGIE" >> _ln >> +name_value_pair_ >> _ln;
84
85    sregex re_ = +message_;
86
87    smatch::nested_results_type::const_iterator msg, nvp;
88    smatch tmpwhat;
89
90    BOOST_REQUIRE(regex_search(buffer, tmpwhat, re_));
91    // for giggles, make a deep-copy of the tree of results
92    smatch what = tmpwhat;
93    BOOST_REQUIRE(3 == what.nested_results().size());
94
95    msg = what.nested_results().begin();
96    BOOST_REQUIRE(4 == msg->nested_results().size());
97
98    nvp = msg->nested_results().begin();
99    BOOST_REQUIRE(3 == nvp->size());
100    BOOST_CHECK("Volume" == (*nvp)[name]);
101    BOOST_CHECK("1" == (*nvp)[value]);
102    ++nvp;
103    BOOST_REQUIRE(3 == nvp->size());
104    BOOST_CHECK("Other1" == (*nvp)[name]);
105    BOOST_CHECK("2" == (*nvp)[value]);
106    ++nvp;
107    BOOST_REQUIRE(3 == nvp->size());
108    BOOST_CHECK("Channel" == (*nvp)[name]);
109    BOOST_CHECK("3" == (*nvp)[value]);
110    ++nvp;
111    BOOST_REQUIRE(3 == nvp->size());
112    BOOST_CHECK("Other" == (*nvp)[name]);
113    BOOST_CHECK("4" == (*nvp)[value]);
114
115    ++msg;
116    BOOST_REQUIRE(4 == msg->nested_results().size());
117
118    nvp = msg->nested_results().begin();
119    BOOST_REQUIRE(3 == nvp->size());
120    BOOST_CHECK("Volume" == (*nvp)[name]);
121    BOOST_CHECK("5" == (*nvp)[value]);
122    ++nvp;
123    BOOST_REQUIRE(3 == nvp->size());
124    BOOST_CHECK("Other1" == (*nvp)[name]);
125    BOOST_CHECK("6" == (*nvp)[value]);
126    ++nvp;
127    BOOST_REQUIRE(3 == nvp->size());
128    BOOST_CHECK("Channel" == (*nvp)[name]);
129    BOOST_CHECK("7" == (*nvp)[value]);
130    ++nvp;
131    BOOST_REQUIRE(3 == nvp->size());
132    BOOST_CHECK("Other" == (*nvp)[name]);
133    BOOST_CHECK("8" == (*nvp)[value]);
134
135    ++msg;
136    BOOST_REQUIRE(3 == msg->nested_results().size());
137
138    nvp = msg->nested_results().begin();
139    BOOST_REQUIRE(3 == nvp->size());
140    BOOST_CHECK("Volume" == (*nvp)[name]);
141    BOOST_CHECK("9" == (*nvp)[value]);
142    ++nvp;
143    BOOST_REQUIRE(3 == nvp->size());
144    BOOST_CHECK("Other1" == (*nvp)[name]);
145    BOOST_CHECK("0" == (*nvp)[value]);
146    ++nvp;
147    BOOST_REQUIRE(3 == nvp->size());
148    BOOST_CHECK("Channel" == (*nvp)[name]);
149    BOOST_CHECK("10" == (*nvp)[value]);
150}
151
152///////////////////////////////////////////////////////////////////////////////
153// test for a self-recursive regex
154//
155void test4()
156{
157    sregex parentheses;
158    parentheses                          // A balanced set of parentheses ...
159        = '('                            // is an opening parenthesis ...
160            >>                           // followed by ...
161             *(                          // zero or more ...
162                keep( +~(set='(',')') )  // of a bunch of things that are not parentheses ...
163              |                          // or ...
164                by_ref(parentheses)      // a balanced set of parentheses
165              )                          //   (ooh, recursion!) ...
166            >>                           // followed by ...
167          ')'                            // a closing parenthesis
168        ;
169
170    smatch what;
171    smatch::nested_results_type::const_iterator pwhat, pwhat2;
172    std::string str( "blah blah( a(b)c (c(e)f (g)h )i (j)6 )blah" );
173
174    BOOST_REQUIRE(regex_search(str, what, parentheses));
175    BOOST_REQUIRE(1 == what.size());
176    BOOST_CHECK("( a(b)c (c(e)f (g)h )i (j)6 )" == what[0]);
177
178    BOOST_REQUIRE(3 == what.nested_results().size());
179    pwhat = what.nested_results().begin();
180    BOOST_REQUIRE(1 == pwhat->size());
181    BOOST_CHECK("(b)" == (*pwhat)[0]);
182
183    ++pwhat;
184    BOOST_REQUIRE(1 == pwhat->size());
185    BOOST_CHECK("(c(e)f (g)h )" == (*pwhat)[0]);
186
187    BOOST_REQUIRE(2 == pwhat->nested_results().size());
188    pwhat2 = pwhat->nested_results().begin();
189    BOOST_REQUIRE(1 == pwhat2->size());
190    BOOST_CHECK("(e)" == (*pwhat2)[0]);
191
192    ++pwhat2;
193    BOOST_REQUIRE(1 == pwhat2->size());
194    BOOST_CHECK("(g)" == (*pwhat2)[0]);
195
196    ++pwhat;
197    BOOST_REQUIRE(1 == pwhat->size());
198    BOOST_CHECK("(j)" == (*pwhat)[0]);
199}
200
201///////////////////////////////////////////////////////////////////////////////
202// test_main
203//
204int test_main( int, char*[] )
205{
206    test1();
207    test2();
208    test3();
209    test4();
210
211    return 0;
212}
Note: See TracBrowser for help on using the repository browser.