#include #include #include void test(std::string str){ namespace qi = boost::spirit::qi; using boost::spirit::qi::parse; using boost::spirit::qi::double_; using boost::spirit::qi::char_; using boost::spirit::qi::omit; using boost::spirit::qi::debug; using boost::spirit::qi::eoi; qi::rule startRule; qi::rule FixedValue; qi::rule BasicOperator; qi::rule Variable; startRule = *(BasicOperator | FixedValue | Variable) >> eoi; BasicOperator = char_('+'); FixedValue = double_; ///*works also*/ Variable = +char_("a-zA-Z_0-9")>> omit[(&BasicOperator| &char_(')')| &eoi)]; ///*works*/ Variable = &char_("a-zA-Z")>> *char_("a-zA-Z_0-9")>> omit[(&BasicOperator| &char_(')')| &eoi)]; /*loop*/ Variable = *char_("a-zA-Z_0-9")>> omit[(&BasicOperator| &char_(')')| &eoi)]; startRule.name("startRule"); BasicOperator.name("BasicOperator"); FixedValue.name("FixedValue"); Variable.name("Variable"); debug(startRule); debug(BasicOperator); debug(FixedValue); debug(Variable); std::string::iterator begin = str.begin(); bool r = parse(begin, str.end(), startRule); if (r && begin==str.end()) //Debug std::cout << "Parsing works" << std::endl; else //Debug std::cout << "Parsing fails" << std::endl; } int main(){ test ("1+Var"); }