blob: b104aa36d3fab25d175c650706767d9f14588633 [file] [log] [blame]
/*=============================================================================
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)