📄 traverse_tests.cpp
字号:
/*=============================================================================
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 <cassert>
#include <iostream>
#include <string>
#include <vector>
#include <boost/config.hpp>
#include <boost/static_assert.hpp>
#ifdef BOOST_NO_STRINGSTREAM
#include <strstream>
#define OSSTREAM std::ostrstream
std::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/core.hpp>
#include <boost/spirit/actor/assign_actor.hpp>
#include <boost/spirit/meta.hpp>
using namespace std;
using namespace boost::spirit;
typedef ref_value_actor<char, assign_action> assign_actor;
///////////////////////////////////////////////////////////////////////////////
//
// Test identity transformation
//
///////////////////////////////////////////////////////////////////////////////
void
traverse_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
assert(
parse(
"ab",
post_order::traverse(identity_transform(), ch_p('a') >> 'b')
).full
);
assert(
!parse(
"ba",
post_order::traverse(identity_transform(), ch_p('a') >> 'b')
).hit
);
///////////////////////////////////////////////////////////////////////////
assert(
!parse(
"cba",
post_order::traverse(
identity_transform(),
ch_p('a') >> 'b' >> 'c'
)
).hit
);
///////////////////////////////////////////////////////////////////////////////
// Test more complex sequences
char 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;
assert(
parse(
"aabcd",
post_order::traverse(
identity_transform(),
((*ch_p('a') >> ch_p('b')[assign_a(c)]) >> 'c') >> !ch_p('d')
)
).full
);
assert(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;
assert(
parse(
"aabcd",
post_order::traverse(
identity_transform(),
(*ch_p('a') >> (ch_p('b')[assign_a(c)] >> 'c')) >> !ch_p('d')
)
).full
);
assert(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;
assert(
parse(
"aabcd",
post_order::traverse(
identity_transform(),
*ch_p('a') >> (ch_p('b')[assign_a(c)] >> ('c' >> !ch_p('d')))
)
).full
);
assert(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;
assert(
parse(
"aabcd",
post_order::traverse(
identity_transform(),
*ch_p('a') >> ((ch_p('b')[assign_a(c)] >> 'c') >> !ch_p('d'))
)
).full
);
assert(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;
assert(
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -