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);
    }
Exemple #2
0
 int operator()(ScannerT const& scan, result_t& result) const {
     if (scan.at_end()) {
         return -1;
     }
     filePos = scan.first->filePos;
     return 0;
 }
Exemple #3
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.
      }
Exemple #7
0
 bool
 at_end(ScannerT const& scan) const
 {
     scan.skip(scan);
     return BaseT::at_end(scan);
 }
Exemple #8
0
 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();  
 }
Exemple #10
0
 typename cl::parser_result<quickbook_range, ScannerT>::type
 parse(ScannerT const& scan) const
 {
     return in_range() ? scan.empty_match() : scan.no_match();
 }