]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*============================================================================= |
2 | Copyright (c) 2002-2010 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 | /////////////////////////////////////////////////////////////////////////////// | |
8 | // | |
9 | // This sample demontrates a parser for a comma separated list of numbers. | |
10 | // The numbers are inserted in a vector using phoenix. | |
11 | // | |
12 | // [ JDG May 10, 2002 ] spirit1 | |
13 | // [ JDG March 24, 2007 ] spirit2 | |
14 | // | |
15 | /////////////////////////////////////////////////////////////////////////////// | |
16 | ||
7c673cae | 17 | #include <boost/spirit/include/qi.hpp> |
1e59de90 TL |
18 | #include <boost/phoenix/core.hpp> |
19 | #include <boost/phoenix/operator.hpp> | |
20 | #include <boost/phoenix/stl.hpp> | |
7c673cae FG |
21 | |
22 | #include <iostream> | |
23 | #include <string> | |
24 | #include <vector> | |
25 | ||
26 | namespace client | |
27 | { | |
28 | namespace qi = boost::spirit::qi; | |
29 | namespace ascii = boost::spirit::ascii; | |
30 | namespace phoenix = boost::phoenix; | |
31 | ||
32 | /////////////////////////////////////////////////////////////////////////////// | |
33 | // Our number list compiler | |
34 | /////////////////////////////////////////////////////////////////////////////// | |
35 | //[tutorial_numlist3 | |
36 | template <typename Iterator> | |
37 | bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v) | |
38 | { | |
39 | using qi::double_; | |
40 | using qi::phrase_parse; | |
41 | using qi::_1; | |
42 | using ascii::space; | |
43 | using phoenix::push_back; | |
44 | ||
45 | bool r = phrase_parse(first, last, | |
46 | ||
47 | // Begin grammar | |
48 | ( | |
49 | double_[push_back(phoenix::ref(v), _1)] % ',' | |
50 | ) | |
51 | , | |
52 | // End grammar | |
53 | ||
54 | space); | |
55 | ||
56 | if (first != last) // fail if we did not get a full match | |
57 | return false; | |
58 | return r; | |
59 | } | |
60 | //] | |
61 | } | |
62 | ||
63 | //////////////////////////////////////////////////////////////////////////// | |
64 | // Main program | |
65 | //////////////////////////////////////////////////////////////////////////// | |
66 | int | |
67 | main() | |
68 | { | |
69 | std::cout << "/////////////////////////////////////////////////////////\n\n"; | |
70 | std::cout << "\t\tA comma separated list parser for Spirit...\n\n"; | |
71 | std::cout << "/////////////////////////////////////////////////////////\n\n"; | |
72 | ||
73 | std::cout << "Give me a comma separated list of numbers.\n"; | |
74 | std::cout << "The numbers will be inserted in a vector of numbers\n"; | |
75 | std::cout << "Type [q or Q] to quit\n\n"; | |
76 | ||
77 | std::string str; | |
78 | while (getline(std::cin, str)) | |
79 | { | |
80 | if (str.empty() || str[0] == 'q' || str[0] == 'Q') | |
81 | break; | |
82 | ||
83 | std::vector<double> v; | |
84 | if (client::parse_numbers(str.begin(), str.end(), v)) | |
85 | { | |
86 | std::cout << "-------------------------\n"; | |
87 | std::cout << "Parsing succeeded\n"; | |
88 | std::cout << str << " Parses OK: " << std::endl; | |
89 | ||
90 | for (std::vector<double>::size_type i = 0; i < v.size(); ++i) | |
91 | std::cout << i << ": " << v[i] << std::endl; | |
92 | ||
93 | std::cout << "\n-------------------------\n"; | |
94 | } | |
95 | else | |
96 | { | |
97 | std::cout << "-------------------------\n"; | |
98 | std::cout << "Parsing failed\n"; | |
99 | std::cout << "-------------------------\n"; | |
100 | } | |
101 | } | |
102 | ||
103 | std::cout << "Bye... :-) \n\n"; | |
104 | return 0; | |
105 | } | |
106 | ||
107 |