| // Copyright (c) 2001-2010 Hartmut Kaiser |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| // The purpose of this example is to demonstrate how to utilize alternatives |
| // and the built in matching capabilities of Karma generators to emit output |
| // in different formats based on the content of an attribute (not its type). |
| |
| #include <boost/config/warning_disable.hpp> |
| |
| #include <string> |
| #include <vector> |
| |
| #include <boost/spirit/include/karma.hpp> |
| #include <boost/spirit/include/phoenix_stl.hpp> |
| |
| namespace client |
| { |
| namespace karma = boost::spirit::karma; |
| namespace phx = boost::phoenix; |
| |
| template <typename OutputIterator> |
| struct quoted_strings |
| : karma::grammar<OutputIterator, std::vector<std::string>()> |
| { |
| quoted_strings() |
| : quoted_strings::base_type(strings) |
| { |
| strings = (bareword | qstring) % ' '; |
| bareword = karma::repeat(phx::size(karma::_val)) |
| [ karma::alnum | karma::char_("-.,_$") ]; |
| qstring = '"' << karma::string << '"'; |
| } |
| |
| karma::rule<OutputIterator, std::vector<std::string>()> strings; |
| karma::rule<OutputIterator, std::string()> bareword, qstring; |
| }; |
| } |
| |
| int main() |
| { |
| namespace karma = boost::spirit::karma; |
| |
| typedef std::back_insert_iterator<std::string> sink_type; |
| |
| std::string generated; |
| sink_type sink(generated); |
| |
| std::vector<std::string> v; |
| v.push_back("foo"); |
| v.push_back("bar baz"); |
| v.push_back("hello"); |
| |
| client::quoted_strings<sink_type> g; |
| if (!karma::generate(sink, g, v)) |
| { |
| std::cout << "-------------------------\n"; |
| std::cout << "Generating failed\n"; |
| std::cout << "-------------------------\n"; |
| } |
| else |
| { |
| std::cout << "-------------------------\n"; |
| std::cout << "Generated: " << generated << "\n"; |
| std::cout << "-------------------------\n"; |
| } |
| return 0; |
| } |
| |