perl_matcher_common.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 972 行 · 第 1/2 页

HPP
972
字号
         if((*m_presult)[i].matched)            ((*m_presult)[i]).get_captures().push_back((*m_presult)[i]);   }#endif   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary(){   bool b; // indcates whether next character is a word character   if(position != last)   {      // prev and this character must be opposites:   #if defined(BOOST_REGEX_USE_C_LOCALE) && defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ < 95)      b = traits::isctype(*position, m_word_mask);   #else      b = traits_inst.isctype(*position, m_word_mask);   #endif   }   else   {      b = (m_match_flags & match_not_eow) ? true : false;   }   if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))   {      if(m_match_flags & match_not_bow)         b ^= true;      else         b ^= false;   }   else   {      --position;      b ^= traits_inst.isctype(*position, m_word_mask);      ++position;   }   if(b)   {      pstate = pstate->next.p;      return true;   }   return false; // no match if we get to here...}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_within_word(){   if(position == last)      return false;   // both prev and this character must be m_word_mask:   bool prev = traits_inst.isctype(*position, m_word_mask);   {      bool b;      if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))          return false;      else      {         --position;         b = traits_inst.isctype(*position, m_word_mask);         ++position;      }      if(b == prev)      {         pstate = pstate->next.p;         return true;      }   }   return false;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_word_start(){   if(position == last)      return false; // can't be starting a word if we're already at the end of input   if(!traits_inst.isctype(*position, m_word_mask))      return false; // next character isn't a word character   if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))   {      if(m_match_flags & match_not_bow)         return false; // no previous input   }   else   {      // otherwise inside buffer:      BidiIterator t(position);      --t;      if(traits_inst.isctype(*t, m_word_mask))         return false; // previous character not non-word   }   // OK we have a match:   pstate = pstate->next.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_word_end(){   if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))      return false;  // start of buffer can't be end of word   BidiIterator t(position);   --t;   if(traits_inst.isctype(*t, m_word_mask) == false)      return false;  // previous character wasn't a word character   if(position == last)   {      if(m_match_flags & match_not_eow)         return false; // end of buffer but not end of word   }   else   {      // otherwise inside buffer:      if(traits_inst.isctype(*position, m_word_mask))         return false; // next character is a word character   }   pstate = pstate->next.p;   return true;      // if we fall through to here then we've succeeded}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start(){   if((position != backstop) || (m_match_flags & match_not_bob))      return false;   // OK match:   pstate = pstate->next.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end(){   if((position != last) || (m_match_flags & match_not_eob))      return false;   // OK match:   pstate = pstate->next.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_backref(){   //   // Compare with what we previously matched.   // Note that this succeeds if the backref did not partisipate   // in the match, this is in line with ECMAScript, but not Perl   // or PCRE.   //   BidiIterator i = (*m_presult)[static_cast<const re_brace*>(pstate)->index].first;   BidiIterator j = (*m_presult)[static_cast<const re_brace*>(pstate)->index].second;   while(i != j)   {      if((position == last) || (traits_inst.translate(*position, icase) != traits_inst.translate(*i, icase)))         return false;      ++i;      ++position;   }   pstate = pstate->next.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set(){   typedef typename traits::char_class_type char_class_type;   // let the traits class do the work:   if(position == last)      return false;   BidiIterator t = re_is_set_member(position, last, static_cast<const re_set_long<char_class_type>*>(pstate), re.get_data(), icase);   if(t != position)   {      pstate = pstate->next.p;      position = t;      return true;   }   return false;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_set(){   if(position == last)      return false;   if(static_cast<const re_set*>(pstate)->_map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])   {      pstate = pstate->next.p;      ++position;      return true;   }   return false;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_jump(){   pstate = static_cast<const re_jump*>(pstate)->alt.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_combining(){   if(position == last)      return false;   if(is_combining(traits_inst.translate(*position, icase)))      return false;   ++position;   while((position != last) && is_combining(traits_inst.translate(*position, icase)))      ++position;   pstate = pstate->next.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end(){   if(m_match_flags & match_not_eob)      return false;   BidiIterator p(position);   while((p != last) && is_separator(traits_inst.translate(*p, icase)))++p;   if(p != last)      return false;   pstate = pstate->next.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue(){   if(position == search_base)   {      pstate = pstate->next.p;      return true;   }   return false;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_backstep(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif   if( ::boost::is_random_access_iterator<BidiIterator>::value)   {      std::ptrdiff_t maxlen = ::boost::re_detail::distance(backstop, position);      if(maxlen < static_cast<const re_brace*>(pstate)->index)         return false;      std::advance(position, -static_cast<const re_brace*>(pstate)->index);   }   else   {      int c = static_cast<const re_brace*>(pstate)->index;      while(c--)      {         if(position == backstop)            return false;         --position;      }   }   pstate = pstate->next.p;   return true;#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>inline bool perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref(){   // return true if marked sub-expression N has been matched:   bool result = (*m_presult)[static_cast<const re_brace*>(pstate)->index].matched;   pstate = pstate->next.p;   return result;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case(){   // change our case sensitivity:   this->icase = static_cast<const re_case*>(pstate)->icase;   pstate = pstate->next.p;   return true;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_any(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif   const unsigned char* _map = re.get_map();   while(true)   {      // skip everything we can't match:      while((position != last) && !can_start(*position, _map, (unsigned char)mask_any) )         ++position;      if(position == last)      {         // run out of characters, try a null match if possible:         if(re.can_be_null())            return match_prefix();         break;      }      // now try and obtain a match:      if(match_prefix())         return true;      if(position == last)         return false;      ++position;   }   return false;#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_word(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif   // do search optimised for word starts:   const unsigned char* _map = re.get_map();   if((m_match_flags & match_prev_avail) || (position != base))      --position;   else if(match_prefix())      return true;   do   {      while((position != last) && traits_inst.isctype(*position, m_word_mask))         ++position;      while((position != last) && !traits_inst.isctype(*position, m_word_mask))         ++position;      if(position == last)         break;      if(can_start(*position, _map, (unsigned char)mask_any) )      {         if(match_prefix())            return true;      }      if(position == last)         break;   } while(true);   return false;#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_line(){   // do search optimised for line starts:   const unsigned char* _map = re.get_map();   if(match_prefix())      return true;   while(position != last)   {      while((position != last) && !is_separator(*position))         ++position;      if(position == last)         return false;      ++position;      if(position == last)      {         if(re.can_be_null() && match_prefix())            return true;         return false;      }      if( can_start(*position, _map, (unsigned char)mask_any) )      {         if(match_prefix())            return true;      }      if(position == last)         return false;      //++position;   }   return false;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_buf(){   if((position == base) && ((m_match_flags & match_not_bob) == 0))      return match_prefix();   return false;}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit(){#if 0   if(position == last)      return false; // can't possibly match if we're at the end already   unsigned type = (m_match_flags & match_continuous) ?       static_cast<unsigned int>(regbase::restart_continue)          : static_cast<unsigned int>(re.get_restart_type());   const kmp_info<char_type>* info = access::get_kmp(re);   int len = info->len;   const char_type* x = info->pstr;   int j = 0;    while (position != last)    {      while((j > -1) && (x[j] != traits_inst.translate(*position, icase)))          j = info->kmp_next[j];      ++position;      ++j;      if(j >= len)       {         if(type == regbase::restart_fixed_lit)         {            std::advance(position, -j);            restart = position;            std::advance(restart, len);            m_result.set_first(position);            m_result.set_second(restart);            position = restart;            return true;         }         else         {            restart = position;            std::advance(position, -j);            if(match_prefix())               return true;            else            {               for(int k = 0; (restart != position) && (k < j); ++k, --restart)                     {} // dwa 10/20/2000 - warning suppression for MWCW               if(restart != last)                  ++restart;               position = restart;               j = 0;  //we could do better than this...            }         }      }   }   if((m_match_flags & match_partial) && (position == last) && j)   {      // we need to check for a partial match:      restart = position;      std::advance(position, -j);      return match_prefix();   }#endif   return false;}} // namespace re_detail} // namespace boost#ifdef BOOST_MSVC#  pragma warning(pop)#endif#ifdef __BORLANDC__#  pragma option pop#endif#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable: 4103)#endif#ifdef BOOST_HAS_ABI_HEADERS#  include BOOST_ABI_SUFFIX#endif#ifdef BOOST_MSVC#pragma warning(pop)#endif#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?