misc1.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 253 行

CPP
253
字号
///////////////////////////////////////////////////////////////////////////////// misc1.hpp////  Copyright 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)#include <iostream>#include <boost/xpressive/xpressive.hpp>#include <boost/xpressive/traits/cpp_regex_traits.hpp>#include <boost/test/unit_test.hpp>using namespace boost::unit_test;using namespace boost::xpressive;void test1(){    // make sure the following compiles:    sregex a = _;    sregex b = _;    sregex c = a >> b;    c = 'a' >> b;    c = a >> 'b';    c = a | b;    c = 'a' | b;    c = a | 'b';    c = !a;    c = *a;    c = +a;}///////////////////////////////////////////////////////////////////////////////// test for basic_regex in a keep//void test2(){    std::locale loc;    std::string str("Its a mad Mad mAd maD world");    sregex word = +_w;    sregex sentence = imbue(loc)(*(keep(word) >> +_s) >> word);    smatch what;    BOOST_REQUIRE(regex_match(str, what, sentence));    BOOST_REQUIRE(7 == what.nested_results().size());    smatch::nested_results_type::const_iterator pword = what.nested_results().begin();    BOOST_CHECK((*pword++)[0] == "Its");    BOOST_CHECK((*pword++)[0] == "a");    BOOST_CHECK((*pword++)[0] == "mad");    BOOST_CHECK((*pword++)[0] == "Mad");    BOOST_CHECK((*pword++)[0] == "mAd");    BOOST_CHECK((*pword++)[0] == "maD");    BOOST_CHECK((*pword++)[0] == "world");    BOOST_CHECK(pword == what.nested_results().end());}///////////////////////////////////////////////////////////////////////////////// test for a simple non-recursive grammar//void test3(){    // test for a simple regex grammar    std::string buffer =        "FROGGIE\r\n"        "Volume = 1\r\n"        "Other1= 2\r\n"        "Channel=3\r\n"        "Other =4\r\n"        "\r\n"        "FROGGIE\r\n"        "Volume = 5\r\n"        "Other1= 6\r\n"        "Channel=7\r\n"        "Other =8\r\n"        "\r\n"        "FROGGIE\r\n"        "Volume = 9\r\n"        "Other1= 0\r\n"        "Channel=10\r\n"        "\r\n";    mark_tag name(1), value(2);    sregex name_value_pair_ =        (name= +alnum) >> *_s >> "=" >> *_s >>        (value= +_d) >> *_s >> _ln;    sregex message_ =        *_s >> "FROGGIE" >> _ln >> +name_value_pair_ >> _ln;    sregex re_ = +message_;    smatch::nested_results_type::const_iterator msg, nvp;    smatch tmpwhat;    BOOST_REQUIRE(regex_search(buffer, tmpwhat, re_));    // for giggles, make a deep-copy of the tree of results    smatch what = tmpwhat;    BOOST_REQUIRE(3 == what.nested_results().size());    msg = what.nested_results().begin();    BOOST_REQUIRE(4 == msg->nested_results().size());    nvp = msg->nested_results().begin();    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Volume" == (*nvp)[name]);    BOOST_CHECK("1" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Other1" == (*nvp)[name]);    BOOST_CHECK("2" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Channel" == (*nvp)[name]);    BOOST_CHECK("3" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Other" == (*nvp)[name]);    BOOST_CHECK("4" == (*nvp)[value]);    ++msg;    BOOST_REQUIRE(4 == msg->nested_results().size());    nvp = msg->nested_results().begin();    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Volume" == (*nvp)[name]);    BOOST_CHECK("5" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Other1" == (*nvp)[name]);    BOOST_CHECK("6" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Channel" == (*nvp)[name]);    BOOST_CHECK("7" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Other" == (*nvp)[name]);    BOOST_CHECK("8" == (*nvp)[value]);    ++msg;    BOOST_REQUIRE(3 == msg->nested_results().size());    nvp = msg->nested_results().begin();    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Volume" == (*nvp)[name]);    BOOST_CHECK("9" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Other1" == (*nvp)[name]);    BOOST_CHECK("0" == (*nvp)[value]);    ++nvp;    BOOST_REQUIRE(3 == nvp->size());    BOOST_CHECK("Channel" == (*nvp)[name]);    BOOST_CHECK("10" == (*nvp)[value]);}///////////////////////////////////////////////////////////////////////////////// test for a self-recursive regex//void test4(){    sregex parentheses;    parentheses                          // A balanced set of parentheses ...        = '('                            // is an opening parenthesis ...            >>                           // followed by ...             *(                          // zero or more ...                keep( +~(set='(',')') )  // of a bunch of things that are not parentheses ...              |                          // or ...                by_ref(parentheses)      // a balanced set of parentheses              )                          //   (ooh, recursion!) ...            >>                           // followed by ...          ')'                            // a closing parenthesis        ;    smatch what;    smatch::nested_results_type::const_iterator pwhat, pwhat2;    std::string str( "blah blah( a(b)c (c(e)f (g)h )i (j)6 )blah" );    BOOST_REQUIRE(regex_search(str, what, parentheses));    BOOST_REQUIRE(1 == what.size());    BOOST_CHECK("( a(b)c (c(e)f (g)h )i (j)6 )" == what[0]);    BOOST_REQUIRE(3 == what.nested_results().size());    pwhat = what.nested_results().begin();    BOOST_REQUIRE(1 == pwhat->size());    BOOST_CHECK("(b)" == (*pwhat)[0]);    ++pwhat;    BOOST_REQUIRE(1 == pwhat->size());    BOOST_CHECK("(c(e)f (g)h )" == (*pwhat)[0]);    BOOST_REQUIRE(2 == pwhat->nested_results().size());    pwhat2 = pwhat->nested_results().begin();    BOOST_REQUIRE(1 == pwhat2->size());    BOOST_CHECK("(e)" == (*pwhat2)[0]);    ++pwhat2;    BOOST_REQUIRE(1 == pwhat2->size());    BOOST_CHECK("(g)" == (*pwhat2)[0]);    ++pwhat;    BOOST_REQUIRE(1 == pwhat->size());    BOOST_CHECK("(j)" == (*pwhat)[0]);}///////////////////////////////////////////////////////////////////////////////// test for a sub-match scoping//void test5(){    sregex inner = sregex::compile( "(.)\\1" );    sregex outer = (s1= _) >> inner >> s1;    std::string abba("ABBA");    BOOST_CHECK(regex_match(abba, outer));}///////////////////////////////////////////////////////////////////////////////// Ye olde calculator. Test recursive grammar.//void test6(){    sregex group, factor, term, expression;    group       = '(' >> by_ref(expression) >> ')';    factor      = +_d | group;    term        = factor >> *(('*' >> factor) | ('/' >> factor));    expression  = term >> *(('+' >> term) | ('-' >> term));    smatch what;    std::string str("foo 9*(10+3) bar");    BOOST_REQUIRE(regex_search(str, what, expression));    BOOST_CHECK("9*(10+3)" == what[0]);}///////////////////////////////////////////////////////////////////////////////// init_unit_test_suite//test_suite* init_unit_test_suite( int argc, char* argv[] ){    test_suite *test = BOOST_TEST_SUITE("miscelaneous tests and examples from the docs");    test->add(BOOST_TEST_CASE(&test1));    test->add(BOOST_TEST_CASE(&test2));    test->add(BOOST_TEST_CASE(&test3));    test->add(BOOST_TEST_CASE(&test4));    test->add(BOOST_TEST_CASE(&test5));    test->add(BOOST_TEST_CASE(&test6));    return test;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?