#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
namespace ascii = boost::spirit::ascii;
template <typename T, std::size_t offset, std::size_t id>
struct member_info {
typedef T type;
};
template <typename T, typename Iterator>
struct type_grammar : public karma::grammar<Iterator, T()> {
type_grammar() : type_grammar::base_type(start) {
start = karma::little_word;
}
private:
karma::rule<Iterator, T()> start;
};
template <typename OutputIt, typename Sig, typename R1, typename R2>
karma::rule<OutputIt, Sig> aggregate_grammars(R1& r1, R2& r2) {
return (r1 << r2) || (r2 << r1);
}
int main() {
std::vector<int> stuff = {1, 2, 256, 12, 12};
std::vector<char> testee;
std::stringstream sstr;
auto it = std::back_inserter(testee);
type_grammar<int, decltype(it)> g1, g2, g3;
auto g = aggregate_grammars<decltype(it), std::vector<int>&()>(g1, g2);
g = aggregate_grammars<decltype(it), std::vector<int>&()>(g, g3);
karma::rule<decltype(it), std::vector<int>&()> rule = *g;
karma::generate(it, g, stuff);
for (auto el : testee) {
std::cout << static_cast<int>(el) << " ";
}
std::cout << "\nWeepee" << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KCiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9xaS5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9rYXJtYS5ocHA+CgpuYW1lc3BhY2Uga2FybWEgPSBib29zdDo6c3Bpcml0OjprYXJtYTsKbmFtZXNwYWNlIGFzY2lpID0gYm9vc3Q6OnNwaXJpdDo6YXNjaWk7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3Qgb2Zmc2V0LCBzdGQ6OnNpemVfdCBpZD4Kc3RydWN0IG1lbWJlcl9pbmZvIHsKICAgIHR5cGVkZWYgVCB0eXBlOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEl0ZXJhdG9yPgpzdHJ1Y3QgdHlwZV9ncmFtbWFyIDogcHVibGljIGthcm1hOjpncmFtbWFyPEl0ZXJhdG9yLCBUKCk+IHsKICAgIAogICAgdHlwZV9ncmFtbWFyKCkgOiB0eXBlX2dyYW1tYXI6OmJhc2VfdHlwZShzdGFydCkgIHsKICAgICAgICBzdGFydCA9IGthcm1hOjpsaXR0bGVfd29yZDsKICAgIH0KcHJpdmF0ZToKICAgIGthcm1hOjpydWxlPEl0ZXJhdG9yLCBUKCk+IHN0YXJ0Owp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIE91dHB1dEl0LCB0eXBlbmFtZSBTaWcsIHR5cGVuYW1lIFIxLCB0eXBlbmFtZSBSMj4Ka2FybWE6OnJ1bGU8T3V0cHV0SXQsIFNpZz4gYWdncmVnYXRlX2dyYW1tYXJzKFIxJiByMSwgUjImIHIyKSB7CglyZXR1cm4gKHIxIDw8IHIyKSB8fCAocjIgPDwgcjEpOwp9CgppbnQgbWFpbigpIHsKICAgIHN0ZDo6dmVjdG9yPGludD4gc3R1ZmYgPSB7MSwgMiwgMjU2LCAxMiwgMTJ9OwogICAgc3RkOjp2ZWN0b3I8Y2hhcj4gdGVzdGVlOwogICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cjsKICAgIGF1dG8gaXQgPSBzdGQ6OmJhY2tfaW5zZXJ0ZXIodGVzdGVlKTsKICAgIHR5cGVfZ3JhbW1hcjxpbnQsIGRlY2x0eXBlKGl0KT4gZzEsIGcyLCBnMzsKICAgIGF1dG8gZyA9IGFnZ3JlZ2F0ZV9ncmFtbWFyczxkZWNsdHlwZShpdCksIHN0ZDo6dmVjdG9yPGludD4mKCk+KGcxLCBnMik7CiAgICBnID0gYWdncmVnYXRlX2dyYW1tYXJzPGRlY2x0eXBlKGl0KSwgc3RkOjp2ZWN0b3I8aW50PiYoKT4oZywgZzMpOwogICAga2FybWE6OnJ1bGU8ZGVjbHR5cGUoaXQpLCBzdGQ6OnZlY3RvcjxpbnQ+JigpPiBydWxlID0gKmc7CiAgICBrYXJtYTo6Z2VuZXJhdGUoaXQsIGcsIHN0dWZmKTsKICAgIGZvciAoYXV0byBlbCA6IHRlc3RlZSkgewogICAgICAgIHN0ZDo6Y291dCA8PCBzdGF0aWNfY2FzdDxpbnQ+KGVsKSA8PCAiICI7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgIlxuV2VlcGVlIiA8PCBzdGQ6OmVuZGw7Cn0=
In file included from /usr/include/boost/proto/traits.hpp:24:0,
from /usr/include/boost/proto/expr.hpp:27,
from /usr/include/boost/proto/core.hpp:17,
from /usr/include/boost/proto/proto.hpp:12,
from /usr/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /usr/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /usr/include/boost/spirit/home/qi/action/action.hpp:14,
from /usr/include/boost/spirit/home/qi/action.hpp:14,
from /usr/include/boost/spirit/home/qi.hpp:14,
from /usr/include/boost/spirit/include/qi.hpp:16,
from prog.cpp:6:
/usr/include/boost/spirit/home/karma/nonterminal/rule.hpp: In instantiation of 'static void boost::spirit::karma::rule<OutputIterator, T1, T2, T3, T4>::define(boost::spirit::karma::rule<OutputIterator, T1, T2, T3, T4>&, const Expr&, mpl_::false_) [with Auto = mpl_::bool_<false>; Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::logical_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<type_grammar<int, std::back_insert_iterator<std::vector<char> > >&, type_grammar<int, std::back_insert_iterator<std::vector<char> > >&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<type_grammar<int, std::back_insert_iterator<std::vector<char> > >&, type_grammar<int, std::back_insert_iterator<std::vector<char> > >&>, 2l>&>, 2l>; OutputIterator = std::back_insert_iterator<std::vector<char> >; T1 = std::vector<int>&(); T2 = boost::spirit::unused_type; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type; mpl_::false_ = mpl_::bool_<false>]':
/usr/include/boost/spirit/home/karma/nonterminal/rule.hpp:200:32: required from 'boost::spirit::karma::rule<OutputIterator, T1, T2, T3, T4>::rule(const Expr&, const string&) [with Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::logical_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<type_grammar<int, std::back_insert_iterator<std::vector<char> > >&, type_grammar<int, std::back_insert_iterator<std::vector<char> > >&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<type_grammar<int, std::back_insert_iterator<std::vector<char> > >&, type_grammar<int, std::back_insert_iterator<std::vector<char> > >&>, 2l>&>, 2l>; OutputIterator = std::back_insert_iterator<std::vector<char> >; T1 = std::vector<int>&(); T2 = boost::spirit::unused_type; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type; std::string = std::basic_string<char>]'
prog.cpp:29:32: required from 'boost::spirit::karma::rule<OutputIt, Sig> aggregate_grammars(R1&, R2&) [with OutputIt = std::back_insert_iterator<std::vector<char> >; Sig = std::vector<int>&(); R1 = type_grammar<int, std::back_insert_iterator<std::vector<char> > >; R2 = type_grammar<int, std::back_insert_iterator<std::vector<char> > >]'
prog.cpp:38:74: required from here
/usr/include/boost/spirit/home/karma/nonterminal/rule.hpp:185:13: error: static assertion failed: error_invalid_expression
BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
^
/usr/include/boost/spirit/home/karma/nonterminal/rule.hpp: In instantiation of 'static void boost::spirit::karma::rule<OutputIterator, T1, T2, T3, T4>::define(boost::spirit::karma::rule<OutputIterator, T1, T2, T3, T4>&, const Expr&, mpl_::false_) [with Auto = mpl_::bool_<false>; Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::logical_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::spirit::karma::rule<std::back_insert_iterator<std::vector<char> >, std::vector<int>&(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>&, type_grammar<int, std::back_insert_iterator<std::vector<char> > >&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<type_grammar<int, std::back_insert_iterator<std::vector<char> > >&, boost::spirit::karma::rule<std::back_insert_iterator<std::vector<char> >, std::vector<int>&(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>&>, 2l>&>, 2l>; OutputIterator = std::back_insert_iterator<std::vector<char> >; T1 = std::vector<int>&(); T2 = boost::spirit::unused_type; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type; mpl_::false_ = mpl_::bool_<false>]':
/usr/include/boost/spirit/home/karma/nonterminal/rule.hpp:200:32: required from 'boost::spirit::karma::rule<OutputIterator, T1, T2, T3, T4>::rule(const Expr&, const string&) [with Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::logical_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::spirit::karma::rule<std::back_insert_iterator<std::vector<char> >, std::vector<int>&(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>&, type_grammar<int, std::back_insert_iterator<std::vector<char> > >&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<type_grammar<int, std::back_insert_iterator<std::vector<char> > >&, boost::spirit::karma::rule<std::back_insert_iterator<std::vector<char> >, std::vector<int>&(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>&>, 2l>&>, 2l>; OutputIterator = std::back_insert_iterator<std::vector<char> >; T1 = std::vector<int>&(); T2 = boost::spirit::unused_type; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type; std::string = std::basic_string<char>]'
prog.cpp:29:32: required from 'boost::spirit::karma::rule<OutputIt, Sig> aggregate_grammars(R1&, R2&) [with OutputIt = std::back_insert_iterator<std::vector<char> >; Sig = std::vector<int>&(); R1 = boost::spirit::karma::rule<std::back_insert_iterator<std::vector<char> >, std::vector<int>&(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>; R2 = type_grammar<int, std::back_insert_iterator<std::vector<char> > >]'
prog.cpp:39:68: required from here
/usr/include/boost/spirit/home/karma/nonterminal/rule.hpp:185:13: error: static assertion failed: error_invalid_expression