#include <boost/spirit/include/support_utree.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/assert.hpp>
#include <boost/predef/other/endian.h>
#include <boost/proto/deep_copy.hpp>
#include <iostream>
#include <string>
#include <cstdlib>
template <typename P>
void test_parser(
char const* input, P const& p, bool full_match = true)
{
using boost::spirit::qi::parse;
char const* f(input);
char const* l(f + strlen(f));
if (parse(f, l, p) && (!full_match || (f == l)))
std::cout << "ok" << std::endl;
else
std::cout << "fail" << std::endl;
}
template <typename P>
void test_phrase_parser(
char const* input, P const& p, bool full_match = true)
{
using boost::spirit::qi::phrase_parse;
using boost::spirit::qi::ascii::space;
char const* f(input);
char const* l(f + strlen(f));
if (phrase_parse(f, l, p, space) && (!full_match || (f == l)))
std::cout << "ok" << std::endl;
else
std::cout << "fail" << std::endl;
}
template <typename P, typename T>
void test_parser_attr(
char const* input, P const& p, T& attr, bool full_match = true)
{
using boost::spirit::qi::parse;
char const* f(input);
char const* l(f + strlen(f));
if (parse(f, l, p, attr) && (!full_match || (f == l)))
std::cout << "ok" << std::endl;
else
std::cout << "fail" << std::endl;
}
template <typename P, typename T>
void test_phrase_parser_attr(
char const* input, P const& p, T& attr, bool full_match = true)
{
using boost::spirit::qi::phrase_parse;
using boost::spirit::qi::ascii::space;
char const* f(input);
char const* l(f + strlen(f));
if (phrase_parse(f, l, p, space, attr) && (!full_match || (f == l)))
std::cout << "ok" << std::endl;
else
std::cout << "fail" << std::endl;
}
struct printer
{
typedef boost::spirit::utf8_string string;
void element(string const& tag, string const& value, int depth) const
{
for (int i = 0; i < (depth*4); ++i) std::cout << ' ';
std::cout << "tag: " << tag;
if (value != "")
std::cout << ", value: " << value;
std::cout << std::endl;
}
};
void print_info(boost::spirit::info const& what)
{
using boost::spirit::basic_info_walker;
printer pr;
basic_info_walker<printer> walker(pr, what.tag, 0);
boost::apply_visitor(walker, what.value);
}
template <typename T>
struct ts_real_policies : boost::spirit::qi::ureal_policies<T>
{
template <typename Iterator, typename Attribute>
static bool
parse_frac_n(Iterator& first, Iterator const& last, Attribute& attr,
int& frac_digits)
{
Iterator savef = first;
bool r = boost::spirit::qi::
extract_uint<T, 10, 1, 2, true>::call(first, last, attr);
if (r) {
if (!boost::is_same<T, boost::spirit::unused_type>::value)
frac_digits = static_cast<int>(std::distance(savef, first));
}
return r;
}
template <typename Iterator>
static bool
parse_exp(Iterator&, Iterator const&)
{
return false;
}
template <typename Iterator, typename Attribute>
static bool
parse_exp_n(Iterator&, Iterator const&, Attribute&)
{
return false;
}
template <typename Iterator, typename Accumulator>
static bool
parse_n(Iterator& first, Iterator const& last, Accumulator& result)
{
using boost::spirit::qi::uint_parser;
namespace qi = boost::spirit::qi;
uint_parser<unsigned, 10, 1, 3> uint3;
uint_parser<unsigned, 10, 3, 3> uint3_3;
if (parse(first, last, uint3, result))
{
Accumulator n;
Iterator iter = first;
while (qi::parse(iter, last, ',') && qi::parse(iter, last, uint3_3, n))
{
result = result * 1000 + n;
first = iter;
}
return true;
}
return false;
}
};
struct backwards_bool_policies : boost::spirit::qi::bool_policies<>
{
template <typename Iterator, typename Attribute>
static bool
parse_false(Iterator& first, Iterator const& last, Attribute& attr)
{
namespace qi = boost::spirit::qi;
if (qi::detail::string_parse("eurt", first, last, qi::unused))
{
namespace traits = boost::spirit::traits;
traits::assign_to(false, attr); return true;
}
return false;
}
};
struct complex
{
complex (double a = 0.0, double b = 0.0)
: a(a), b(b)
{}
double a;
double b;
};
std::istream&
operator>> (std::istream& is, complex& z)
{
char lbrace = '\0', comma = '\0', rbrace = '\0';
is >> lbrace >> z.a >> comma >> z.b >> rbrace;
if (lbrace != '{' || comma != ',' || rbrace != '}')
is.setstate(std::ios_base::failbit);
return is;
}
BOOST_FUSION_ADAPT_STRUCT(
complex,
(double, a)
(double, b)
)
namespace boost { namespace spirit { namespace traits
{
template <>
struct create_parser<complex>
{
typedef proto::result_of::deep_copy<
BOOST_TYPEOF('{' >> qi::double_ >> ',' >> qi::double_ >> '}')
>::type type;
static type call()
{
return proto::deep_copy(
'{' >> qi::double_ >> ',' >> qi::double_ >> '}');
}
};
}}}
struct int_data
{
int i;
};
namespace boost { namespace spirit { namespace traits
{
template <>
struct transform_attribute<int_data, int, qi::domain>
{
typedef int& type;
static int& pre(int_data& d) { return d.i; }
static void post(int_data& val, int const& attr) {}
static void fail(int_data&) {}
};
}}}
namespace client
{
using boost::spirit::qi::grammar;
using boost::spirit::qi::rule;
using boost::spirit::ascii::space_type;
struct num_list : grammar<char const*, space_type>
{
num_list() : base_type(start)
{
using boost::spirit::int_;
num = int_;
start = num >> *(',' >> num);
}
rule<char const*, space_type> start, num;
};
}
int
main()
{
{
using boost::spirit::qi::lit;
using boost::spirit::ascii::char_;
test_parser("x", 'x'); test_parser("x", lit('x')); test_parser("x", char_('x'));
char ch;
test_parser_attr("5", char_('0','9'), ch); std::cout << ch << std::endl;
test_parser_attr("5", char_("0-9"), ch); std::cout << ch << std::endl;
namespace phx = boost::phoenix;
test_parser("x", phx::val('x')); test_parser("5",
char_(phx::val('0'),phx::val('9'))); }
{
using boost::spirit::qi::lit;
using boost::spirit::ascii::string;
test_parser("boost", "boost"); test_parser("boost", lit("boost")); test_parser("boost", string("boost")); }
{
using boost::spirit::qi::lit;
using boost::spirit::ascii::string;
std::string s("boost");
test_parser("boost", s); test_parser("boost", lit(s)); test_parser("boost", string(s)); }
{
using boost::spirit::qi::lit;
using boost::spirit::ascii::string;
namespace phx = boost::phoenix;
test_parser("boost", phx::val("boost")); test_parser("boost", lit(phx::val("boost"))); test_parser("boost", string(phx::val("boost"))); }
{
using boost::spirit::qi::symbols;
symbols<char, int> sym;
sym.add
("Apple", 1)
("Banana", 2)
("Orange", 3)
;
int i;
test_parser_attr("Banana", sym, i);
std::cout << i << std::endl;
}
{
using boost::spirit::qi::lexeme;
using boost::spirit::qi::lit;
using boost::spirit::ascii::digit;
test_phrase_parser("12345", lexeme[ -(lit('+') | '-') >> +digit ]);
}
{
using boost::spirit::utree;
using boost::spirit::utree_type;
using boost::spirit::utf8_symbol_type;
using boost::spirit::qi::as;
using boost::spirit::qi::as_string;
using boost::spirit::qi::char_;
utree ut;
typedef as<utf8_symbol_type> as_symbol_type;
as_symbol_type const as_symbol = as_symbol_type();
test_parser_attr("foo", as_string[*char_], ut);
std::cout << ut << std::endl; BOOST_ASSERT(ut.which() == utree_type::string_type);
ut.clear();
test_parser_attr("foo", as<std::string>()[*char_], ut);
std::cout << ut << std::endl; BOOST_ASSERT(ut.which() == utree_type::string_type);
ut.clear();
test_parser_attr("foo", as_symbol[*char_], ut);
std::cout << ut << std::endl; BOOST_ASSERT(ut.which() == utree_type::symbol_type);
ut.clear();
test_parser_attr("foo", as<utf8_symbol_type>()[*char_], ut);
std::cout << ut << std::endl; BOOST_ASSERT(ut.which() == utree_type::symbol_type);
}
{
using boost::spirit::qi::no_skip;
using boost::spirit::qi::char_;
std::string str;
test_phrase_parser_attr("' abc '",
'\'' >> no_skip[+~char_('\'')] >> '\'', str);
std::cout << str << std::endl; }
{
using boost::spirit::qi::hold;
using boost::spirit::qi::int_;
using boost::spirit::qi::attr;
std::vector<int> v;
test_phrase_parser_attr("123",
hold[int_ >> ':' >> int_] | int_ >> attr(0), v);
std::cout << v[0] << "," << v[1] << std::endl; }
{
using boost::spirit::ascii::no_case;
using boost::spirit::ascii::char_;
using boost::spirit::ascii::alnum;
using boost::spirit::qi::symbols;
test_parser("X", no_case[char_('x')]);
test_parser("6", no_case[alnum]);
symbols<char, int> sym;
sym.add
("apple", 1) ("banana", 2)
("orange", 3)
;
int i;
test_parser_attr("Apple", no_case[ sym ], i);
std::cout << i << std::endl;
test_parser_attr("ORANGE", no_case[ sym ], i);
std::cout << i << std::endl;
}
{
using boost::spirit::qi::omit;
using boost::spirit::qi::int_;
using boost::spirit::ascii::char_;
int i;
test_parser_attr("xx345", omit[char_ >> char_] >> int_, i);
std::cout << i << std::endl; }
{
using boost::spirit::qi::matches;
using boost::spirit::qi::int_;
bool result = false;
test_parser_attr("345", matches[int_], result);
std::cout << std::boolalpha << result << std::endl;
result = true;
test_parser_attr("abc", matches[int_], result);
std::cout << std::boolalpha << result << std::endl; }
{
using boost::spirit::qi::raw;
using boost::spirit::ascii::alpha;
using boost::spirit::ascii::alnum;
std::string id;
test_parser_attr("James007", raw[(alpha | '_') >> *(alnum | '_')], id);
std::cout << id << std::endl; }
{
using boost::spirit::qi::repeat;
using boost::spirit::qi::lit;
using boost::spirit::qi::uint_parser;
using boost::spirit::qi::_1;
using boost::spirit::ascii::char_;
namespace phx = boost::phoenix;
test_parser("batman.jpeg", repeat(1, 255)[char_("a-zA-Z_./")]);
uint_parser<unsigned, 16, 6, 6> rgb;
std::vector<unsigned> colors;
test_parser_attr("ffffff0000003f3f3f", repeat(3)[rgb], colors);
std::cout
<< std::hex
<< colors[0] << ','
<< colors[1] << ','
<< colors[2] << std::endl;
test_parser("1011101011110010", repeat(16)[lit('1') | '0']);
std::cout << std::dec;
std::string str;
int n;
test_parser_attr("\x0bHello World",
char_[phx::ref(n) = _1] >> repeat(phx::ref(n))[char_], str);
std::cout << n << ',' << str << std::endl; }
{
using boost::spirit::qi::skip;
using boost::spirit::qi::int_;
using boost::spirit::ascii::space;
test_parser("1, 2, 3, 4, 5", skip(space)[int_ >> *(',' >> int_)]);
}
{
namespace phx = boost::phoenix;
using boost::spirit::qi::attr;
std::string str;
test_parser_attr("", attr("boost"), str);
std::cout << str << std::endl;
double d;
test_parser_attr("", attr(1.0), d);
std::cout << d << std::endl;
d = 0.0;
double d1 = 1.2;
test_parser_attr("", attr(phx::ref(d1)), d);
std::cout << d << std::endl; }
{
using boost::spirit::qi::int_;
int_data d = { 0 };
test_parser_attr("1", boost::spirit::qi::attr_cast(int_), d);
std::cout << d.i << std::endl;
}
{
using boost::spirit::qi::eol;
test_parser("\n", eol);
}
{
using boost::spirit::qi::eoi;
test_parser("", eoi);
}
{
using boost::spirit::qi::eps;
using boost::spirit::qi::int_;
using boost::spirit::qi::_1;
namespace phx = boost::phoenix;
test_parser("", eps);
bool c = true; test_parser("1234", eps(phx::ref(c) == true) >> int_);
test_phrase_parser("1 2 3 4",
*(eps(phx::ref(c) == true) >> int_[phx::ref(c) = (_1 == 4)]));
}
{
using boost::spirit::qi::lazy;
using boost::spirit::ascii::string;
using boost::phoenix::val;
test_parser("Hello", lazy(val(string("Hello"))));
test_parser("Hello", string("Hello"));
}
{
using boost::spirit::ascii::alnum;
using boost::spirit::ascii::blank;
using boost::spirit::ascii::digit;
using boost::spirit::ascii::lower;
test_parser("1", alnum);
test_parser(" ", blank);
test_parser("1", digit);
test_parser("a", lower);
}
{
using boost::phoenix::val;
using boost::spirit::qi::lit;
using boost::spirit::qi::uint_;
using boost::spirit::qi::uint_parser;
test_parser("12345", uint_);
test_parser("12345", uint_(12345));
test_parser("12345", uint_(val(12345)));
test_parser("12345", lit(12345));
test_parser("12345", lit(val(12345)));
uint_parser<unsigned, 10, 1, 3> uint3_p; uint_parser<unsigned, 10, 3, 3> uint3_3_p; test_parser("12,345,678", uint3_p >> *(',' >> uint3_3_p));
}
{
using boost::phoenix::val;
using boost::spirit::qi::lit;
using boost::spirit::qi::int_;
test_parser("+12345", int_);
test_parser("-12345", int_);
test_parser("+12345", int_(12345));
test_parser("-12345", int_(-12345));
test_parser("+12345", int_(val(12345)));
test_parser("-12345", int_(val(-12345)));
test_parser("+12345", lit(12345));
test_parser("-12345", lit(-12345));
test_parser("+12345", lit(val(12345)));
test_parser("-12345", lit(val(-12345)));
}
{
using boost::phoenix::val;
using boost::spirit::qi::double_;
using boost::spirit::qi::real_parser;
using boost::spirit::qi::lit;
test_parser("+12345e6", double_);
test_parser("-12345e6", double_);
test_parser("+12345e6", double_(12345e6));
test_parser("-12345e6", double_(-123456e6));
test_parser("+12345e6", double_(val(12345e6)));
test_parser("-12345e6", double_(val(-123456e6)));
test_parser("+12345e6", lit(12345e6));
test_parser("-12345e6", lit(-123456e6));
test_parser("+12345e6", lit(val(12345e6)));
test_parser("-12345e6", lit(val(-123456e6)));
real_parser<double, ts_real_policies<double> > ts_real;
test_parser("123,456,789.01", ts_real);
test_parser("123,456,789.01", ts_real(123456789.01));
}
{
using boost::phoenix::val;
using boost::spirit::qi::bool_;
using boost::spirit::qi::bool_parser;
using boost::spirit::qi::lit;
test_parser("true", bool_);
test_parser("false", bool_);
test_parser("true", bool_(true));
test_parser("false", bool_(false));
test_parser("true", bool_(val(true)));
test_parser("false", bool_(val(false)));
test_parser("true", lit(true));
test_parser("false", lit(false));
test_parser("true", lit(val(true)));
test_parser("false", lit(val(false)));
bool_parser<bool, backwards_bool_policies> backwards_bool;
test_parser("true", backwards_bool);
test_parser("eurt", backwards_bool);
test_parser("true", backwards_bool(true));
test_parser("eurt", backwards_bool(false));
}
{
using boost::spirit::ascii::char_;
using boost::spirit::qi::_1;
using boost::spirit::qi::_2;
namespace bf = boost::fusion;
test_parser("xy", char_ >> char_);
bf::vector<char, char> attr;
test_parser_attr("xy", char_ >> char_, attr);
std::cout << bf::at_c<0>(attr) << ',' << bf::at_c<1>(attr) << std::endl;
std::vector<char> vec;
test_parser_attr("xy", char_ >> char_, vec);
std::cout << vec[0] << ',' << vec[1] << std::endl;
test_parser("xy", (char_ >> char_)[std::cout << _1 << ',' << _2 << std::endl]);
}
{
using boost::spirit::qi::int_;
test_parser("123.456", int_ || ('.' >> int_)); test_parser("123", int_ || ('.' >> int_)); test_parser(".456", int_ || ('.' >> int_));
}
{
using boost::spirit::ascii::string;
using boost::spirit::qi::int_;
using boost::spirit::qi::_1;
using boost::variant;
test_parser("Hello", string("Hello") | int_);
test_parser("123", string("Hello") | int_);
variant<std::string, int> attr;
test_parser_attr("Hello", string("Hello") | int_, attr);
if (boost::get<int>(&attr))
std::cout << boost::get<int>(attr) << std::endl;
else
std::cout << boost::get<std::string>(attr) << std::endl;
test_parser("123", (string("Hello") | int_)[std::cout << _1 << std::endl]);
}
{
using boost::spirit::ascii::char_;
test_parser("ACTGGCTAGACT", *(char_('A') ^ 'C' ^ 'T' ^ 'G'));
}
{
using boost::spirit::ascii::char_;
using boost::spirit::qi::expectation_failure;
try
{
test_parser("xi", char_('x') > char_('o')); }
catch (expectation_failure<char const*> const& x)
{
std::cout << "expected: "; print_info(x.what_);
std::cout << "got: \"" << std::string(x.first, x.last) << '"' << std::endl;
}
}
{
using boost::spirit::ascii::char_;
using boost::spirit::qi::expect;
using boost::spirit::qi::expectation_failure;
try
{
test_parser("xi", expect[char_('o')]); }
catch (expectation_failure<char const*> const& x)
{
std::cout << "expected: "; print_info(x.what_);
std::cout << "got: \"" << std::string(x.first, x.last) << '"' << std::endl;
}
}
{
using boost::spirit::lit;
test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);
}
{
using boost::spirit::ascii::char_;
using boost::spirit::ascii::alpha;
using boost::spirit::qi::lit;
using boost::spirit::qi::symbols;
test_parser("abcdef;", *(!lit(';') >> char_) >> ';');
symbols<char, int> keywords;
keywords = "begin", "end", "for";
test_parser("beginner", keywords >> !(alpha | '_'));
test_parser("end ", keywords >> !(alpha | '_'), false);
test_parser("for()", keywords >> !(alpha | '_'), false);
}
{
using boost::spirit::ascii::char_;
test_parser("/*A Comment*/", "/*" >> *(char_ - "*/") >> "*/");
}
{
using boost::spirit::qi::int_;
std::vector<int> attr;
test_phrase_parser_attr(
"111, 222, 333, 444, 555", int_ >> *(',' >> int_), attr);
std::cout
<< attr[0] << ',' << attr[1] << ',' << attr[2] << ','
<< attr[3] << ',' << attr[4]
<< std::endl;
}
{
using boost::spirit::ascii::alpha;
using boost::spirit::qi::lexeme;
std::vector<std::string> attr;
test_phrase_parser_attr("yaba daba doo", +lexeme[+alpha], attr);
std::cout << attr[0] << ',' << attr[1] << ',' << attr[2] << std::endl;
}
{
using boost::spirit::ascii::char_;
using boost::spirit::qi::lexeme;
using boost::spirit::qi::int_;
using boost::fusion::vector;
using boost::fusion::at_c;
using boost::optional;
vector<std::string, optional<int>, optional<char> > attr;
test_phrase_parser_attr(
"\"James Bond\", M"
, lexeme['"' >> +(char_ - '"') >> '"'] >> -(',' >> int_) >> -(',' >> char_) , attr);
std::cout << at_c<0>(attr); if (at_c<1>(attr)) std::cout << ',' << *at_c<1>(attr);
if (at_c<2>(attr)) std::cout << ',' << *at_c<2>(attr);
std::cout << std::endl;
}
{
using boost::spirit::qi::int_;
std::vector<int> attr;
test_phrase_parser_attr(
"111, 222, 333, 444, 555", int_ % ',', attr);
std::cout
<< attr[0] << ',' << attr[1] << ',' << attr[2] << ','
<< attr[3] << ',' << attr[4]
<< std::endl;
}
{
using boost::spirit::qi::stream;
using boost::spirit::qi::stream_parser;
std::string str;
test_parser_attr("abc", stream, str);
std::cout << str << std::endl;
complex c;
test_parser_attr("{1.0,2.5}", stream_parser<char, complex>(), c);
std::cout << c.a << "," << c.b << std::endl; }
{
using boost::spirit::qi::auto_;
int i = 0;
test_parser_attr("123", auto_, i);
std::cout << i << std::endl;
complex c;
test_parser_attr("{1.2,2.4}", auto_, c);
std::cout << c.a << "," << c.b << std::endl; }
{
using boost::spirit::qi::byte_;
using boost::spirit::qi::word;
using boost::spirit::qi::dword;
using boost::spirit::qi::qword;
boost::uint8_t uc;
boost::uint16_t us;
boost::uint32_t ui;
#ifdef BOOST_HAS_LONG_LONG
boost::uint64_t ul;
#endif
#if BOOST_ENDIAN_LITTLE_BYTE
test_parser_attr("\x01", byte_, uc); assert(uc == 0x01);
test_parser_attr("\x01\x02", word, us); assert(us == 0x0201);
test_parser_attr("\x01\x02\x03\x04", dword, ui); assert(ui == 0x04030201);
#ifdef BOOST_HAS_LONG_LONG
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", qword, ul);
assert(ul == 0x0807060504030201LL);
#endif
test_parser("\x01", byte_(0x01));
test_parser("\x01\x02", word(0x0201));
test_parser("\x01\x02\x03\x04", dword(0x04030201));
#ifdef BOOST_HAS_LONG_LONG
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
qword(0x0807060504030201LL));
#endif
#else
test_parser_attr("\x01", byte_, uc); assert(uc == 0x01);
test_parser_attr("\x01\x02", word, us); assert(us == 0x0102);
test_parser_attr("\x01\x02\x03\x04", dword, ui); assert(ui == 0x01020304);
#ifdef BOOST_HAS_LONG_LONG
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", qword, ul);
assert(0x0102030405060708LL);
#endif
test_parser("\x01", byte_(0x01));
test_parser("\x01\x02", word(0x0102));
test_parser("\x01\x02\x03\x04", dword(0x01020304));
#ifdef BOOST_HAS_LONG_LONG
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
qword(0x0102030405060708LL));
#endif
#endif
}
{
using boost::spirit::qi::little_word;
using boost::spirit::qi::little_dword;
using boost::spirit::qi::little_qword;
boost::uint16_t us;
boost::uint32_t ui;
#ifdef BOOST_HAS_LONG_LONG
boost::uint64_t ul;
#endif
test_parser_attr("\x01\x02", little_word, us); assert(us == 0x0201);
test_parser_attr("\x01\x02\x03\x04", little_dword, ui); assert(ui == 0x04030201);
#ifdef BOOST_HAS_LONG_LONG
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul);
assert(ul == 0x0807060504030201LL);
#endif
test_parser("\x01\x02", little_word(0x0201));
test_parser("\x01\x02\x03\x04", little_dword(0x04030201));
#ifdef BOOST_HAS_LONG_LONG
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
little_qword(0x0807060504030201LL));
#endif
}
{
using boost::spirit::qi::big_word;
using boost::spirit::qi::big_dword;
using boost::spirit::qi::big_qword;
boost::uint16_t us;
boost::uint32_t ui;
#ifdef BOOST_HAS_LONG_LONG
boost::uint64_t ul;
#endif
test_parser_attr("\x01\x02", big_word, us); assert(us == 0x0102);
test_parser_attr("\x01\x02\x03\x04", big_dword, ui); assert(ui == 0x01020304);
#ifdef BOOST_HAS_LONG_LONG
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", big_qword, ul);
assert(0x0102030405060708LL);
#endif
test_parser("\x01\x02", big_word(0x0102));
test_parser("\x01\x02\x03\x04", big_dword(0x01020304));
#ifdef BOOST_HAS_LONG_LONG
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
big_qword(0x0102030405060708LL));
#endif
}
{
using boost::spirit::qi::rule;
using boost::spirit::qi::int_;
using boost::spirit::qi::locals;
using boost::spirit::qi::_1;
using boost::spirit::qi::_a;
using boost::spirit::ascii::alpha;
using boost::spirit::ascii::char_;
using boost::spirit::ascii::space_type;
rule<char const*> r;
r = int_;
test_parser("123", r);
rule<char const*, int()> ra;
ra = int_;
int i;
test_parser_attr("123", ra, i);
assert(i == 123);
rule<char const*, std::vector<int>(), space_type> rs;
rs = *int_;
std::vector<int> v;
test_phrase_parser_attr("123 456 789", rs, v);
assert(v[0] == 123);
assert(v[1] == 456);
assert(v[2] == 789);
rule<char const*, locals<char> > rl;
rl = alpha[_a = _1] >> char_(_a); test_parser("aa", rl); test_parser("ax", rl); }
{
using client::num_list;
using boost::spirit::ascii::space_type;
using boost::spirit::int_;
using boost::spirit::qi::grammar;
using boost::spirit::qi::rule;
num_list nlist;
test_phrase_parser("123, 456, 789", nlist);
}
return 0;
}