12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // 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;
- }
|