fork download
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. #include <boost/spirit/include/qi.hpp>
  7. #include <boost/spirit/include/karma.hpp>
  8.  
  9. namespace karma = boost::spirit::karma;
  10. namespace ascii = boost::spirit::ascii;
  11.  
  12. template <typename T, std::size_t offset, std::size_t id>
  13. struct member_info {
  14. typedef T type;
  15. };
  16.  
  17. template <typename T, typename Iterator>
  18. struct type_grammar : public karma::grammar<Iterator, T()> {
  19.  
  20. type_grammar() : type_grammar::base_type(start) {
  21. start = karma::little_word;
  22. }
  23. private:
  24. karma::rule<Iterator, T()> start;
  25. };
  26.  
  27. template <typename OutputIt, typename Sig, typename R1, typename R2>
  28. karma::rule<OutputIt, Sig> aggregate_grammars(R1& r1, R2& r2) {
  29. return (r1 << r2) || (r2 << r1);
  30. }
  31.  
  32. int main() {
  33. std::vector<int> stuff = {1, 2, 256, 12, 12};
  34. std::vector<char> testee;
  35. std::stringstream sstr;
  36. auto it = std::back_inserter(testee);
  37. type_grammar<int, decltype(it)> g1, g2, g3;
  38. auto g = aggregate_grammars<decltype(it), std::vector<int>&()>(g1, g2);
  39. g = aggregate_grammars<decltype(it), std::vector<int>&()>(g, g3);
  40. karma::rule<decltype(it), std::vector<int>&()> rule = *g;
  41. karma::generate(it, g, stuff);
  42. for (auto el : testee) {
  43. std::cout << static_cast<int>(el) << " ";
  44. }
  45. std::cout << "\nWeepee" << std::endl;
  46. }
Compilation error #stdin compilation error #stdout 0s 3484KB
stdin
Standard input is empty
compilation info
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
stdout
Standard output is empty