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(); }
typename ScannerT::match_t parse(ScannerT& scan) const { if(scan.at_end(scan)) { return scan.no_match(); } typename ScannerT::iter_t tmp(scan.first); typedef typename ScannerT::match_t match_t; if(match_t ma = this->left().parse(scan)) { if(match_t mb = this->right().parse(scan)) { scan.concat_match(ma, mb); return ma; } } scan.first = tmp; return scan.no_match(); }
typename cl::parser_result<quickbook_range, ScannerT>::type parse(ScannerT const& scan) const { return in_range() ? scan.empty_match() : scan.no_match(); }