1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Distributed under 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 <string>
#include <vector>
#include <boost/detail/lightweight_test.hpp>
#include <boost/spirit/include/qi_operator.hpp>
#include <boost/spirit/include/qi_char.hpp>
#include <boost/spirit/include/qi_string.hpp>
#include <boost/spirit/include/qi_numeric.hpp>
#include <boost/spirit/include/qi_directive.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/support_argument.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <string>
#include <iostream>
#include "test.hpp"
struct x_attr
{
};
namespace boost { namespace spirit { namespace traits
{
template <>
struct container_value<x_attr>
{
typedef char type; // value type of container
};
template <>
struct push_back_container<x_attr, char>
{
static bool call(x_attr& /*c*/, char /*val*/)
{
// push back value type into container
return true;
}
};
}}}
int
main()
{
using spirit_test::test;
using spirit_test::test_attr;
using namespace boost::spirit::ascii;
using boost::spirit::qi::omit;
using boost::spirit::qi::uint_;
using boost::spirit::qi::int_;
using boost::spirit::qi::lexeme;
{
BOOST_TEST(test("aaaaaaaa", *char_));
BOOST_TEST(test("a", *char_));
BOOST_TEST(test("", *char_));
BOOST_TEST(test("aaaaaaaa", *alpha));
BOOST_TEST(!test("aaaaaaaa", *upper));
}
{
BOOST_TEST(test(" a a aaa aa", *char_, space));
BOOST_TEST(test("12345 678 9", *digit, space));
}
{
BOOST_TEST(test("aBcdeFGH", no_case[*char_]));
BOOST_TEST(test("a B cde FGH", no_case[*char_], space));
}
{
BOOST_TEST(test("12345 678 955 987", *uint_, space));
BOOST_TEST(test("12345, 678, 955, 987", uint_ >> *(',' >> uint_), space));
}
{
std::string s;
BOOST_TEST(test_attr("bbbb", *char_, s) && 4 == s.size() && s == "bbbb");
s.clear();
BOOST_TEST(test_attr("b b b b ", *char_, s, space) && s == "bbbb");
// The following 2 tests show that omit does not inhibit explicit attributes
s.clear();
BOOST_TEST(test_attr("bbbb", omit[*char_('b')], s) && s == "bbbb");
s.clear();
BOOST_TEST(test_attr("b b b b", omit[*char_('b')], s, space) && s == "bbbb");
}
{
std::vector<int> v;
BOOST_TEST(test_attr("123 456 789 10", *int_, v, space) && 4 == v.size() &&
v[0] == 123 && v[1] == 456 && v[2] == 789 && v[3] == 10);
}
{
std::vector<std::string> v;
BOOST_TEST(test_attr("a b c d", *lexeme[+alpha], v, space) && 4 == v.size() &&
v[0] == "a" && v[1] == "b" && v[2] == "c" && v[3] == "d");
}
{
std::vector<int> v;
BOOST_TEST(test_attr("123 456 789", *int_, v, space) && 3 == v.size() &&
v[0] == 123 && v[1] == 456 && v[2] == 789);
}
{ // actions
namespace phx = boost::phoenix;
using boost::spirit::_1;
std::vector<char> v;
BOOST_TEST(test("bbbb", (*char_)[phx::ref(v) = _1]) && 4 == v.size() &&
v[0] == 'b' && v[1] == 'b' && v[2] == 'b' && v[3] == 'b');
}
{ // more actions
namespace phx = boost::phoenix;
using boost::spirit::_1;
std::vector<int> v;
BOOST_TEST(test("123 456 789", (*int_)[phx::ref(v) = _1], space) && 3 == v.size() &&
v[0] == 123 && v[1] == 456 && v[2] == 789);
}
{ // attribute customization
x_attr x;
test_attr("abcde", *char_, x);
}
return boost::report_errors();
}
|