Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
  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();
  }
Ejemplo n.º 3
0
  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();
  }
Ejemplo n.º 4
0
 typename cl::parser_result<quickbook_range, ScannerT>::type
 parse(ScannerT const& scan) const
 {
     return in_range() ? scan.empty_match() : scan.no_match();
 }