Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/spirit/test/rule_tests.cpp @ 33

Last change on this file since 33 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 6.4 KB
Line 
1/*=============================================================================
2    Copyright (c) 1998-2003 Joel de Guzman
3    http://spirit.sourceforge.net/
4
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=============================================================================*/
9#include <iostream>
10#include <boost/detail/lightweight_test.hpp>
11
12using namespace std;
13
14//#define BOOST_SPIRIT_DEBUG
15#define BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT 3
16
17#include <boost/spirit/core.hpp>
18#include <boost/spirit/dynamic/stored_rule.hpp>
19using namespace boost::spirit;
20
21///////////////////////////////////////////////////////////////////////////////
22//
23//  Rule tests
24//
25///////////////////////////////////////////////////////////////////////////////
26void
27aliasing_tests()
28{
29    rule<>  a = ch_p('a');
30    rule<>  b = ch_p('b');
31    rule<>  c = ch_p('c');
32
33    cout << "sizeof(rule<>): " << sizeof(rule<>) << endl;
34
35    BOOST_SPIRIT_DEBUG_RULE(a);
36    BOOST_SPIRIT_DEBUG_RULE(b);
37    BOOST_SPIRIT_DEBUG_RULE(c);
38
39    rule<>  start;
40    BOOST_SPIRIT_DEBUG_RULE(start);
41
42    rule<>  d;
43    d = start;  // aliasing
44
45    parse_info<char const*> pi;
46
47    start = *(a | b | c);
48    pi = parse("abcabcacb", d);
49    BOOST_TEST(pi.hit);
50    BOOST_TEST(pi.full);
51    BOOST_TEST(pi.length == 9);
52    BOOST_TEST(*pi.stop == 0);
53
54    start   = (a | b) >> (start | b);
55    pi = parse("aaaabababaaabbb", d);
56    BOOST_TEST(pi.hit);
57    BOOST_TEST(pi.full);
58    BOOST_TEST(pi.length == 15);
59    BOOST_TEST(*pi.stop == 0);
60}
61
62void
63rule_template_param_tests()
64{
65    // test that rules can be issued its template params in any order:
66
67    rule<> rx1;
68    rule<scanner<> > rx2;
69    rule<scanner<>, parser_context<> > rx3;
70    rule<scanner<>, parser_context<>, parser_address_tag> rx4;
71
72    rule<parser_context<> > rx5;
73    rule<parser_context<>, parser_address_tag> rx6;
74    rule<parser_context<>, parser_address_tag, scanner<> > rx7;
75
76    rule<parser_address_tag> rx8;
77    rule<parser_address_tag, scanner<> > rx9;
78    rule<parser_address_tag, scanner<>, parser_context<> > rx10;
79
80    rule<parser_address_tag, parser_context<> > rx11;
81    rule<parser_address_tag, parser_context<>, scanner<> > rx12;
82
83    rule<parser_context<>, scanner<> > rx13;
84    rule<parser_context<>, scanner<>, parser_address_tag> rx14;
85}
86
87struct my_grammar : public grammar<my_grammar>
88{
89    template <typename ScannerT>
90    struct definition
91    {
92        definition(my_grammar const& /*self*/)
93        {
94            r = lower_p;
95            rr = +(lexeme_d[r] >> as_lower_d[r] >> r);
96        }
97
98        typedef scanner_list<
99            ScannerT
100          , typename lexeme_scanner<ScannerT>::type
101          , typename as_lower_scanner<ScannerT>::type
102        > scanners;
103
104        rule<scanners> r;
105        rule<ScannerT> rr;
106        rule<ScannerT> const& start() const { return rr; }
107    };
108};
109
110void
111rule_2_or_more_scanners_tests()
112{
113    { // 2 scanners
114        typedef scanner_list<scanner<>, phrase_scanner_t> scanners;
115
116        rule<scanners>  r = +anychar_p;
117        BOOST_TEST(parse("abcdefghijk", r).full);
118        BOOST_TEST(parse("a b c d e f g h i j k", r, space_p).full);
119    }
120
121    { // 3 scanners
122        my_grammar g;
123        BOOST_TEST(parse("abcdef aBc d e f aBc d E f", g, space_p).full);
124    }
125}
126
127void
128rule_basic_tests()
129{
130    rule<>  a = ch_p('a');
131    rule<>  b = ch_p('b');
132    rule<>  c = ch_p('c');
133
134    BOOST_SPIRIT_DEBUG_RULE(a);
135    BOOST_SPIRIT_DEBUG_RULE(b);
136    BOOST_SPIRIT_DEBUG_RULE(c);
137
138    parse_info<char const*> pi;
139
140    rule<>  start = *(a | b | c);
141
142    BOOST_SPIRIT_DEBUG_RULE(start);
143
144    pi = parse("abcabcacb", start);
145    BOOST_TEST(pi.hit);
146    BOOST_TEST(pi.full);
147    BOOST_TEST(pi.length == 9);
148    BOOST_TEST(*pi.stop == 0);
149
150    start   = (a | b) >> (start | b);
151    pi = parse("aaaabababaaabbb", start);
152    BOOST_TEST(pi.hit);
153    BOOST_TEST(pi.full);
154    BOOST_TEST(pi.length == 15);
155    BOOST_TEST(*pi.stop == 0);
156
157    pi = parse("aaaabababaaabba", start);
158    BOOST_TEST(pi.hit);
159    BOOST_TEST(!pi.full);
160    BOOST_TEST(pi.length == 14);
161}
162
163void
164stored_rule_basic_tests()
165{
166    stored_rule<>  a = ch_p('a');
167    stored_rule<>  b = ch_p('b');
168    stored_rule<>  c = ch_p('c');
169
170    BOOST_SPIRIT_DEBUG_RULE(a);
171    BOOST_SPIRIT_DEBUG_RULE(b);
172    BOOST_SPIRIT_DEBUG_RULE(c);
173
174    parse_info<char const*> pi;
175
176    stored_rule<>  start = *(a | b | c);
177
178    BOOST_SPIRIT_DEBUG_RULE(start);
179
180    pi = parse("abcabcacb", start);
181    BOOST_TEST(pi.hit);
182    BOOST_TEST(pi.full);
183    BOOST_TEST(pi.length == 9);
184    BOOST_TEST(*pi.stop == 0);
185
186    start   = (a | b) >> (start | b);
187    pi = parse("aaaabababaaabbb", start);
188    BOOST_TEST(pi.hit);
189    BOOST_TEST(pi.full);
190    BOOST_TEST(pi.length == 15);
191    BOOST_TEST(*pi.stop == 0);
192
193    pi = parse("aaaabababaaabba", start);
194    BOOST_TEST(pi.hit);
195    BOOST_TEST(!pi.full);
196    BOOST_TEST(pi.length == 14);
197}
198
199void
200stored_rule_dynamic_tests()
201{
202    rule<>  a = ch_p('a');
203    rule<>  b = ch_p('b');
204    rule<>  c = ch_p('c');
205
206    BOOST_SPIRIT_DEBUG_RULE(a);
207    BOOST_SPIRIT_DEBUG_RULE(b);
208    BOOST_SPIRIT_DEBUG_RULE(c);
209
210    parse_info<char const*> pi;
211
212    // The FF is the dynamic equivalent of start = *(a | b | c);
213    stored_rule<>  start = a;
214    start = start.copy() | b;
215    start = start.copy() | c;
216    start = *(start.copy());
217
218    cout << "sizeof(stored_rule<>): " << sizeof(stored_rule<>) << endl;
219
220    BOOST_SPIRIT_DEBUG_RULE(start);
221
222    pi = parse("abcabcacb", start);
223    BOOST_TEST(pi.hit);
224    BOOST_TEST(pi.full);
225    BOOST_TEST(pi.length == 9);
226    BOOST_TEST(*pi.stop == 0);
227
228    // The FF is the dynamic equivalent of start = (a | b) >> (start | b);
229    start = b;
230    start = a | start.copy();
231    start = start.copy() >> (start | b);
232
233    pi = parse("aaaabababaaabbb", start);
234    BOOST_TEST(pi.hit);
235    BOOST_TEST(pi.full);
236    BOOST_TEST(pi.length == 15);
237    BOOST_TEST(*pi.stop == 0);
238
239    pi = parse("aaaabababaaabba", start);
240    BOOST_TEST(pi.hit);
241    BOOST_TEST(!pi.full);
242    BOOST_TEST(pi.length == 14);
243}
244
245///////////////////////////////////////////////////////////////////////////////
246//
247//  Main
248//
249///////////////////////////////////////////////////////////////////////////////
250int
251main()
252{
253    rule_basic_tests();
254    aliasing_tests();
255    rule_template_param_tests();
256    rule_2_or_more_scanners_tests();
257    stored_rule_basic_tests();
258    stored_rule_dynamic_tests();
259
260    return boost::report_errors();
261}
262
Note: See TracBrowser for help on using the repository browser.