1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <boost/fusion/include/adapt_struct.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> #include <vector> #include <string> #include <iomanip> #include <algorithm> namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; namespace phx = boost::phoenix; struct my_record { std::vector<int> m_ints; std::vector<std::string> m_strs; }; std::ostream& operator<<( std::ostream& os, const my_record& rec ) { for( const auto& x : rec.m_ints ) os << x << ' '; os << '\n'; for( const auto& x : rec.m_strs ) os << x << ' '; return os; } BOOST_FUSION_ADAPT_STRUCT( ::my_record, (std::vector<int>, m_ints) (std::vector<std::string>, m_strs) ) template<typename Iterator> struct my_grammar : qi::grammar<Iterator, my_record(), ascii::space_type> { my_grammar() : my_grammar::base_type(start) { quoted_string %= qi::lexeme['"' >> +(qi::char_ - '"') >> '"']; start = qi::lit("{") >> *( "INT:" >> qi::int_ [ phx::push_back( phx::at_c<0>( qi::_val ), qi::_1 ) ] % "," | "STR:" >> quoted_string [ phx::push_back( phx::bind( &my_record::m_strs, qi::_val ), qi::_1 ) ] % "," ) >> "}" ; } qi::rule<Iterator, std::string(), ascii::space_type> quoted_string; qi::rule<Iterator, my_record(), ascii::space_type> start; }; int main () { std::string input1 = "{ STR: \"Joe\" INT: 42, 24 STR: \"Smith\" ,\"John\" }"; auto first=input1.begin(), last=input1.end(); my_record mr; my_grammar<decltype(first)> g; bool r=qi::phrase_parse( first, last, g, ascii::space, mr ); std::cout << std::boolalpha << "Parsed: " << r << '\n' << mr << '\n'; return r; } |
I2luY2x1ZGUgPGJvb3N0L2Z1c2lvbi9pbmNsdWRlL2FkYXB0X3N0cnVjdC5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9xaS5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9waG9lbml4LmhwcD4KCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKbmFtZXNwYWNlIHFpICAgID0gYm9vc3Q6OnNwaXJpdDo6cWk7Cm5hbWVzcGFjZSBhc2NpaSA9IGJvb3N0OjpzcGlyaXQ6OmFzY2lpOwpuYW1lc3BhY2UgcGh4ICAgPSBib29zdDo6cGhvZW5peDsKCnN0cnVjdCBteV9yZWNvcmQgewogICAgc3RkOjp2ZWN0b3I8aW50PiAgICAgICAgICBtX2ludHM7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gIG1fc3RyczsKfTsKCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCggc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgbXlfcmVjb3JkJiByZWMgKSB7CiAgICBmb3IoIGNvbnN0IGF1dG8mIHggOiByZWMubV9pbnRzICkKICAgICAgICBvcyA8PCB4IDw8ICcgJzsKICAgIG9zIDw8ICdcbic7CgogICAgZm9yKCBjb25zdCBhdXRvJiB4IDogcmVjLm1fc3RycyApCiAgICAgICAgb3MgPDwgeCA8PCAnICc7CiAgICByZXR1cm4gb3M7Cn0KCkJPT1NUX0ZVU0lPTl9BREFQVF9TVFJVQ1QoCiAgICA6Om15X3JlY29yZCwKICAgIChzdGQ6OnZlY3RvcjxpbnQ+LCAgICAgICAgICBtX2ludHMpCiAgICAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+LCAgbV9zdHJzKQopCgp0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvcj4Kc3RydWN0IG15X2dyYW1tYXIKOiBxaTo6Z3JhbW1hcjxJdGVyYXRvciwgbXlfcmVjb3JkKCksIGFzY2lpOjpzcGFjZV90eXBlPiB7CgogICAgbXlfZ3JhbW1hcigpCiAgICA6IG15X2dyYW1tYXI6OmJhc2VfdHlwZShzdGFydCkgewoKICAgICAgICBxdW90ZWRfc3RyaW5nICU9IHFpOjpsZXhlbWVbJyInID4+ICsocWk6OmNoYXJfIC0gJyInKSA+PiAnIiddOwoKICAgICAgICBzdGFydCA9IHFpOjpsaXQoInsiKQogICAgICAgICAgICAgICAgPj4KICAgICAgICAgICAgICAgICooICJJTlQ6IiA+PiBxaTo6aW50XwogICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgcGh4OjpwdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHg6OmF0X2M8MD4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWk6Ol92YWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxaTo6XzEKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIF0gJSAiLCIKICAgICAgICAgICAgICAgICB8ICJTVFI6IiA+PiBxdW90ZWRfc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICBwaHg6OnB1c2hfYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeDo6YmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlfcmVjb3JkOjptX3N0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWk6Ol92YWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxaTo6XzEKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIF0gJSAiLCIKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICA+PgogICAgICAgICAgICAgICAgIn0iCiAgICAgICAgICAgICAgICA7CiAgICB9CiAgICBxaTo6cnVsZTxJdGVyYXRvciwgc3RkOjpzdHJpbmcoKSwgYXNjaWk6OnNwYWNlX3R5cGU+IHF1b3RlZF9zdHJpbmc7CiAgICBxaTo6cnVsZTxJdGVyYXRvciwgbXlfcmVjb3JkKCksICAgYXNjaWk6OnNwYWNlX3R5cGU+IHN0YXJ0Owp9OwoKaW50IG1haW4gKCkgewogICAgc3RkOjpzdHJpbmcgICAgICAgIGlucHV0MSA9ICJ7IFNUUjogXCJKb2VcIiBJTlQ6IDQyLCAyNCBTVFI6IFwiU21pdGhcIiAsXCJKb2huXCIgfSI7CiAgICBhdXRvIGZpcnN0PWlucHV0MS5iZWdpbigpLCBsYXN0PWlucHV0MS5lbmQoKTsKICAgIG15X3JlY29yZCBtcjsKICAgIG15X2dyYW1tYXI8ZGVjbHR5cGUoZmlyc3QpPiBnOwogICAgYm9vbCByPXFpOjpwaHJhc2VfcGFyc2UoCiAgICAgICAgZmlyc3QsCiAgICAgICAgbGFzdCwKICAgICAgICBnLAogICAgICAgIGFzY2lpOjpzcGFjZSwKICAgICAgICBtcgogICAgKTsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmJvb2xhbHBoYSA8PCAiUGFyc2VkOiAiIDw8IHIgPDwgJ1xuJyA8PCBtciA8PCAnXG4nOwogICAgcmV0dXJuIHI7Cn0=
prog.cpp:1:49: fatal error: boost/fusion/include/adapt_struct.hpp: No such file or directory compilation terminated.
-
result: Compilation error (maybe you wish to see an example for C++11)


