#include #include #include using namespace boost::spirit; using namespace boost::spirit::ascii; template struct sub_grammar_skipper: qi::grammar { sub_grammar_skipper(): sub_grammar_skipper::base_type(start) { start = ( *((char_ - eol) - lit(':')) >> lit(':') >> *blank >> *(char_ - eol) >> eol ) ; } qi::rule start; }; template struct sub_grammar: qi::grammar> { sub_grammar(): sub_grammar::base_type(start) { string = ( *(char_ - eol) ) ; name %= ( lit("NAME:") >> *blank >> string >> eol ) ; start = ( name ) ; } qi::rule > string; qi::rule> name; qi::rule > start; }; template struct test_grammar: qi::grammar > { test_grammar(): test_grammar::base_type(start) { start = ( sg >> int_ ) ; } sub_grammar sg; qi::rule > start; }; int main() { std::string str("NAME: John\nBLAH: blah\n10"); typedef std::string::const_iterator iterator; iterator first = str.begin(); iterator last = str.end(); test_grammar tg; sub_grammar_skipper skipper; bool r = phrase_parse(first, last, tg, skipper); if(r && first == last) { std::cout << "Success!\n"; } else { std::cerr << "Failed to parse at: " << std::string(first, last) << std::endl; return 1; } return 0; }