traverse_tests.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 519 行 · 第 1/2 页

CPP
519
字号
/*=============================================================================    Copyright (c) 2002-2003 Hartmut Kaiser    http://spirit.sourceforge.net/    Use, modification and distribution is subject to 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)=============================================================================*////////////////////////////////////////////////////////////////////////////////////  Traversal tests/////////////////////////////////////////////////////////////////////////////////#include <boost/detail/lightweight_test.hpp>#include <iostream>#include <string>#include <vector>#include <boost/config.hpp>#include <boost/static_assert.hpp>#ifdef BOOST_NO_STRINGSTREAM#include <strstream>#define OSSTREAM std::ostrstreamstd::string GETSTRING(std::ostrstream& ss){    ss << ends;    std::string rval = ss.str();    ss.freeze(false);    return rval;}#else#include <sstream>#define GETSTRING(ss) ss.str()#define OSSTREAM std::ostringstream#endif#ifndef BOOST_SPIRIT_DEBUG#define BOOST_SPIRIT_DEBUG    // needed for parser_name functions#endif#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_assign_actor.hpp>#include <boost/spirit/include/classic_meta.hpp>using namespace std;using namespace BOOST_SPIRIT_CLASSIC_NS;typedef ref_value_actor<char, assign_action> assign_actor;///////////////////////////////////////////////////////////////////////////////////  Test identity transformation/////////////////////////////////////////////////////////////////////////////////voidtraverse_identity_tests(){    //  test type equality    typedef sequence<chlit<char>, chlit<char> > test_sequence1_t;    BOOST_STATIC_ASSERT((        ::boost::is_same<            test_sequence1_t,            post_order::result<identity_transform, test_sequence1_t>::type        >::value    ));    //  test (rough) runtime equality    BOOST_TEST(        parse(            "ab",            post_order::traverse(identity_transform(), ch_p('a') >> 'b')        ).full    );    BOOST_TEST(        !parse(            "ba",            post_order::traverse(identity_transform(), ch_p('a') >> 'b')        ).hit    );    ///////////////////////////////////////////////////////////////////////////    BOOST_TEST(        !parse(            "cba",            post_order::traverse(                identity_transform(),                ch_p('a') >> 'b' >> 'c'            )        ).hit    );/////////////////////////////////////////////////////////////////////////////////  Test more complex sequenceschar c;/////////////////////////////////////////////////////////////////////////////////  test: ((a >> b) >> c) >> d    typedef        sequence<            sequence<                sequence<                    kleene_star<chlit<> >,                    action<chlit<>, assign_actor>                >,                chlit<>            >,            optional<chlit<> >        > test_sequence2_t;    BOOST_STATIC_ASSERT((        ::boost::is_same<            test_sequence2_t,            post_order::result<identity_transform, test_sequence2_t>::type        >::value    ));    c = 0;    BOOST_TEST(        parse(            "aabcd",            post_order::traverse(                identity_transform(),                ((*ch_p('a') >> ch_p('b')[assign_a(c)]) >> 'c') >> !ch_p('d')            )        ).full    );    BOOST_TEST(c == 'b');/////////////////////////////////////////////////////////////////////////////////  test: (a >> (b >> c)) >> d    typedef        sequence<            sequence<                kleene_star<chlit<> >,                sequence<                    action<chlit<>, assign_actor>,                    chlit<>                >            >,            optional<chlit<char> >        > test_sequence3_t;    BOOST_STATIC_ASSERT((        ::boost::is_same<            test_sequence3_t,            post_order::result<identity_transform, test_sequence3_t>::type        >::value    ));    c = 0;    BOOST_TEST(        parse(            "aabcd",            post_order::traverse(                identity_transform(),                (*ch_p('a') >> (ch_p('b')[assign_a(c)] >> 'c')) >> !ch_p('d')            )        ).full    );    BOOST_TEST(c == 'b');/////////////////////////////////////////////////////////////////////////////////  test: a >> (b >> (c >> d))    typedef        sequence<            kleene_star<chlit<> >,            sequence<                action<chlit<>, assign_actor>,                sequence<                    chlit<>,                    optional<chlit<> >                >            >        > test_sequence4_t;    BOOST_STATIC_ASSERT((        ::boost::is_same<            test_sequence4_t,            post_order::result<identity_transform, test_sequence4_t>::type        >::value    ));    c = 0;    BOOST_TEST(        parse(            "aabcd",            post_order::traverse(                identity_transform(),                *ch_p('a') >> (ch_p('b')[assign_a(c)] >> ('c' >> !ch_p('d')))            )        ).full    );    BOOST_TEST(c == 'b');/////////////////////////////////////////////////////////////////////////////////  test: a >> ((b >> c) >> d)    typedef        sequence<            kleene_star<chlit<> >,            sequence<                sequence<                    action<chlit<>, assign_actor>,                    chlit<>                >,                optional<chlit<> >            >        > test_sequence5_t;    BOOST_STATIC_ASSERT((        ::boost::is_same<            test_sequence5_t,            post_order::result<identity_transform, test_sequence5_t>::type        >::value    ));    c = 0;    BOOST_TEST(        parse(            "aabcd",            post_order::traverse(                identity_transform(),                *ch_p('a') >> ((ch_p('b')[assign_a(c)] >> 'c') >> !ch_p('d'))            )        ).full    );    BOOST_TEST(c == 'b');/////////////////////////////////////////////////////////////////////////////////  test: (a >> b) >> (c >> d)    typedef        sequence<            sequence<                kleene_star<chlit<> >,                action<chlit<>, assign_actor>            >,            sequence<                chlit<>,                optional<chlit<> >            >        > test_sequence6_t;    BOOST_STATIC_ASSERT((        ::boost::is_same<            test_sequence6_t,            post_order::result<identity_transform, test_sequence6_t>::type        >::value    ));    c = 0;    BOOST_TEST(        parse(            "aabcd",            post_order::traverse(                identity_transform(),                (*ch_p('a') >> ch_p('b')[assign_a(c)]) >> ('c' >> !ch_p('d'))            )        ).full    );

⌨️ 快捷键说明

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