608 lines
20 KiB
Plaintext
608 lines
20 KiB
Plaintext
|
/*=============================================================================
|
||
|
Copyright (c) 1998-2003 Joel de Guzman
|
||
|
Copyright (c) 2001 Daniel Nuffer
|
||
|
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_DIRECTIVES_HPP)
|
||
|
#define BOOST_SPIRIT_DIRECTIVES_HPP
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
#include <algorithm>
|
||
|
|
||
|
#include <boost/spirit/home/classic/namespace.hpp>
|
||
|
#include <boost/spirit/home/classic/core/parser.hpp>
|
||
|
#include <boost/spirit/home/classic/core/scanner/skipper.hpp>
|
||
|
#include <boost/spirit/home/classic/core/primitives/primitives.hpp>
|
||
|
#include <boost/spirit/home/classic/core/composite/composite.hpp>
|
||
|
#include <boost/spirit/home/classic/core/composite/impl/directives.ipp>
|
||
|
|
||
|
namespace boost { namespace spirit {
|
||
|
|
||
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// contiguous class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
struct lexeme_parser_gen;
|
||
|
|
||
|
template <typename ParserT>
|
||
|
struct contiguous
|
||
|
: public unary<ParserT, parser<contiguous<ParserT> > >
|
||
|
{
|
||
|
typedef contiguous<ParserT> self_t;
|
||
|
typedef unary_parser_category parser_category_t;
|
||
|
typedef lexeme_parser_gen parser_generator_t;
|
||
|
typedef unary<ParserT, parser<self_t> > base_t;
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
struct result
|
||
|
{
|
||
|
typedef typename parser_result<ParserT, ScannerT>::type type;
|
||
|
};
|
||
|
|
||
|
contiguous(ParserT const& p)
|
||
|
: base_t(p) {}
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
typename parser_result<self_t, ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename parser_result<self_t, ScannerT>::type result_t;
|
||
|
return impl::contiguous_parser_parse<result_t>
|
||
|
(this->subject(), scan, scan);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct lexeme_parser_gen
|
||
|
{
|
||
|
template <typename ParserT>
|
||
|
struct result {
|
||
|
|
||
|
typedef contiguous<ParserT> type;
|
||
|
};
|
||
|
|
||
|
template <typename ParserT>
|
||
|
static contiguous<ParserT>
|
||
|
generate(parser<ParserT> const& subject)
|
||
|
{
|
||
|
return contiguous<ParserT>(subject.derived());
|
||
|
}
|
||
|
|
||
|
template <typename ParserT>
|
||
|
contiguous<ParserT>
|
||
|
operator[](parser<ParserT> const& subject) const
|
||
|
{
|
||
|
return contiguous<ParserT>(subject.derived());
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//////////////////////////////////
|
||
|
const lexeme_parser_gen lexeme_d = lexeme_parser_gen();
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// lexeme_scanner
|
||
|
//
|
||
|
// Given a Scanner, return the correct scanner type that
|
||
|
// the lexeme_d uses. Scanner is assumed to be a phrase
|
||
|
// level scanner (see skipper.hpp)
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
template <typename ScannerT>
|
||
|
struct lexeme_scanner
|
||
|
{
|
||
|
typedef scanner_policies<
|
||
|
no_skipper_iteration_policy<
|
||
|
typename ScannerT::iteration_policy_t>,
|
||
|
typename ScannerT::match_policy_t,
|
||
|
typename ScannerT::action_policy_t
|
||
|
> policies_t;
|
||
|
|
||
|
typedef typename
|
||
|
rebind_scanner_policies<ScannerT, policies_t>::type type;
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// inhibit_case_iteration_policy class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
template <typename BaseT>
|
||
|
struct inhibit_case_iteration_policy : public BaseT
|
||
|
{
|
||
|
typedef BaseT base_t;
|
||
|
|
||
|
inhibit_case_iteration_policy()
|
||
|
: BaseT() {}
|
||
|
|
||
|
template <typename PolicyT>
|
||
|
inhibit_case_iteration_policy(PolicyT const& other)
|
||
|
: BaseT(other) {}
|
||
|
|
||
|
template <typename CharT>
|
||
|
CharT filter(CharT ch) const
|
||
|
{ return impl::tolower_(ch); }
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// inhibit_case class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
struct inhibit_case_parser_gen;
|
||
|
|
||
|
template <typename ParserT>
|
||
|
struct inhibit_case
|
||
|
: public unary<ParserT, parser<inhibit_case<ParserT> > >
|
||
|
{
|
||
|
typedef inhibit_case<ParserT> self_t;
|
||
|
typedef unary_parser_category parser_category_t;
|
||
|
typedef inhibit_case_parser_gen parser_generator_t;
|
||
|
typedef unary<ParserT, parser<self_t> > base_t;
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
struct result
|
||
|
{
|
||
|
typedef typename parser_result<ParserT, ScannerT>::type type;
|
||
|
};
|
||
|
|
||
|
inhibit_case(ParserT const& p)
|
||
|
: base_t(p) {}
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
typename parser_result<self_t, ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename parser_result<self_t, ScannerT>::type result_t;
|
||
|
return impl::inhibit_case_parser_parse<result_t>
|
||
|
(this->subject(), scan, scan);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
template <int N>
|
||
|
struct inhibit_case_parser_gen_base
|
||
|
{
|
||
|
// This hack is needed to make borland happy.
|
||
|
// If these member operators were defined in the
|
||
|
// inhibit_case_parser_gen class, or if this class
|
||
|
// is non-templated, borland ICEs.
|
||
|
|
||
|
static inhibit_case<strlit<char const*> >
|
||
|
generate(char const* str)
|
||
|
{ return inhibit_case<strlit<char const*> >(str); }
|
||
|
|
||
|
static inhibit_case<strlit<wchar_t const*> >
|
||
|
generate(wchar_t const* str)
|
||
|
{ return inhibit_case<strlit<wchar_t const*> >(str); }
|
||
|
|
||
|
static inhibit_case<chlit<char> >
|
||
|
generate(char ch)
|
||
|
{ return inhibit_case<chlit<char> >(ch); }
|
||
|
|
||
|
static inhibit_case<chlit<wchar_t> >
|
||
|
generate(wchar_t ch)
|
||
|
{ return inhibit_case<chlit<wchar_t> >(ch); }
|
||
|
|
||
|
template <typename ParserT>
|
||
|
static inhibit_case<ParserT>
|
||
|
generate(parser<ParserT> const& subject)
|
||
|
{ return inhibit_case<ParserT>(subject.derived()); }
|
||
|
|
||
|
inhibit_case<strlit<char const*> >
|
||
|
operator[](char const* str) const
|
||
|
{ return inhibit_case<strlit<char const*> >(str); }
|
||
|
|
||
|
inhibit_case<strlit<wchar_t const*> >
|
||
|
operator[](wchar_t const* str) const
|
||
|
{ return inhibit_case<strlit<wchar_t const*> >(str); }
|
||
|
|
||
|
inhibit_case<chlit<char> >
|
||
|
operator[](char ch) const
|
||
|
{ return inhibit_case<chlit<char> >(ch); }
|
||
|
|
||
|
inhibit_case<chlit<wchar_t> >
|
||
|
operator[](wchar_t ch) const
|
||
|
{ return inhibit_case<chlit<wchar_t> >(ch); }
|
||
|
|
||
|
template <typename ParserT>
|
||
|
inhibit_case<ParserT>
|
||
|
operator[](parser<ParserT> const& subject) const
|
||
|
{ return inhibit_case<ParserT>(subject.derived()); }
|
||
|
};
|
||
|
|
||
|
//////////////////////////////////
|
||
|
struct inhibit_case_parser_gen : public inhibit_case_parser_gen_base<0>
|
||
|
{
|
||
|
inhibit_case_parser_gen() {}
|
||
|
};
|
||
|
|
||
|
//////////////////////////////////
|
||
|
// Depracated
|
||
|
const inhibit_case_parser_gen nocase_d = inhibit_case_parser_gen();
|
||
|
|
||
|
// Preferred syntax
|
||
|
const inhibit_case_parser_gen as_lower_d = inhibit_case_parser_gen();
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// as_lower_scanner
|
||
|
//
|
||
|
// Given a Scanner, return the correct scanner type that
|
||
|
// the as_lower_d uses. Scanner is assumed to be a scanner
|
||
|
// with an inhibit_case_iteration_policy.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
template <typename ScannerT>
|
||
|
struct as_lower_scanner
|
||
|
{
|
||
|
typedef scanner_policies<
|
||
|
inhibit_case_iteration_policy<
|
||
|
typename ScannerT::iteration_policy_t>,
|
||
|
typename ScannerT::match_policy_t,
|
||
|
typename ScannerT::action_policy_t
|
||
|
> policies_t;
|
||
|
|
||
|
typedef typename
|
||
|
rebind_scanner_policies<ScannerT, policies_t>::type type;
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// longest_alternative class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
struct longest_parser_gen;
|
||
|
|
||
|
template <typename A, typename B>
|
||
|
struct longest_alternative
|
||
|
: public binary<A, B, parser<longest_alternative<A, B> > >
|
||
|
{
|
||
|
typedef longest_alternative<A, B> self_t;
|
||
|
typedef binary_parser_category parser_category_t;
|
||
|
typedef longest_parser_gen parser_generator_t;
|
||
|
typedef binary<A, B, parser<self_t> > base_t;
|
||
|
|
||
|
longest_alternative(A const& a, B const& b)
|
||
|
: base_t(a, b) {}
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
typename parser_result<self_t, ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename parser_result<self_t, ScannerT>::type result_t;
|
||
|
typename ScannerT::iterator_t save = scan.first;
|
||
|
result_t l = this->left().parse(scan);
|
||
|
std::swap(scan.first, save);
|
||
|
result_t r = this->right().parse(scan);
|
||
|
|
||
|
if (l || r)
|
||
|
{
|
||
|
if (l.length() > r.length())
|
||
|
{
|
||
|
scan.first = save;
|
||
|
return l;
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
return scan.no_match();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct longest_parser_gen
|
||
|
{
|
||
|
template <typename A, typename B>
|
||
|
struct result {
|
||
|
|
||
|
typedef typename
|
||
|
impl::to_longest_alternative<alternative<A, B> >::result_t
|
||
|
type;
|
||
|
};
|
||
|
|
||
|
template <typename A, typename B>
|
||
|
static typename
|
||
|
impl::to_longest_alternative<alternative<A, B> >::result_t
|
||
|
generate(alternative<A, B> const& alt)
|
||
|
{
|
||
|
return impl::to_longest_alternative<alternative<A, B> >::
|
||
|
convert(alt);
|
||
|
}
|
||
|
|
||
|
//'generate' for binary composite
|
||
|
template <typename A, typename B>
|
||
|
static
|
||
|
longest_alternative<A, B>
|
||
|
generate(A const &left, B const &right)
|
||
|
{
|
||
|
return longest_alternative<A, B>(left, right);
|
||
|
}
|
||
|
|
||
|
template <typename A, typename B>
|
||
|
typename impl::to_longest_alternative<alternative<A, B> >::result_t
|
||
|
operator[](alternative<A, B> const& alt) const
|
||
|
{
|
||
|
return impl::to_longest_alternative<alternative<A, B> >::
|
||
|
convert(alt);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const longest_parser_gen longest_d = longest_parser_gen();
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// shortest_alternative class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
struct shortest_parser_gen;
|
||
|
|
||
|
template <typename A, typename B>
|
||
|
struct shortest_alternative
|
||
|
: public binary<A, B, parser<shortest_alternative<A, B> > >
|
||
|
{
|
||
|
typedef shortest_alternative<A, B> self_t;
|
||
|
typedef binary_parser_category parser_category_t;
|
||
|
typedef shortest_parser_gen parser_generator_t;
|
||
|
typedef binary<A, B, parser<self_t> > base_t;
|
||
|
|
||
|
shortest_alternative(A const& a, B const& b)
|
||
|
: base_t(a, b) {}
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
typename parser_result<self_t, ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename parser_result<self_t, ScannerT>::type result_t;
|
||
|
typename ScannerT::iterator_t save = scan.first;
|
||
|
result_t l = this->left().parse(scan);
|
||
|
std::swap(scan.first, save);
|
||
|
result_t r = this->right().parse(scan);
|
||
|
|
||
|
if (l || r)
|
||
|
{
|
||
|
if ((l.length() < r.length() && l) || !r)
|
||
|
{
|
||
|
scan.first = save;
|
||
|
return l;
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
return scan.no_match();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct shortest_parser_gen
|
||
|
{
|
||
|
template <typename A, typename B>
|
||
|
struct result {
|
||
|
|
||
|
typedef typename
|
||
|
impl::to_shortest_alternative<alternative<A, B> >::result_t
|
||
|
type;
|
||
|
};
|
||
|
|
||
|
template <typename A, typename B>
|
||
|
static typename
|
||
|
impl::to_shortest_alternative<alternative<A, B> >::result_t
|
||
|
generate(alternative<A, B> const& alt)
|
||
|
{
|
||
|
return impl::to_shortest_alternative<alternative<A, B> >::
|
||
|
convert(alt);
|
||
|
}
|
||
|
|
||
|
//'generate' for binary composite
|
||
|
template <typename A, typename B>
|
||
|
static
|
||
|
shortest_alternative<A, B>
|
||
|
generate(A const &left, B const &right)
|
||
|
{
|
||
|
return shortest_alternative<A, B>(left, right);
|
||
|
}
|
||
|
|
||
|
template <typename A, typename B>
|
||
|
typename impl::to_shortest_alternative<alternative<A, B> >::result_t
|
||
|
operator[](alternative<A, B> const& alt) const
|
||
|
{
|
||
|
return impl::to_shortest_alternative<alternative<A, B> >::
|
||
|
convert(alt);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const shortest_parser_gen shortest_d = shortest_parser_gen();
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// min_bounded class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
template <typename BoundsT>
|
||
|
struct min_bounded_gen;
|
||
|
|
||
|
template <typename ParserT, typename BoundsT>
|
||
|
struct min_bounded
|
||
|
: public unary<ParserT, parser<min_bounded<ParserT, BoundsT> > >
|
||
|
{
|
||
|
typedef min_bounded<ParserT, BoundsT> self_t;
|
||
|
typedef unary_parser_category parser_category_t;
|
||
|
typedef min_bounded_gen<BoundsT> parser_generator_t;
|
||
|
typedef unary<ParserT, parser<self_t> > base_t;
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
struct result
|
||
|
{
|
||
|
typedef typename parser_result<ParserT, ScannerT>::type type;
|
||
|
};
|
||
|
|
||
|
min_bounded(ParserT const& p, BoundsT const& min__)
|
||
|
: base_t(p)
|
||
|
, min_(min__) {}
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
typename parser_result<self_t, ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename parser_result<self_t, ScannerT>::type result_t;
|
||
|
result_t hit = this->subject().parse(scan);
|
||
|
if (hit.has_valid_attribute() && hit.value() < min_)
|
||
|
return scan.no_match();
|
||
|
return hit;
|
||
|
}
|
||
|
|
||
|
BoundsT min_;
|
||
|
};
|
||
|
|
||
|
template <typename BoundsT>
|
||
|
struct min_bounded_gen
|
||
|
{
|
||
|
min_bounded_gen(BoundsT const& min__)
|
||
|
: min_(min__) {}
|
||
|
|
||
|
template <typename DerivedT>
|
||
|
min_bounded<DerivedT, BoundsT>
|
||
|
operator[](parser<DerivedT> const& p) const
|
||
|
{ return min_bounded<DerivedT, BoundsT>(p.derived(), min_); }
|
||
|
|
||
|
BoundsT min_;
|
||
|
};
|
||
|
|
||
|
template <typename BoundsT>
|
||
|
inline min_bounded_gen<BoundsT>
|
||
|
min_limit_d(BoundsT const& min_)
|
||
|
{ return min_bounded_gen<BoundsT>(min_); }
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// max_bounded class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
template <typename BoundsT>
|
||
|
struct max_bounded_gen;
|
||
|
|
||
|
template <typename ParserT, typename BoundsT>
|
||
|
struct max_bounded
|
||
|
: public unary<ParserT, parser<max_bounded<ParserT, BoundsT> > >
|
||
|
{
|
||
|
typedef max_bounded<ParserT, BoundsT> self_t;
|
||
|
typedef unary_parser_category parser_category_t;
|
||
|
typedef max_bounded_gen<BoundsT> parser_generator_t;
|
||
|
typedef unary<ParserT, parser<self_t> > base_t;
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
struct result
|
||
|
{
|
||
|
typedef typename parser_result<ParserT, ScannerT>::type type;
|
||
|
};
|
||
|
|
||
|
max_bounded(ParserT const& p, BoundsT const& max__)
|
||
|
: base_t(p)
|
||
|
, max_(max__) {}
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
typename parser_result<self_t, ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename parser_result<self_t, ScannerT>::type result_t;
|
||
|
result_t hit = this->subject().parse(scan);
|
||
|
if (hit.has_valid_attribute() && hit.value() > max_)
|
||
|
return scan.no_match();
|
||
|
return hit;
|
||
|
}
|
||
|
|
||
|
BoundsT max_;
|
||
|
};
|
||
|
|
||
|
template <typename BoundsT>
|
||
|
struct max_bounded_gen
|
||
|
{
|
||
|
max_bounded_gen(BoundsT const& max__)
|
||
|
: max_(max__) {}
|
||
|
|
||
|
template <typename DerivedT>
|
||
|
max_bounded<DerivedT, BoundsT>
|
||
|
operator[](parser<DerivedT> const& p) const
|
||
|
{ return max_bounded<DerivedT, BoundsT>(p.derived(), max_); }
|
||
|
|
||
|
BoundsT max_;
|
||
|
};
|
||
|
|
||
|
//////////////////////////////////
|
||
|
template <typename BoundsT>
|
||
|
inline max_bounded_gen<BoundsT>
|
||
|
max_limit_d(BoundsT const& max_)
|
||
|
{ return max_bounded_gen<BoundsT>(max_); }
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// bounded class
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
template <typename BoundsT>
|
||
|
struct bounded_gen;
|
||
|
|
||
|
template <typename ParserT, typename BoundsT>
|
||
|
struct bounded
|
||
|
: public unary<ParserT, parser<bounded<ParserT, BoundsT> > >
|
||
|
{
|
||
|
typedef bounded<ParserT, BoundsT> self_t;
|
||
|
typedef unary_parser_category parser_category_t;
|
||
|
typedef bounded_gen<BoundsT> parser_generator_t;
|
||
|
typedef unary<ParserT, parser<self_t> > base_t;
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
struct result
|
||
|
{
|
||
|
typedef typename parser_result<ParserT, ScannerT>::type type;
|
||
|
};
|
||
|
|
||
|
bounded(ParserT const& p, BoundsT const& min__, BoundsT const& max__)
|
||
|
: base_t(p)
|
||
|
, min_(min__)
|
||
|
, max_(max__) {}
|
||
|
|
||
|
template <typename ScannerT>
|
||
|
typename parser_result<self_t, ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename parser_result<self_t, ScannerT>::type result_t;
|
||
|
result_t hit = this->subject().parse(scan);
|
||
|
if (hit.has_valid_attribute() &&
|
||
|
(hit.value() < min_ || hit.value() > max_))
|
||
|
return scan.no_match();
|
||
|
return hit;
|
||
|
}
|
||
|
|
||
|
BoundsT min_, max_;
|
||
|
};
|
||
|
|
||
|
template <typename BoundsT>
|
||
|
struct bounded_gen
|
||
|
{
|
||
|
bounded_gen(BoundsT const& min__, BoundsT const& max__)
|
||
|
: min_(min__)
|
||
|
, max_(max__) {}
|
||
|
|
||
|
template <typename DerivedT>
|
||
|
bounded<DerivedT, BoundsT>
|
||
|
operator[](parser<DerivedT> const& p) const
|
||
|
{ return bounded<DerivedT, BoundsT>(p.derived(), min_, max_); }
|
||
|
|
||
|
BoundsT min_, max_;
|
||
|
};
|
||
|
|
||
|
template <typename BoundsT>
|
||
|
inline bounded_gen<BoundsT>
|
||
|
limit_d(BoundsT const& min_, BoundsT const& max_)
|
||
|
{ return bounded_gen<BoundsT>(min_, max_); }
|
||
|
|
||
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_END
|
||
|
|
||
|
}} // namespace BOOST_SPIRIT_CLASSIC_NS
|
||
|
|
||
|
#endif
|
||
|
|