closure_tests.cpp

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

CPP
159
字号
/*=============================================================================    Copyright (c) 2001-2003 Joel de Guzman    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)=============================================================================*/#include <iostream>#include <boost/detail/lightweight_test.hpp>using namespace std;#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_closure.hpp>#include <boost/spirit/include/classic_parametric.hpp>#include <boost/spirit/include/phoenix1_binders.hpp>using namespace BOOST_SPIRIT_CLASSIC_NS;using namespace phoenix;///////////////////////////////////////////////////////////////////////////////////  Closure tests/////////////////////////////////////////////////////////////////////////////////struct my_closure1 : BOOST_SPIRIT_CLASSIC_NS::closure<my_closure1, double>{    member1 val;};struct my_closure2 : BOOST_SPIRIT_CLASSIC_NS::closure<my_closure2, char>{    member1 ch;};struct my_closure3 : BOOST_SPIRIT_CLASSIC_NS::closure<my_closure3, char>{    member1 ch;};struct X { int a; int b; };#if defined(BOOST_SPIRIT_DEBUG)//  If debugging is switched on, all closure members should have a //  corresponding output streaming operatorstd::ostream &operator<< (std::ostream& o, X const &x){    o << "X(" << x.a << ", " << x.b << ")";    return o;}#endif // defined(BOOST_SPIRIT_DEBUG)struct my_closure4 : BOOST_SPIRIT_CLASSIC_NS::closure<my_closure4, X>{    member1 x;};// MWCW8.3 needs the default constructor here or it won't compile.// It should not be needed.struct Y { Y() {} Y(int) {} };#if defined(BOOST_SPIRIT_DEBUG)//  If debugging is switched on, all closure members should have a //  corresponding output streaming operatorstd::ostream &operator<< (std::ostream& o, Y const &x){    o << "Y";    return o;}#endif // defined(BOOST_SPIRIT_DEBUG)struct my_closure5 : BOOST_SPIRIT_CLASSIC_NS::closure<my_closure5, int, Y>{    member1 y;};struct my_closure6 : BOOST_SPIRIT_CLASSIC_NS::closure<my_closure6, int, int, int>{    member1 x;    member2 y;    member3 z;};voidclosure_tests(){    rule<phrase_scanner_t, my_closure1::context_t> num_list;    double n;    num_list =    (        real_p[num_list.val = arg1] >>  *(',' >> real_p[num_list.val += arg1])    )    [var(n) = num_list.val];    parse_info<char const*> pi;    pi = parse("123, 456, 789", num_list, space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    BOOST_TEST(n == 123 + 456 + 789);    rule<scanner<>, my_closure2::context_t> rev;    rev = anychar_p[rev.ch = arg1] >> !rev >> f_ch_p(rev.ch);    pi = parse("xyzzyx", rev);    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    pi = parse("xyzczyx", rev);    BOOST_TEST(!pi.hit);    subrule<0, my_closure3::context_t> rev2;    pi = parse("atoyyota",        rev2 = anychar_p[rev2.ch = arg1] >> !rev2 >> f_ch_p(rev2.ch)    );    BOOST_TEST(pi.hit);    BOOST_TEST(pi.full);    pi = parse("whatdahell",        rev2 = anychar_p[rev2.ch = arg1] >> !rev2 >> f_ch_p(rev2.ch)    );    BOOST_TEST(!pi.hit);    rule<phrase_scanner_t, my_closure4::context_t> complex_p;    complex_p =            int_p[bind(&X::a)(complex_p.x) = arg1]        >>  ','        >>  int_p[bind(&X::b)(complex_p.x) = arg1]    ;    X x;    pi = parse("123, 456", complex_p[var(x) = arg1], space_p);    BOOST_TEST(pi.hit);    BOOST_TEST(x.a == 123);    BOOST_TEST(x.b == 456);    rule<scanner<>, my_closure5::context_t> init1; // compile check only    rule<> r1 = init1(3, 3); // member2 is constructed from int    rule<scanner<>, my_closure6::context_t> init2; // compile check only    rule<> r2 = init2(3); // member2 and member3 are default constructed}///////////////////////////////////////////////////////////////////////////////////  Main/////////////////////////////////////////////////////////////////////////////////intmain(){    closure_tests();    return boost::report_errors();}

⌨️ 快捷键说明

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