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); }
int operator()(ScannerT const& scan, result_t& result) const { if (scan.at_end()) { return -1; } filePos = scan.first->filePos; return 0; }
search_info find(ScannerT const& scan) const { search_info result = { 0, 0 }; if (scan.at_end()) { return result; } typedef typename ScannerT::iterator_t iterator_t; node_ptr np = root; CharT ch = *scan; iterator_t latest = scan.first; std::size_t length = 0; while (np) { if (ch < np->value) // => go left! { np = np->left; } else if (ch == np->value) // => go middle! { ++scan; ++length; // Found a potential match. if (np->data.get()) { result.data = np->data.get(); result.length = length; latest = scan.first; } if (scan.at_end()) break; ch = *scan; np = np->middle; } else // (ch > np->value) => go right! { np = np->right; } } scan.first = latest; return result; }
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(); }
int operator()(ScannerT const& scan, result_t& /*result*/) const { if (scan.at_end()) { if (eol_msg) { file_position fpos = scan.first.get_position(); cerr << fpos << eol_msg << endl; } } else { if (msg) { file_position fpos = scan.first.get_position(); cerr << fpos << msg << endl; } } return -1; // Fail. }
bool at_end(ScannerT const& scan) const { scan.skip(scan); return BaseT::at_end(scan); }
void advance(ScannerT const& scan) const { BaseT::advance(scan); scan.skip(scan); }
typename boost::spirit::classic::parser_result<this_t, ScannerT>::type parse(ScannerT const& scan) const { scan.first.clear_queue(); return scan.empty_match(); }
typename cl::parser_result<quickbook_range, ScannerT>::type parse(ScannerT const& scan) const { return in_range() ? scan.empty_match() : scan.no_match(); }