Hi all, someone can explain to me how to use, if it's possible, on_error error handler? I'd like to throw an exception reporting error data, because I'm using spirit in a Qt-based application, and my idea is to catch exception on upper level to pop-up a messagebox or something like that. I start from documentation example, here: on_error<fail> ( xml , std::cout << val("Error! Expecting ") << _4 // what failed? << val(" here: \"") << construct<std::string>(_3, _2) // iterators to error-pos, end << val("\"") << std::endl ); Trying several possible solution, no one compiles fine. I don't know, really, what I have to do, so please help me!! :-) Thanks in advance, Michele
2010/4/16 Michele Caini <michele.caini@gmail.com>
Hi all, someone can explain to me how to use, if it's possible, on_error error handler? I'd like to throw an exception reporting error data, because I'm using spirit in a Qt-based application, and my idea is to catch exception on upper level to pop-up a messagebox or something like that.
I start from documentation example, here:
on_error<fail> ( xml , std::cout << val("Error! Expecting ") << _4 // what failed? << val(" here: \"") << construct<std::string>(_3, _2) // iterators to error-pos, end << val("\"") << std::endl );
Trying several possible solution, no one compiles fine. I don't know, really, what I have to do, so please help me!! :-)
Thanks in advance, Michele
Hi, ok, solution found. Please, tell me if it's correct or there is a better one. Code is like this: template < typename It > struct crc_parser : boost::spirit::qi::grammar< It, ::client::circuit(), boost::spirit::qi::ascii::space_type > { typedef boost::spirit::qi::ascii::space_type space_type; crc_parser(std::ostream& err): crc_parser::base_type(circ, ".crc") { // [...] qi::on_error<qi::fail> (circ, err << val("Syntax error. Expecting ") << _4 << val(" here: \"") << construct<std::string>(_3, _2) << val("\"") << std::endl ); } // [...] boost::spirit::qi::rule<It, ::client::circuit(), space_type> circ; }; In main function, I have: std::stringstream ss; while(stream_.good()) ss << stream_.get(); std::string crc = ss.str(); std::string::const_iterator iter = crc.begin(); std::string::const_iterator end = crc.end(); ::client::circuit c; std::ostringstream oss; ::crc_parser<std::string::const_iterator> g(oss); bool r = boost::spirit::qi::phrase_parse(iter, end, g, boost::spirit::qi::ascii::space, c); if(!r || iter != end) { typedef boost::error_info<struct tag_what, std::string> what; sapecng::stream_read_error e; e << what(oss.str()); throw e; } etc. What about? It seems to work fine, that sounds good. Bye bye.
participants (1)
-
Michele Caini