123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- ///////////////////////////////////////////////////////////////////////////////
- // grammar.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_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)
- # pragma once
- #endif
- #include <boost/mpl/if.hpp>
- #include <boost/mpl/bool.hpp>
- #include <boost/mpl/assert.hpp>
- #include <boost/proto/core.hpp>
- #include <boost/xpressive/detail/static/is_pure.hpp>
- #include <boost/xpressive/detail/static/transforms/as_matcher.hpp>
- #include <boost/xpressive/detail/static/transforms/as_alternate.hpp>
- #include <boost/xpressive/detail/static/transforms/as_sequence.hpp>
- #include <boost/xpressive/detail/static/transforms/as_quantifier.hpp>
- #include <boost/xpressive/detail/static/transforms/as_marker.hpp>
- #include <boost/xpressive/detail/static/transforms/as_set.hpp>
- #include <boost/xpressive/detail/static/transforms/as_independent.hpp>
- #include <boost/xpressive/detail/static/transforms/as_modifier.hpp>
- #include <boost/xpressive/detail/static/transforms/as_inverse.hpp>
- #include <boost/xpressive/detail/static/transforms/as_action.hpp>
- #include <boost/xpressive/detail/detail_fwd.hpp>
- #define BOOST_XPRESSIVE_CHECK_REGEX(Expr, Char)\
- BOOST_MPL_ASSERT\
- ((\
- typename boost::mpl::if_c<\
- boost::xpressive::is_valid_regex<Expr, Char>::value\
- , 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<typename Char>
- struct Grammar;
- template<typename Char>
- struct ActionableGrammar;
- namespace grammar_detail
- {
- ///////////////////////////////////////////////////////////////////////////
- // CharLiteral
- template<typename Char>
- struct CharLiteral;
- ///////////////////////////////////////////////////////////////////////////
- // ListSet
- template<typename Char>
- struct ListSet;
- ///////////////////////////////////////////////////////////////////////////
- // as_repeat
- template<typename Char, typename Gram, typename Greedy>
- struct as_repeat
- : if_<
- make<detail::use_simple_repeat<_child, Char> >
- , as_simple_quantifier<Gram, Greedy>
- , as_default_quantifier<Greedy>
- >
- {};
- ///////////////////////////////////////////////////////////////////////////
- // NonGreedyRepeatCases
- template<typename Gram>
- struct NonGreedyRepeatCases
- {
- template<typename Tag, typename Dummy = void>
- struct case_
- : not_<_>
- {};
- template<typename Dummy>
- struct case_<tag::dereference, Dummy>
- : dereference<Gram>
- {};
- template<typename Dummy>
- struct case_<tag::unary_plus, Dummy>
- : unary_plus<Gram>
- {};
- template<typename Dummy>
- struct case_<tag::logical_not, Dummy>
- : logical_not<Gram>
- {};
- template<uint_t Min, uint_t Max, typename Dummy>
- struct case_<detail::generic_quant_tag<Min, Max>, Dummy>
- : unary_expr<detail::generic_quant_tag<Min, Max>, Gram>
- {};
- };
- ///////////////////////////////////////////////////////////////////////////
- // InvertibleCases
- template<typename Char, typename Gram>
- struct InvertibleCases
- {
- template<typename Tag, typename Dummy = void>
- struct case_
- : not_<_>
- {};
- template<typename Dummy>
- struct case_<tag::comma, Dummy>
- : when<ListSet<Char>, as_list_set_matcher<Char> >
- {};
- template<typename Dummy>
- struct case_<tag::assign, Dummy>
- : when<ListSet<Char>, as_list_set_matcher<Char> >
- {};
- template<typename Dummy>
- struct case_<tag::subscript, Dummy>
- : when<subscript<detail::set_initializer_type, Gram>, call<as_set_matcher<Gram>(_right)> >
- {};
- template<typename Dummy>
- struct case_<detail::lookahead_tag, Dummy>
- : when<
- unary_expr<detail::lookahead_tag, Gram>
- , as_lookahead<Gram>
- >
- {};
- template<typename Dummy>
- struct case_<detail::lookbehind_tag, Dummy>
- : when<
- unary_expr<detail::lookbehind_tag, Gram>
- , as_lookbehind<Gram>
- >
- {};
- template<typename Dummy>
- struct case_<tag::terminal, Dummy>
- : when<
- or_<
- CharLiteral<Char>
- , terminal<detail::posix_charset_placeholder>
- , terminal<detail::range_placeholder<_> >
- , terminal<detail::logical_newline_placeholder>
- , terminal<detail::assert_word_placeholder<detail::word_boundary<mpl::true_> > >
- >
- , as_matcher
- >
- {};
- };
- ///////////////////////////////////////////////////////////////////////////
- // Cases
- template<typename Char, typename Gram>
- struct Cases
- {
- template<typename Tag, typename Dummy = void>
- struct case_
- : not_<_>
- {};
- template<typename Dummy>
- struct case_<tag::terminal, Dummy>
- : when<
- _
- , in_sequence<as_matcher>
- >
- {};
- template<typename Dummy>
- struct case_<tag::shift_right, Dummy>
- : when<
- shift_right<Gram, Gram>
- , reverse_fold<_, _state, Gram>
- >
- {};
- template<typename Dummy>
- struct case_<tag::bitwise_or, Dummy>
- : when<
- bitwise_or<Gram, Gram>
- , in_sequence<
- as_alternate_matcher<
- reverse_fold_tree<_, make<fusion::nil>, in_alternate_list<Gram> >
- >
- >
- >
- {};
- template<typename Dummy, typename Greedy>
- struct case_<optional_tag<Greedy> , Dummy>
- : when<
- unary_expr<optional_tag<Greedy>, Gram>
- , in_sequence<call<as_optional<Gram, Greedy>(_child)> >
- >
- {};
- template<typename Dummy>
- struct case_<tag::dereference, Dummy>
- : when<
- dereference<Gram>
- , call<Gram(as_repeat<Char, Gram, mpl::true_>)>
- >
- {};
- template<typename Dummy>
- struct case_<tag::unary_plus, Dummy>
- : when<
- unary_plus<Gram>
- , call<Gram(as_repeat<Char, Gram, mpl::true_>)>
- >
- {};
- template<typename Dummy>
- struct case_<tag::logical_not, Dummy>
- : when<
- logical_not<Gram>
- , call<Gram(as_repeat<Char, Gram, mpl::true_>)>
- >
- {};
- template<uint_t Min, uint_t Max, typename Dummy>
- struct case_<detail::generic_quant_tag<Min, Max>, Dummy>
- : when<
- unary_expr<detail::generic_quant_tag<Min, Max>, Gram>
- , call<Gram(as_repeat<Char, Gram, mpl::true_>)>
- >
- {};
- template<typename Dummy>
- struct case_<tag::negate, Dummy>
- : when<
- negate<switch_<NonGreedyRepeatCases<Gram> > >
- , call<Gram(call<as_repeat<Char, Gram, mpl::false_>(_child)>)>
- >
- {};
- template<typename Dummy>
- struct case_<tag::complement, Dummy>
- : when<
- complement<switch_<InvertibleCases<Char, Gram> > >
- , in_sequence<call<as_inverse(call<switch_<InvertibleCases<Char, Gram> >(_child)>)> >
- >
- {};
- template<typename Dummy>
- struct case_<detail::modifier_tag, Dummy>
- : when<binary_expr<detail::modifier_tag, _, Gram>, as_modifier<Gram> >
- {};
- template<typename Dummy>
- struct case_<detail::lookahead_tag, Dummy>
- : when<
- unary_expr<detail::lookahead_tag, Gram>
- , in_sequence<as_lookahead<Gram> >
- >
- {};
- template<typename Dummy>
- struct case_<detail::lookbehind_tag, Dummy>
- : when<
- unary_expr<detail::lookbehind_tag, Gram>
- , in_sequence<as_lookbehind<Gram> >
- >
- {};
- template<typename Dummy>
- struct case_<detail::keeper_tag, Dummy>
- : when<
- unary_expr<detail::keeper_tag, Gram>
- , in_sequence<as_keeper<Gram> >
- >
- {};
- template<typename Dummy>
- struct case_<tag::comma, Dummy>
- : when<ListSet<Char>, in_sequence<as_list_set_matcher<Char> > >
- {};
- template<typename Dummy>
- struct case_<tag::assign, Dummy>
- : or_<
- when<assign<detail::basic_mark_tag, Gram>, call<Gram(as_marker)> >
- , when<ListSet<Char>, in_sequence<as_list_set_matcher<Char> > >
- >
- {};
- template<typename Dummy>
- struct case_<tag::subscript, Dummy>
- : or_<
- when<subscript<detail::set_initializer_type, Gram>, in_sequence<call<as_set_matcher<Gram>(_right)> > >
- , when<subscript<ActionableGrammar<Char>, _>, call<ActionableGrammar<Char>(as_action)> >
- >
- {};
- };
- ///////////////////////////////////////////////////////////////////////////
- // ActionableCases
- template<typename Char, typename Gram>
- struct ActionableCases
- {
- template<typename Tag, typename Dummy = void>
- struct case_
- : Cases<Char, Gram>::template case_<Tag>
- {};
- // Only in sub-expressions with actions attached do we allow attribute assignements
- template<typename Dummy>
- struct case_<proto::tag::assign, Dummy>
- : or_<
- typename Cases<Char, Gram>::template case_<proto::tag::assign>
- , when<proto::assign<terminal<detail::attribute_placeholder<_> >, _>, in_sequence<as_attr_matcher> >
- >
- {};
- };
- } // namespace detail
- ///////////////////////////////////////////////////////////////////////////
- // Grammar
- template<typename Char>
- struct Grammar
- : proto::switch_<grammar_detail::Cases<Char, Grammar<Char> > >
- {};
- template<typename Char>
- struct ActionableGrammar
- : proto::switch_<grammar_detail::ActionableCases<Char, ActionableGrammar<Char> > >
- {};
- ///////////////////////////////////////////////////////////////////////////
- // INVALID_REGULAR_EXPRESSION
- struct INVALID_REGULAR_EXPRESSION
- : mpl::false_
- {};
- ///////////////////////////////////////////////////////////////////////////
- // is_valid_regex
- template<typename Expr, typename Char>
- struct is_valid_regex
- : proto::matches<Expr, Grammar<Char> >
- {};
- }} // namespace boost::xpressive
- #endif
|