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

source code of boost/libs/spirit/test/qi/kleene.cpp