/////////////////////////////////////////////////////////////////////////////// // grammar.hpp // // Copyright 2007 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_STATIC_GRAMMAR_HPP_EAN_11_12_2006 #define BOOST_XPRESSIVE_DETAIL_STATIC_GRAMMAR_HPP_EAN_11_12_2006 // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BOOST_XPRESSIVE_CHECK_REGEX(Expr, Char)\ BOOST_MPL_ASSERT\ ((\ typename boost::mpl::if_<\ boost::xpressive::is_valid_regex\ , boost::mpl::true_\ , boost::xpressive::INVALID_REGULAR_EXPRESSION\ >::type\ )); ////////////////////////////////////////////////////////////////////////// //**********************************************************************// //* << NOTE! >> *// //* *// //* Whenever you change this grammar, you MUST also make corresponding *// //* changes to width_of.hpp and is_pure.hpp. *// //* *// //**********************************************************************// ////////////////////////////////////////////////////////////////////////// namespace boost { namespace xpressive { template struct Grammar; template struct ActionableGrammar; namespace detail { /////////////////////////////////////////////////////////////////////////// // CharLiteral template struct CharLiteral; /////////////////////////////////////////////////////////////////////////// // ListSet template struct ListSet; /////////////////////////////////////////////////////////////////////////// // as_repeat template struct as_repeat : proto::if_< use_simple_repeat, Char> , as_simple_quantifier, Greedy> , as_default_quantifier, Greedy> > {}; /////////////////////////////////////////////////////////////////////////// // NonGreedyRepeatCases template struct NonGreedyRepeatCases { template struct case_ : proto::not_ {}; template struct case_ : as_repeat {}; template struct case_ : as_repeat {}; template struct case_ : as_repeat {}; template struct case_, Dummy> : as_repeat, false> {}; }; /////////////////////////////////////////////////////////////////////////// // InvertibleCases template struct InvertibleCases { template struct case_ : proto::not_ {}; template struct case_ : as_list_set > {}; template struct case_ : as_list_set > {}; template struct case_ : proto::transform::right > > {}; template struct case_ : proto::transform::arg > > {}; template struct case_ : proto::transform::arg > > {}; template struct case_ : proto::or_< as_matcher > , as_matcher > , as_matcher > > , as_matcher > , as_matcher > > > > {}; }; /////////////////////////////////////////////////////////////////////////// // Cases template struct Cases { template struct case_ : proto::not_ {}; template struct case_ : proto::transform::reverse_fold > {}; template struct case_ : in_sequence > > {}; template struct case_ : in_sequence > > {}; template struct case_ , Dummy> : in_sequence, as_optional > > > {}; template struct case_ : proto::transform::compose, Gram> {}; template struct case_ : proto::transform::compose, Gram> {}; template struct case_ : proto::transform::compose, Gram> {}; template struct case_ , Dummy> : proto::transform::compose, true>, Gram> {}; template struct case_ : proto::transform::compose< proto::transform::arg > > > , Gram > {}; template struct case_ : in_sequence > > > > > {}; template struct case_ : as_modifier > {}; template struct case_ : in_sequence > > > {}; template struct case_ : in_sequence > > > {}; template struct case_ : in_sequence > > > {}; template struct case_ : in_sequence > > {}; template struct case_ : proto::or_< proto::transform::compose >, Gram> , in_sequence > > > {}; template struct case_ : proto::or_< in_sequence > > > , proto::transform::compose, proto::_> >, ActionableGrammar > > {}; }; /////////////////////////////////////////////////////////////////////////// // ActionableCases template struct ActionableCases { template struct case_ : Cases::template case_ {}; // Only in sub-expressions with actions attached do we allow attribute assignements template struct case_ : proto::or_< typename Cases::template case_ , in_sequence >, proto::_> > > > {}; }; } // namespace detail /////////////////////////////////////////////////////////////////////////// // Grammar template struct Grammar : proto::switch_ > > {}; template struct ActionableGrammar : proto::switch_ > > {}; /////////////////////////////////////////////////////////////////////////// // INVALID_REGULAR_EXPRESSION struct INVALID_REGULAR_EXPRESSION : mpl::false_ {}; /////////////////////////////////////////////////////////////////////////// // is_valid_regex template struct is_valid_regex : proto::matches > {}; }} // namespace boost::xpressive #endif