sl@0: /*============================================================================= sl@0: Copyright (c) 1998-2003 Joel de Guzman sl@0: Copyright (c) 2003 Vaclav Vesely sl@0: http://spirit.sourceforge.net/ sl@0: sl@0: Use, modification and distribution is subject to the Boost Software sl@0: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at sl@0: http://www.boost.org/LICENSE_1_0.txt) sl@0: =============================================================================*/ sl@0: #if !defined(BOOST_SPIRIT_DISTINCT_HPP) sl@0: #define BOOST_SPIRIT_DISTINCT_HPP sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include sl@0: sl@0: namespace boost { sl@0: namespace spirit { sl@0: //----------------------------------------------------------------------------- sl@0: // distinct_parser class sl@0: sl@0: template sl@0: class distinct_parser sl@0: { sl@0: public: sl@0: typedef sl@0: contiguous< sl@0: sequence< sl@0: chseq, sl@0: negated_empty_match_parser< sl@0: TailT sl@0: > sl@0: > sl@0: > sl@0: result_t; sl@0: sl@0: distinct_parser() sl@0: : tail(chset()) sl@0: { sl@0: } sl@0: sl@0: explicit distinct_parser(parser const & tail_) sl@0: : tail(tail_.derived()) sl@0: { sl@0: } sl@0: sl@0: explicit distinct_parser(CharT const* letters) sl@0: : tail(chset_p(letters)) sl@0: { sl@0: } sl@0: sl@0: result_t operator()(CharT const* str) const sl@0: { sl@0: return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)]; sl@0: } sl@0: sl@0: TailT tail; sl@0: }; sl@0: sl@0: //----------------------------------------------------------------------------- sl@0: // distinct_directive class sl@0: sl@0: template sl@0: class distinct_directive sl@0: { sl@0: public: sl@0: template sl@0: struct result { sl@0: typedef sl@0: contiguous< sl@0: sequence< sl@0: ParserT, sl@0: negated_empty_match_parser< sl@0: TailT sl@0: > sl@0: > sl@0: > sl@0: type; sl@0: }; sl@0: sl@0: distinct_directive() sl@0: : tail(chset()) sl@0: { sl@0: } sl@0: sl@0: explicit distinct_directive(CharT const* letters) sl@0: : tail(chset_p(letters)) sl@0: { sl@0: } sl@0: sl@0: explicit distinct_directive(parser const & tail_) sl@0: : tail(tail_.derived()) sl@0: { sl@0: } sl@0: sl@0: template sl@0: typename result::type>::type sl@0: operator[](ParserT const &subject) const sl@0: { sl@0: return sl@0: lexeme_d[as_parser::convert(subject) >> ~epsilon_p(tail)]; sl@0: } sl@0: sl@0: TailT tail; sl@0: }; sl@0: sl@0: //----------------------------------------------------------------------------- sl@0: // dynamic_distinct_parser class sl@0: sl@0: template sl@0: class dynamic_distinct_parser sl@0: { sl@0: public: sl@0: typedef typename ScannerT::value_t char_t; sl@0: sl@0: typedef sl@0: rule< sl@0: typename no_actions_scanner< sl@0: typename lexeme_scanner::type sl@0: >::type sl@0: > sl@0: tail_t; sl@0: sl@0: typedef sl@0: contiguous< sl@0: sequence< sl@0: chseq, sl@0: negated_empty_match_parser< sl@0: tail_t sl@0: > sl@0: > sl@0: > sl@0: result_t; sl@0: sl@0: dynamic_distinct_parser() sl@0: : tail(nothing_p) sl@0: { sl@0: } sl@0: sl@0: template sl@0: explicit dynamic_distinct_parser(parser const & tail_) sl@0: : tail(tail_.derived()) sl@0: { sl@0: } sl@0: sl@0: explicit dynamic_distinct_parser(char_t const* letters) sl@0: : tail(chset_p(letters)) sl@0: { sl@0: } sl@0: sl@0: result_t operator()(char_t const* str) const sl@0: { sl@0: return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)]; sl@0: } sl@0: sl@0: tail_t tail; sl@0: }; sl@0: sl@0: //----------------------------------------------------------------------------- sl@0: // dynamic_distinct_directive class sl@0: sl@0: template sl@0: class dynamic_distinct_directive sl@0: { sl@0: public: sl@0: typedef typename ScannerT::value_t char_t; sl@0: sl@0: typedef sl@0: rule< sl@0: typename no_actions_scanner< sl@0: typename lexeme_scanner::type sl@0: >::type sl@0: > sl@0: tail_t; sl@0: sl@0: template sl@0: struct result { sl@0: typedef sl@0: contiguous< sl@0: sequence< sl@0: ParserT, sl@0: negated_empty_match_parser< sl@0: tail_t sl@0: > sl@0: > sl@0: > sl@0: type; sl@0: }; sl@0: sl@0: dynamic_distinct_directive() sl@0: : tail(nothing_p) sl@0: { sl@0: } sl@0: sl@0: template sl@0: explicit dynamic_distinct_directive(parser const & tail_) sl@0: : tail(tail_.derived()) sl@0: { sl@0: } sl@0: sl@0: explicit dynamic_distinct_directive(char_t const* letters) sl@0: : tail(chset_p(letters)) sl@0: { sl@0: } sl@0: sl@0: template sl@0: typename result::type>::type sl@0: operator[](ParserT const &subject) const sl@0: { sl@0: return sl@0: lexeme_d[as_parser::convert(subject) >> ~epsilon_p(tail)]; sl@0: } sl@0: sl@0: tail_t tail; sl@0: }; sl@0: sl@0: //----------------------------------------------------------------------------- sl@0: } // namespace spirit sl@0: } // namespace boost sl@0: sl@0: #endif // !defined(BOOST_SPIRIT_DISTINCT_HPP)