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; }
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. }
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(); }