perl_matcher_recursive.hpp

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

HPP
855
字号
         if(!match_wild())            return false;      }while(true);   }#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif   if(m_match_flags & match_not_dot_null)      return match_dot_repeat_slow();   if((static_cast<const re_dot*>(pstate->next.p)->mask & match_any_mask) == 0)      return match_dot_repeat_slow();   //   // start by working out how much we can skip:   //   const re_repeat* rep = static_cast<const re_repeat*>(pstate);#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4267)#endif   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);      std::size_t count = (std::min)(static_cast<std::size_t>(::boost::re_detail::distance(position, last)), static_cast<std::size_t>(greedy ? rep->max : rep->min));   if(rep->min > count)   {      position = last;      return false;  // not enough text left to match   }   std::advance(position, count);#ifdef BOOST_MSVC#pragma warning(pop)#endif   if((rep->leading) && (count < rep->max) && greedy)      restart = position;   if(greedy)      return backtrack_till_match(count - rep->min);   // non-greedy, keep trying till we get a match:   BidiIterator save_pos;   do   {      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))      {         ++position;         ++count;      }      if((rep->leading) && (rep->max == UINT_MAX))         restart = position;      pstate = rep->alt.p;      save_pos = position;      ++state_count;      if(match_all_states())         return true;      if(count >= rep->max)         return false;      if(save_pos == last)         return false;      position = ++save_pos;      ++count;   }while(true);#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#pragma warning(disable:4267)#endif#ifdef __BORLANDC__#pragma option push -w-8008 -w-8066 -w-8004#endif   const re_repeat* rep = static_cast<const re_repeat*>(pstate);   BOOST_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);   const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);   //   // start by working out how much we can skip:   //   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);      std::size_t count, desired;   if(::boost::is_random_access_iterator<BidiIterator>::value)   {      desired =          (std::min)(            (std::size_t)(greedy ? rep->max : rep->min),            (std::size_t)::boost::re_detail::distance(position, last));      count = desired;      ++desired;      if(icase)      {         while(--desired && (traits_inst.translate_nocase(*position) == what))         {            ++position;         }      }      else      {         while(--desired && (traits_inst.translate(*position) == what))         {            ++position;         }      }      count = count - desired;   }   else   {      count = 0;      desired = greedy ? rep->max : rep->min;      while((count < desired) && (position != last) && (traits_inst.translate(*position, icase) == what))      {         ++position;         ++count;      }   }   if((rep->leading) && (count < rep->max) && greedy)      restart = position;   if(count < rep->min)      return false;   if(greedy)      return backtrack_till_match(count - rep->min);   // non-greedy, keep trying till we get a match:   BidiIterator save_pos;   do   {      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))      {         if((traits_inst.translate(*position, icase) == what))         {            ++position;            ++count;         }         else            return false;  // counldn't repeat even though it was the only option      }      if((rep->leading) && (rep->max == UINT_MAX))         restart = position;      pstate = rep->alt.p;      save_pos = position;      ++state_count;      if(match_all_states())         return true;      if(count >= rep->max)         return false;      position = save_pos;      if(position == last)         return false;      if(traits_inst.translate(*position, icase) == what)      {         ++position;         ++count;      }      else      {         return false;      }   }while(true);#ifdef __BORLANDC__#pragma option pop#endif#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif#ifdef __BORLANDC__#pragma option push -w-8008 -w-8066 -w-8004#endif   const re_repeat* rep = static_cast<const re_repeat*>(pstate);   const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;   unsigned count = 0;   //   // start by working out how much we can skip:   //   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);      std::size_t desired = greedy ? rep->max : rep->min;   if(::boost::is_random_access_iterator<BidiIterator>::value)   {      BidiIterator end = position;      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));      BidiIterator origin(position);      while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])      {         ++position;      }      count = (unsigned)::boost::re_detail::distance(origin, position);   }   else   {      while((count < desired) && (position != last) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])      {         ++position;         ++count;      }   }   if((rep->leading) && (count < rep->max) && greedy)      restart = position;   if(count < rep->min)      return false;   if(greedy)      return backtrack_till_match(count - rep->min);   // non-greedy, keep trying till we get a match:   BidiIterator save_pos;   do   {      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))      {         if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])         {            ++position;            ++count;         }         else            return false;  // counldn't repeat even though it was the only option      }      if((rep->leading) && (rep->max == UINT_MAX))         restart = position;      pstate = rep->alt.p;      save_pos = position;      ++state_count;      if(match_all_states())         return true;      if(count >= rep->max)         return false;      position = save_pos;      if(position == last)         return false;      if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])      {         ++position;         ++count;      }      else      {         return false;      }   }while(true);#ifdef __BORLANDC__#pragma option pop#endif#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif#ifdef __BORLANDC__#pragma option push -w-8008 -w-8066 -w-8004#endif   typedef typename traits::char_class_type char_class_type;   const re_repeat* rep = static_cast<const re_repeat*>(pstate);   const re_set_long<char_class_type>* set = static_cast<const re_set_long<char_class_type>*>(pstate->next.p);   unsigned count = 0;   //   // start by working out how much we can skip:   //   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);      std::size_t desired = greedy ? rep->max : rep->min;   if(::boost::is_random_access_iterator<BidiIterator>::value)   {      BidiIterator end = position;      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));      BidiIterator origin(position);      while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))      {         ++position;      }      count = (unsigned)::boost::re_detail::distance(origin, position);   }   else   {      while((count < desired) && (position != last) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))      {         ++position;         ++count;      }   }   if((rep->leading) && (count < rep->max) && greedy)      restart = position;   if(count < rep->min)      return false;   if(greedy)      return backtrack_till_match(count - rep->min);   // non-greedy, keep trying till we get a match:   BidiIterator save_pos;   do   {      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))      {         if(position != re_is_set_member(position, last, set, re.get_data(), icase))         {            ++position;            ++count;         }         else            return false;  // counldn't repeat even though it was the only option      }      if((rep->leading) && (rep->max == UINT_MAX))         restart = position;      pstate = rep->alt.p;      save_pos = position;      ++state_count;      if(match_all_states())         return true;      if(count >= rep->max)         return false;      position = save_pos;      if(position == last)         return false;      if(position != re_is_set_member(position, last, set, re.get_data(), icase))      {         ++position;         ++count;      }      else      {         return false;      }   }while(true);#ifdef __BORLANDC__#pragma option pop#endif#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits>bool perl_matcher<BidiIterator, Allocator, traits>::backtrack_till_match(std::size_t count){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif   if((m_match_flags & match_partial) && (position == last))      m_has_partial_match = true;   const re_repeat* rep = static_cast<const re_repeat*>(pstate);   BidiIterator backtrack = position;   if(position == last)   {      if(rep->can_be_null & mask_skip)       {         pstate = rep->alt.p;         if(match_all_states())            return true;      }      if(count)      {         position = --backtrack;         --count;      }      else         return false;   }   do   {      while(count && !can_start(*position, rep->_map, mask_skip))      {         --position;         --count;         ++state_count;      }      pstate = rep->alt.p;      backtrack = position;      if(match_all_states())         return true;      if(count == 0)         return false;      position = --backtrack;      ++state_count;      --count;   }while(true);#ifdef BOOST_MSVC#pragma warning(pop)#endif}} // namespace re_detail} // namespace boost#ifdef BOOST_MSVC#pragma warning(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 + -
显示快捷键?