You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							229 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
	
	
							229 lines
						
					
					
						
							5.4 KiB
						
					
					
				| /*============================================================================= | |
|     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)
 | |
| 
 |