| /////////////////////////////////////////////////////////////////////////////// |
| // flow_control.hpp |
| // |
| // Copyright 2008 Eric Niebler. Distributed under the Boost |
| // Software License, Version 1.0. (See accompanying file |
| // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| #ifndef BOOST_XPRESSIVE_DETAIL_CORE_FLOW_CONTROL_HPP_EAN_10_04_2005 |
| #define BOOST_XPRESSIVE_DETAIL_CORE_FLOW_CONTROL_HPP_EAN_10_04_2005 |
| |
| // MS compatible compilers support #pragma once |
| #if defined(_MSC_VER) && (_MSC_VER >= 1020) |
| # pragma once |
| #endif |
| |
| #include <boost/xpressive/detail/detail_fwd.hpp> |
| #include <boost/xpressive/detail/core/regex_impl.hpp> |
| #include <boost/xpressive/detail/core/state.hpp> |
| #include <boost/xpressive/detail/utility/ignore_unused.hpp> |
| |
| namespace boost { namespace xpressive { namespace detail |
| { |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // push_context_match |
| // |
| template<typename BidiIter> |
| inline bool push_context_match |
| ( |
| regex_impl<BidiIter> const &impl |
| , match_state<BidiIter> &state |
| , matchable<BidiIter> const &next |
| ) |
| { |
| // avoid infinite recursion |
| // BUGBUG this only catches direct infinite recursion, like sregex::compile("(?R)"), but |
| // not indirect infinite recursion where two rules invoke each other recursively. |
| if(state.is_active_regex(impl) && state.cur_ == state.sub_match(0).begin_) |
| { |
| return next.match(state); |
| } |
| |
| // save state |
| match_context<BidiIter> context = state.push_context(impl, next, context); |
| detail::ignore_unused(context); |
| |
| // match the nested regex and uninitialize the match context |
| // (reclaims the sub_match objects if necessary) |
| return state.pop_context(impl, impl.xpr_->match(state)); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // pop_context_match |
| // |
| template<typename BidiIter> |
| inline bool pop_context_match(match_state<BidiIter> &state) |
| { |
| // save state |
| // BUGBUG nested regex could have changed state.traits_ |
| match_context<BidiIter> &context(*state.context_.prev_context_); |
| state.swap_context(context); |
| |
| // Finished matching the nested regex; now match the rest of the enclosing regex |
| bool success = context.next_ptr_->match(state); |
| |
| // restore state |
| state.swap_context(context); |
| return success; |
| } |
| |
| }}} // namespace boost::xpressive::detail |
| |
| #endif |
| |