Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // grammar.hpp Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_XPRESSIVE_DETAIL_STATIC_GRAMMAR_HPP_EAN_11_12_2006 Chris@16: #define BOOST_XPRESSIVE_DETAIL_STATIC_GRAMMAR_HPP_EAN_11_12_2006 Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #define BOOST_XPRESSIVE_CHECK_REGEX(Expr, Char)\ Chris@16: BOOST_MPL_ASSERT\ Chris@16: ((\ Chris@16: typename boost::mpl::if_c<\ Chris@16: boost::xpressive::is_valid_regex::value\ Chris@16: , boost::mpl::true_\ Chris@16: , boost::xpressive::INVALID_REGULAR_EXPRESSION\ Chris@16: >::type\ Chris@16: )); Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: //**********************************************************************// Chris@16: //* << NOTE! >> *// Chris@16: //* *// Chris@16: //* Whenever you change this grammar, you MUST also make corresponding *// Chris@16: //* changes to width_of.hpp and is_pure.hpp. *// Chris@16: //* *// Chris@16: //**********************************************************************// Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: namespace boost { namespace xpressive Chris@16: { Chris@16: template Chris@16: struct Grammar; Chris@16: Chris@16: template Chris@16: struct ActionableGrammar; Chris@16: Chris@16: namespace grammar_detail Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // CharLiteral Chris@16: template Chris@16: struct CharLiteral; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // ListSet Chris@16: template Chris@16: struct ListSet; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // as_repeat Chris@16: template Chris@16: struct as_repeat Chris@16: : if_< Chris@16: make > Chris@16: , as_simple_quantifier Chris@16: , as_default_quantifier Chris@16: > Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // NonGreedyRepeatCases Chris@16: template Chris@16: struct NonGreedyRepeatCases Chris@16: { Chris@16: template Chris@16: struct case_ Chris@16: : not_<_> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : dereference Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : unary_plus Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : logical_not Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_, Dummy> Chris@16: : unary_expr, Gram> Chris@16: {}; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // InvertibleCases Chris@16: template Chris@16: struct InvertibleCases Chris@16: { Chris@16: template Chris@16: struct case_ Chris@16: : not_<_> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when, as_list_set_matcher > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when, as_list_set_matcher > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when, call(_right)> > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: unary_expr Chris@16: , as_lookahead Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: unary_expr Chris@16: , as_lookbehind Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: or_< Chris@16: CharLiteral Chris@16: , terminal Chris@16: , terminal > Chris@16: , terminal Chris@16: , terminal > > Chris@16: > Chris@16: , as_matcher Chris@16: > Chris@16: {}; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Cases Chris@16: template Chris@16: struct Cases Chris@16: { Chris@16: template Chris@16: struct case_ Chris@16: : not_<_> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: _ Chris@16: , in_sequence Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: shift_right Chris@16: , reverse_fold<_, _state, Gram> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: bitwise_or Chris@16: , in_sequence< Chris@16: as_alternate_matcher< Chris@16: reverse_fold_tree<_, make, in_alternate_list > Chris@16: > Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ , Dummy> Chris@16: : when< Chris@16: unary_expr, Gram> Chris@16: , in_sequence(_child)> > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: dereference Chris@16: , call)> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: unary_plus Chris@16: , call)> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: logical_not Chris@16: , call)> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_, Dummy> Chris@16: : when< Chris@16: unary_expr, Gram> Chris@16: , call)> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: negate > > Chris@16: , call(_child)>)> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: complement > > Chris@16: , in_sequence >(_child)>)> > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when, as_modifier > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: unary_expr Chris@16: , in_sequence > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: unary_expr Chris@16: , in_sequence > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when< Chris@16: unary_expr Chris@16: , in_sequence > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : when, in_sequence > > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : or_< Chris@16: when, call > Chris@16: , when, in_sequence > > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct case_ Chris@16: : or_< Chris@16: when, in_sequence(_right)> > > Chris@16: , when, _>, call(as_action)> > Chris@16: > Chris@16: {}; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // ActionableCases Chris@16: template Chris@16: struct ActionableCases Chris@16: { Chris@16: template Chris@16: struct case_ Chris@16: : Cases::template case_ Chris@16: {}; Chris@16: Chris@16: // Only in sub-expressions with actions attached do we allow attribute assignements Chris@16: template Chris@16: struct case_ Chris@16: : or_< Chris@16: typename Cases::template case_ Chris@16: , when >, _>, in_sequence > Chris@16: > Chris@16: {}; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Grammar Chris@16: template Chris@16: struct Grammar Chris@16: : proto::switch_ > > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct ActionableGrammar Chris@16: : proto::switch_ > > Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // INVALID_REGULAR_EXPRESSION Chris@16: struct INVALID_REGULAR_EXPRESSION Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // is_valid_regex Chris@16: template Chris@16: struct is_valid_regex Chris@16: : proto::matches > Chris@16: {}; Chris@16: Chris@16: }} // namespace boost::xpressive Chris@16: Chris@16: #endif