#include #include #include #include #include #include template Stream & operator << (Stream & s, std::monostate) { return s << "()"; } template Stream & operator << (Stream & s, psemek::parser::end_token) { return s << "(end)"; } template Stream & operator << (Stream & s, psemek::parser::ws_token) { return s << "(ws)"; } template Stream & operator << (Stream & s, psemek::parser::newline_token) { return s << "(newline)"; } template Stream & operator << (Stream & s, std::optional const & x) { if (x) return s << *x; return s << "(none)"; } template Stream & operator << (Stream & s, std::vector const & v) { s << '['; for (std::size_t i = 0; i < v.size(); ++i) { if (i > 0) s << ", "; s << v[i]; } return s << ']'; } template void print_tuple (Stream & s, T const & t, std::index_sequence) { ((s << (I == 0 ? "" : ", ") << std::get(t)), ...); } template Stream & operator << (Stream & s, std::tuple const & t) { s << '('; print_tuple(s, t, std::make_index_sequence{}); return s << ')'; } template Stream & operator << (Stream & s, std::variant const & v) { auto visitor = [&s](auto const & x){ s << x; }; std::visit(visitor, v); return s; } int main() { using namespace psemek::parser; auto const p = map(concat(integer, ws, one_of(ch('+'), ch('-')), ws, integer), [](auto const & t){ auto id = [](auto x){ return x; }; return std::make_tuple(std::get<0>(t), std::visit(id, std::get<2>(t)), std::get<4>(t)); }); std::cout << p.parse("45 + 67") << std::endl; }