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