6bea365c51
[SVN r58589]
71 lines
2.0 KiB
C++
71 lines
2.0 KiB
C++
// 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;
|
|
}
|
|
|