#include #include #include #include using namespace boost::spirit; template class grammar : public qi::grammar { public: grammar(); ~grammar(); qi::rule tok; }; void parse(std::string const& str) { static grammar gram; std::string::const_iterator i = str.begin(); std::string::const_iterator const i_end = str.end(); std::string token; std::cerr << "Parsing: " << str << std::endl; try { qi::parse(i, i_end, gram, token); } catch (qi::expectation_failure& e) { std::cerr << "Oops: parse" << std::endl; return; } if (i != i_end) { std::cerr << "Oops: not all" << std::endl; return; } std::cerr << "Parsed: " << token << std::endl; std::cerr << "Length: " << token.size() << std::endl; if (token == "abc") { std::cerr << "Whee!" << std::endl; } } int main(int argc, char* argv[]) { std::cerr << BOOST_LIB_VERSION << std::endl; parse("asdf"); parse("a b c"); parse("a-b-c"); parse("a_b_c"); return 0; } template grammar ::grammar() : grammar::base_type(tok, "token") { using namespace boost::phoenix; tok %= +( qi::alnum | qi::lit('-') | qi::lit('_') ); } template grammar ::~grammar() { }