]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/spirit/test/qi/rule1.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / spirit / test / qi / rule1.cpp
CommitLineData
7c673cae
FG
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
7c673cae
FG
8#include <boost/detail/lightweight_test.hpp>
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_auxiliary.hpp>
14#include <boost/spirit/include/qi_directive.hpp>
15#include <boost/spirit/include/qi_nonterminal.hpp>
16#include <boost/spirit/include/qi_action.hpp>
7c673cae
FG
17#include <boost/fusion/include/std_pair.hpp>
18
19#include <string>
20#include <cstring>
21#include <iostream>
22#include "test.hpp"
23
24int
25main()
26{
27 using spirit_test::test_attr;
28 using spirit_test::test;
29
30 using namespace boost::spirit::ascii;
31 using namespace boost::spirit::qi::labels;
32 using boost::spirit::qi::locals;
33 using boost::spirit::qi::rule;
34 using boost::spirit::qi::int_;
35 using boost::spirit::qi::uint_;
36 using boost::spirit::qi::fail;
37 using boost::spirit::qi::on_error;
38 using boost::spirit::qi::debug;
39 using boost::spirit::qi::lit;
40
7c673cae
FG
41 { // basic tests
42
43 rule<char const*> a, b, c, start;
44
45 a = 'a';
46 b = 'b';
47 c = 'c';
48
49 a.name("a");
50 b.name("b");
51 c.name("c");
52 start.name("start");
53
54 debug(a);
55 debug(b);
56 debug(c);
57 debug(start);
58
59 start = *(a | b | c);
60 BOOST_TEST(test("abcabcacb", start));
61
62 start = (a | b) >> (start | b);
63 BOOST_TEST(test("aaaabababaaabbb", start));
64 BOOST_TEST(test("aaaabababaaabba", start, false));
65
66 // ignore the skipper!
67 BOOST_TEST(test("aaaabababaaabba", start, space, false));
68 }
69
70 { // basic tests with direct initialization
71
72 rule<char const*> a ('a');
73 rule<char const*> b ('b');
74 rule<char const*> c ('c');
92f5a8d4
TL
75#ifdef BOOST_CLANG
76# pragma clang diagnostic push
77// variable 'start' is uninitialized when used within its own initialization
78# pragma clang diagnostic ignored "-Wuninitialized"
79#endif
7c673cae 80 rule<char const*> start = (a | b) >> (start | b);
92f5a8d4
TL
81#ifdef BOOST_CLANG
82# pragma clang diagnostic pop
83#endif
7c673cae
FG
84
85 BOOST_TEST(test("aaaabababaaabbb", start));
86 BOOST_TEST(test("aaaabababaaabba", start, false));
87
88 // ignore the skipper!
89 BOOST_TEST(test("aaaabababaaabba", start, space, false));
90 }
91
92 { // basic tests w/ skipper
93 rule<char const*, space_type> a, b, c, start;
94
95 a = 'a';
96 b = 'b';
97 c = 'c';
98
99 a.name("a");
100 b.name("b");
101 c.name("c");
102 start.name("start");
103
104 debug(a);
105 debug(b);
106 debug(c);
107 debug(start);
108
109 start = *(a | b | c);
110 BOOST_TEST(test(" a b c a b c a c b ", start, space));
111
112 start = (a | b) >> (start | b);
113 BOOST_TEST(test(" a a a a b a b a b a a a b b b ", start, space));
114 BOOST_TEST(test(" a a a a b a b a b a a a b b a ", start, space, false));
115 }
116
117 { // basic tests w/ skipper but no final post-skip
118
119 rule<char const*, space_type> a, b, c, start;
120
121 a = 'a';
122 b = 'b';
123 c = 'c';
124
125 a.name("a");
126 b.name("b");
127 c.name("c");
128 start.name("start");
129
130 debug(a);
131 debug(b);
132 debug(c);
133 debug(start);
134
135 start = *(a | b) >> c;
136
137 using boost::spirit::qi::phrase_parse;
138 using boost::spirit::qi::skip_flag;
139 {
140 char const *s1 = " a b a a b b a c ... "
141 , *const e1 = s1 + std::strlen(s1);
142 BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::dont_postskip)
143 && s1 == e1 - 5);
144 }
145
146 start = (a | b) >> (start | c);
147 {
148 char const *s1 = " a a a a b a b a b a a a b b b c "
149 , *const e1 = s1 + std::strlen(s1);
150 BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::postskip)
151 && s1 == e1);
152 }
153 {
154 char const *s1 = " a a a a b a b a b a a a b b b c "
155 , *const e1 = s1 + std::strlen(s1);
156 BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::dont_postskip)
157 && s1 == e1 - 1);
158 }
159 }
160
161 return boost::report_errors();
162}
163