typename parser_result<self_t, ScannerT>::type parse(ScannerT const &scan) const { typedef typename parser_result<self_t, ScannerT>::type result_t; typedef typename parser_result<parser_t, ScannerT>::type body_result_t; typename ScannerT::iterator_t save(scan.first); std::size_t length = 0; int eval_length = 0; this->init(); while ((eval_length = this->evaluate(scan))>=0) { length += eval_length; body_result_t tmp(this->subject().parse(scan)); if (tmp) { length+=tmp.length(); } else { return scan.no_match(); } this->step(); } boost::spirit::nil_t attr; return scan.create_match (length, attr, save, scan.first); }
typename ScannerT::match_t parse(ScannerT& scan) const { if(scan.at_end(scan)) { return scan.no_match(); } typename ScannerT::iter_t const tmp(scan.first); typedef typename ScannerT::match_t match_t; if(tester.test(*scan)) { scan.advance(); return scan.create_match(); } scan.first = tmp; return scan.no_match(); }