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 + -
显示快捷键?