#include #include #include #include #include #include #include #include #include #include namespace spirit = boost::spirit; namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; namespace fusion = boost::fusion; namespace phoenix = boost::phoenix; class DLVresultParserDriver { public: DLVresultParserDriver(); void parse(std::istream& is); }; // "The Grammar" template struct DLVResultGrammar: public qi::grammar { DLVResultGrammar(): DLVResultGrammar::base_type(answersets) { using spirit::int_; using spirit::_val; using spirit::_1; using qi::lexeme; using qi::char_; using qi::omit; using qi::lit; answersets // end_p enforces a "full" match (in case of success) even with trailing newlines = *( (-lit("Best model:") >> answerset) | costline ) > (qi::eol | qi::eoi); } qi::rule answersets, answerset, costline; }; void DLVresultParserDriver::parse(std::istream& is) { std::ostringstream buf; buf << is.rdbuf(); const std::string& input = buf.str(); typedef std::string::const_iterator forward_iterator_type; // convert input iterator to forward iterator, usable by spirit parser forward_iterator_type fwd_begin = input.begin(); forward_iterator_type fwd_end = input.end(); DLVResultGrammar grammar; qi::phrase_parse(fwd_begin, fwd_end, grammar, ascii::space); } // Local Variables: // mode: C++ // End: