1 /*=============================================================================
2 Copyright (c) 1998-2003 Joel de Guzman
3 http://spirit.sourceforge.net/
5 Use, modification and distribution is subject to the Boost Software
6 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 http://www.boost.org/LICENSE_1_0.txt)
8 =============================================================================*/
10 #include <boost/detail/lightweight_test.hpp>
13 //#define BOOST_SPIRIT_DEBUG
14 #define BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT 3
16 #include <boost/spirit/include/classic_core.hpp>
17 #include <boost/spirit/include/classic_stored_rule.hpp>
18 using namespace BOOST_SPIRIT_CLASSIC_NS
;
20 ///////////////////////////////////////////////////////////////////////////////
24 ///////////////////////////////////////////////////////////////////////////////
32 std::cout
<< "sizeof(rule<>): " << sizeof(rule
<>) << std::endl
;
34 BOOST_SPIRIT_DEBUG_RULE(a
);
35 BOOST_SPIRIT_DEBUG_RULE(b
);
36 BOOST_SPIRIT_DEBUG_RULE(c
);
39 BOOST_SPIRIT_DEBUG_RULE(start
);
42 d
= start
; // aliasing
44 parse_info
<char const*> pi
;
47 pi
= parse("abcabcacb", d
);
50 BOOST_TEST(pi
.length
== 9);
51 BOOST_TEST(*pi
.stop
== 0);
53 start
= (a
| b
) >> (start
| b
);
54 pi
= parse("aaaabababaaabbb", d
);
57 BOOST_TEST(pi
.length
== 15);
58 BOOST_TEST(*pi
.stop
== 0);
62 rule_template_param_tests()
64 // test that rules can be issued its template params in any order:
68 rule
<scanner
<>, parser_context
<> > rx3
;
69 rule
<scanner
<>, parser_context
<>, parser_address_tag
> rx4
;
71 rule
<parser_context
<> > rx5
;
72 rule
<parser_context
<>, parser_address_tag
> rx6
;
73 rule
<parser_context
<>, parser_address_tag
, scanner
<> > rx7
;
75 rule
<parser_address_tag
> rx8
;
76 rule
<parser_address_tag
, scanner
<> > rx9
;
77 rule
<parser_address_tag
, scanner
<>, parser_context
<> > rx10
;
79 rule
<parser_address_tag
, parser_context
<> > rx11
;
80 rule
<parser_address_tag
, parser_context
<>, scanner
<> > rx12
;
82 rule
<parser_context
<>, scanner
<> > rx13
;
83 rule
<parser_context
<>, scanner
<>, parser_address_tag
> rx14
;
86 struct my_grammar
: public grammar
<my_grammar
>
88 template <typename ScannerT
>
91 definition(my_grammar
const& /*self*/)
94 rr
= +(lexeme_d
[r
] >> as_lower_d
[r
] >> r
);
99 , typename lexeme_scanner
<ScannerT
>::type
100 , typename as_lower_scanner
<ScannerT
>::type
105 rule
<ScannerT
> const& start() const { return rr
; }
110 rule_2_or_more_scanners_tests()
113 typedef scanner_list
<scanner
<>, phrase_scanner_t
> scanners
;
115 rule
<scanners
> r
= +anychar_p
;
116 BOOST_TEST(parse("abcdefghijk", r
).full
);
117 BOOST_TEST(parse("a b c d e f g h i j k", r
, space_p
).full
);
122 BOOST_TEST(parse("abcdef aBc d e f aBc d E f", g
, space_p
).full
);
129 rule
<> a
= ch_p('a');
130 rule
<> b
= ch_p('b');
131 rule
<> c
= ch_p('c');
133 BOOST_SPIRIT_DEBUG_RULE(a
);
134 BOOST_SPIRIT_DEBUG_RULE(b
);
135 BOOST_SPIRIT_DEBUG_RULE(c
);
137 parse_info
<char const*> pi
;
139 rule
<> start
= *(a
| b
| c
);
141 BOOST_SPIRIT_DEBUG_RULE(start
);
143 pi
= parse("abcabcacb", start
);
146 BOOST_TEST(pi
.length
== 9);
147 BOOST_TEST(*pi
.stop
== 0);
149 start
= (a
| b
) >> (start
| b
);
150 pi
= parse("aaaabababaaabbb", start
);
153 BOOST_TEST(pi
.length
== 15);
154 BOOST_TEST(*pi
.stop
== 0);
156 pi
= parse("aaaabababaaabba", start
);
158 BOOST_TEST(!pi
.full
);
159 BOOST_TEST(pi
.length
== 14);
161 rule
<> r
= anychar_p
;
162 r
.copy(); // copy test (compile only)
166 stored_rule_basic_tests()
168 stored_rule
<> a
= ch_p('a');
169 stored_rule
<> b
= ch_p('b');
170 stored_rule
<> c
= ch_p('c');
172 BOOST_SPIRIT_DEBUG_RULE(a
);
173 BOOST_SPIRIT_DEBUG_RULE(b
);
174 BOOST_SPIRIT_DEBUG_RULE(c
);
176 parse_info
<char const*> pi
;
178 stored_rule
<> start
= *(a
| b
| c
);
180 BOOST_SPIRIT_DEBUG_RULE(start
);
182 pi
= parse("abcabcacb", start
);
185 BOOST_TEST(pi
.length
== 9);
186 BOOST_TEST(*pi
.stop
== 0);
188 start
= (a
| b
) >> (start
| b
);
189 pi
= parse("aaaabababaaabbb", start
);
192 BOOST_TEST(pi
.length
== 15);
193 BOOST_TEST(*pi
.stop
== 0);
195 pi
= parse("aaaabababaaabba", start
);
197 BOOST_TEST(!pi
.full
);
198 BOOST_TEST(pi
.length
== 14);
202 stored_rule_dynamic_tests()
204 rule
<> a
= ch_p('a');
205 rule
<> b
= ch_p('b');
206 rule
<> c
= ch_p('c');
208 BOOST_SPIRIT_DEBUG_RULE(a
);
209 BOOST_SPIRIT_DEBUG_RULE(b
);
210 BOOST_SPIRIT_DEBUG_RULE(c
);
212 parse_info
<char const*> pi
;
214 // The FF is the dynamic equivalent of start = *(a | b | c);
215 stored_rule
<> start
= a
;
216 start
= start
.copy() | b
;
217 start
= start
.copy() | c
;
218 start
= *(start
.copy());
220 std::cout
<< "sizeof(stored_rule<>): " << sizeof(stored_rule
<>) << std::endl
;
222 BOOST_SPIRIT_DEBUG_RULE(start
);
224 pi
= parse("abcabcacb", start
);
227 BOOST_TEST(pi
.length
== 9);
228 BOOST_TEST(*pi
.stop
== 0);
230 // The FF is the dynamic equivalent of start = (a | b) >> (start | b);
232 start
= a
| start
.copy();
233 start
= start
.copy() >> (start
| b
);
235 pi
= parse("aaaabababaaabbb", start
);
238 BOOST_TEST(pi
.length
== 15);
239 BOOST_TEST(*pi
.stop
== 0);
241 pi
= parse("aaaabababaaabba", start
);
243 BOOST_TEST(!pi
.full
);
244 BOOST_TEST(pi
.length
== 14);
247 ///////////////////////////////////////////////////////////////////////////////
251 ///////////////////////////////////////////////////////////////////////////////
257 rule_template_param_tests();
258 rule_2_or_more_scanners_tests();
259 stored_rule_basic_tests();
260 stored_rule_dynamic_tests();
262 return boost::report_errors();