| /*============================================================================= |
| Copyright (c) 1998-2003 Joel de Guzman |
| Copyright (c) 2003 Vaclav Vesely |
| http://spirit.sourceforge.net/ |
| |
| 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) |
| =============================================================================*/ |
| #if !defined(BOOST_SPIRIT_DISTINCT_HPP) |
| #define BOOST_SPIRIT_DISTINCT_HPP |
| |
| #include <boost/spirit/home/classic/core/parser.hpp> |
| #include <boost/spirit/home/classic/core/primitives/primitives.hpp> |
| #include <boost/spirit/home/classic/core/composite/operators.hpp> |
| #include <boost/spirit/home/classic/core/composite/directives.hpp> |
| #include <boost/spirit/home/classic/core/composite/epsilon.hpp> |
| #include <boost/spirit/home/classic/core/non_terminal/rule.hpp> |
| #include <boost/spirit/home/classic/utility/chset.hpp> |
| |
| #include <boost/spirit/home/classic/utility/distinct_fwd.hpp> |
| |
| namespace boost { |
| namespace spirit { |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
| |
| //----------------------------------------------------------------------------- |
| // distinct_parser class |
| |
| template <typename CharT, typename TailT> |
| class distinct_parser |
| { |
| public: |
| typedef |
| contiguous< |
| sequence< |
| chseq<CharT const*>, |
| negated_empty_match_parser< |
| TailT |
| > |
| > |
| > |
| result_t; |
| |
| distinct_parser() |
| : tail(chset<CharT>()) |
| { |
| } |
| |
| explicit distinct_parser(parser<TailT> const & tail_) |
| : tail(tail_.derived()) |
| { |
| } |
| |
| explicit distinct_parser(CharT const* letters) |
| : tail(chset_p(letters)) |
| { |
| } |
| |
| result_t operator()(CharT const* str) const |
| { |
| return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)]; |
| } |
| |
| TailT tail; |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // distinct_directive class |
| |
| template <typename CharT, typename TailT> |
| class distinct_directive |
| { |
| public: |
| template<typename ParserT> |
| struct result { |
| typedef |
| contiguous< |
| sequence< |
| ParserT, |
| negated_empty_match_parser< |
| TailT |
| > |
| > |
| > |
| type; |
| }; |
| |
| distinct_directive() |
| : tail(chset<CharT>()) |
| { |
| } |
| |
| explicit distinct_directive(CharT const* letters) |
| : tail(chset_p(letters)) |
| { |
| } |
| |
| explicit distinct_directive(parser<TailT> const & tail_) |
| : tail(tail_.derived()) |
| { |
| } |
| |
| template<typename ParserT> |
| typename result<typename as_parser<ParserT>::type>::type |
| operator[](ParserT const &subject) const |
| { |
| return |
| lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)]; |
| } |
| |
| TailT tail; |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // dynamic_distinct_parser class |
| |
| template <typename ScannerT> |
| class dynamic_distinct_parser |
| { |
| public: |
| typedef typename ScannerT::value_t char_t; |
| |
| typedef |
| rule< |
| typename no_actions_scanner< |
| typename lexeme_scanner<ScannerT>::type |
| >::type |
| > |
| tail_t; |
| |
| typedef |
| contiguous< |
| sequence< |
| chseq<char_t const*>, |
| negated_empty_match_parser< |
| tail_t |
| > |
| > |
| > |
| result_t; |
| |
| dynamic_distinct_parser() |
| : tail(nothing_p) |
| { |
| } |
| |
| template<typename ParserT> |
| explicit dynamic_distinct_parser(parser<ParserT> const & tail_) |
| : tail(tail_.derived()) |
| { |
| } |
| |
| explicit dynamic_distinct_parser(char_t const* letters) |
| : tail(chset_p(letters)) |
| { |
| } |
| |
| result_t operator()(char_t const* str) const |
| { |
| return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)]; |
| } |
| |
| tail_t tail; |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // dynamic_distinct_directive class |
| |
| template <typename ScannerT> |
| class dynamic_distinct_directive |
| { |
| public: |
| typedef typename ScannerT::value_t char_t; |
| |
| typedef |
| rule< |
| typename no_actions_scanner< |
| typename lexeme_scanner<ScannerT>::type |
| >::type |
| > |
| tail_t; |
| |
| template<typename ParserT> |
| struct result { |
| typedef |
| contiguous< |
| sequence< |
| ParserT, |
| negated_empty_match_parser< |
| tail_t |
| > |
| > |
| > |
| type; |
| }; |
| |
| dynamic_distinct_directive() |
| : tail(nothing_p) |
| { |
| } |
| |
| template<typename ParserT> |
| explicit dynamic_distinct_directive(parser<ParserT> const & tail_) |
| : tail(tail_.derived()) |
| { |
| } |
| |
| explicit dynamic_distinct_directive(char_t const* letters) |
| : tail(chset_p(letters)) |
| { |
| } |
| |
| template<typename ParserT> |
| typename result<typename as_parser<ParserT>::type>::type |
| operator[](ParserT const &subject) const |
| { |
| return |
| lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)]; |
| } |
| |
| tail_t tail; |
| }; |
| |
| //----------------------------------------------------------------------------- |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
| } // namespace spirit |
| } // namespace boost |
| |
| #endif // !defined(BOOST_SPIRIT_DISTINCT_HPP) |