#include "boost/spirit/include/qi.hpp" #include #include namespace qi = boost::spirit::qi; void processTestResult( bool const success, std::string::const_iterator const begin, std::string::const_iterator const end ) { if ( success ) std::cout << "***SUCCESS***"; else std::cout << "!!!PARSE ERROR!!! at '" << std::string( begin, end ) << '\''; std::cout << '\n'; } template void testWithRule( std::string const & str, Expr const & expr ) { std::string::const_iterator begin = str.begin(); qi::rule rule( expr ); bool const result = qi::phrase_parse( begin, str.end(), rule, qi::space ) && ( begin == str.end() ); return processTestResult( result, begin, str.end() ); } template void testWithoutRule( std::string const & str, Expr const & expr ) { std::string::const_iterator begin = str.begin(); bool const result = qi::phrase_parse( begin, str.end(), expr, qi::space ) && ( begin == str.end() ); return processTestResult( result, begin, str.end() ); } template void test( std::string const & str, Expr const & expr ) { std::cout << "---------------------------------------------\n"; std::cout << "Parsing '" << str << "'.\n"; std::cout << "---------------------------------------------\n"; std::cout << "WITHOUT RULE..."; testWithoutRule( str, qi::raw[ expr ] ); std::cout << "WITH RULE..."; testWithRule ( str, qi::raw[ expr ] ); std::cout << "---------------------------------------------\n"; } int main() { test( "(my,little,test)" , qi::lit( '(' ) >> +qi::alnum % ',' >> ')' ); // Works test( "( my, little, test )", qi::lit( '(' ) >> +qi::alnum % ',' >> ')' ); // Fails w/rule test( "(my, little, test)" , qi::lit( '(' ) >> +qi::alnum % ',' >> ')' ); // Fails w/rule return 0; }