1 // Copyright (c) 2001-2010 Hartmut Kaiser 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 // The purpose of this example is to demonstrate how to utilize alternatives 7 // and the built in matching capabilities of Karma generators to emit output 8 // in different formats based on the content of an attribute (not its type). 9 10 #include <boost/config/warning_disable.hpp> 11 12 #include <string> 13 #include <vector> 14 15 #include <boost/spirit/include/karma.hpp> 16 #include <boost/spirit/include/phoenix_stl.hpp> 17 18 namespace client 19 { 20 namespace karma = boost::spirit::karma; 21 namespace phx = boost::phoenix; 22 23 template <typename OutputIterator> 24 struct quoted_strings 25 : karma::grammar<OutputIterator, std::vector<std::string>()> 26 { quoted_stringsclient::quoted_strings27 quoted_strings() 28 : quoted_strings::base_type(strings) 29 { 30 strings = (bareword | qstring) % ' '; 31 bareword = karma::repeat(phx::size(karma::_val)) 32 [ karma::alnum | karma::char_("-.,_$") ]; 33 qstring = '"' << karma::string << '"'; 34 } 35 36 karma::rule<OutputIterator, std::vector<std::string>()> strings; 37 karma::rule<OutputIterator, std::string()> bareword, qstring; 38 }; 39 } 40 main()41int main() 42 { 43 namespace karma = boost::spirit::karma; 44 45 typedef std::back_insert_iterator<std::string> sink_type; 46 47 std::string generated; 48 sink_type sink(generated); 49 50 std::vector<std::string> v; 51 v.push_back("foo"); 52 v.push_back("bar baz"); 53 v.push_back("hello"); 54 55 client::quoted_strings<sink_type> g; 56 if (!karma::generate(sink, g, v)) 57 { 58 std::cout << "-------------------------\n"; 59 std::cout << "Generating failed\n"; 60 std::cout << "-------------------------\n"; 61 } 62 else 63 { 64 std::cout << "-------------------------\n"; 65 std::cout << "Generated: " << generated << "\n"; 66 std::cout << "-------------------------\n"; 67 } 68 return 0; 69 } 70 71