166 lines
4.6 KiB
Plaintext
166 lines
4.6 KiB
Plaintext
|
/*=============================================================================
|
||
|
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_NO_ACTIONS_HPP)
|
||
|
#define BOOST_SPIRIT_NO_ACTIONS_HPP
|
||
|
|
||
|
#include <boost/spirit/home/classic/core/parser.hpp>
|
||
|
#include <boost/spirit/home/classic/core/composite/composite.hpp>
|
||
|
#include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
|
||
|
|
||
|
namespace boost {
|
||
|
namespace spirit {
|
||
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// no_actions_action_policy
|
||
|
|
||
|
template<typename BaseT = action_policy>
|
||
|
struct no_actions_action_policy:
|
||
|
public BaseT
|
||
|
{
|
||
|
typedef BaseT base_t;
|
||
|
|
||
|
no_actions_action_policy():
|
||
|
BaseT()
|
||
|
{}
|
||
|
|
||
|
template<typename PolicyT>
|
||
|
no_actions_action_policy(PolicyT const& other):
|
||
|
BaseT(other)
|
||
|
{}
|
||
|
|
||
|
template<typename ActorT, typename AttrT, typename IteratorT>
|
||
|
void
|
||
|
do_action(
|
||
|
ActorT const& actor,
|
||
|
AttrT& val,
|
||
|
IteratorT const& first,
|
||
|
IteratorT const& last) const
|
||
|
{}
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// no_actions_scanner
|
||
|
|
||
|
|
||
|
namespace detail
|
||
|
{
|
||
|
template <typename ActionPolicy>
|
||
|
struct compute_no_actions_action_policy
|
||
|
{
|
||
|
typedef no_actions_action_policy<ActionPolicy> type;
|
||
|
};
|
||
|
|
||
|
template <typename ActionPolicy>
|
||
|
struct compute_no_actions_action_policy<no_actions_action_policy<ActionPolicy> >
|
||
|
{
|
||
|
typedef no_actions_action_policy<ActionPolicy> type;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
template<typename ScannerT = scanner<> >
|
||
|
struct no_actions_scanner
|
||
|
{
|
||
|
typedef scanner_policies<
|
||
|
typename ScannerT::iteration_policy_t,
|
||
|
typename ScannerT::match_policy_t,
|
||
|
typename detail::compute_no_actions_action_policy<typename ScannerT::action_policy_t>::type
|
||
|
> policies_t;
|
||
|
|
||
|
typedef typename
|
||
|
rebind_scanner_policies<ScannerT, policies_t>::type type;
|
||
|
};
|
||
|
|
||
|
#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
|
||
|
|
||
|
template<typename ScannerT = scanner<> >
|
||
|
struct no_actions_scanner_list
|
||
|
{
|
||
|
typedef
|
||
|
scanner_list<
|
||
|
ScannerT,
|
||
|
typename no_actions_scanner<ScannerT>::type
|
||
|
>
|
||
|
type;
|
||
|
};
|
||
|
|
||
|
#endif // BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// no_actions_parser
|
||
|
|
||
|
struct no_actions_parser_gen;
|
||
|
|
||
|
template<typename ParserT>
|
||
|
struct no_actions_parser:
|
||
|
public unary<ParserT, parser<no_actions_parser<ParserT> > >
|
||
|
{
|
||
|
typedef no_actions_parser<ParserT> self_t;
|
||
|
typedef unary_parser_category parser_category_t;
|
||
|
typedef no_actions_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;
|
||
|
};
|
||
|
|
||
|
no_actions_parser(ParserT const& p)
|
||
|
: base_t(p)
|
||
|
{}
|
||
|
|
||
|
template<typename ScannerT>
|
||
|
typename result<ScannerT>::type
|
||
|
parse(ScannerT const& scan) const
|
||
|
{
|
||
|
typedef typename no_actions_scanner<ScannerT>::policies_t policies_t;
|
||
|
|
||
|
return this->subject().parse(scan.change_policies(policies_t(scan)));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// no_actions_parser_gen
|
||
|
|
||
|
struct no_actions_parser_gen
|
||
|
{
|
||
|
template<typename ParserT>
|
||
|
struct result
|
||
|
{
|
||
|
typedef no_actions_parser<ParserT> type;
|
||
|
};
|
||
|
|
||
|
template<typename ParserT>
|
||
|
static no_actions_parser<ParserT>
|
||
|
generate(parser<ParserT> const& subject)
|
||
|
{
|
||
|
return no_actions_parser<ParserT>(subject.derived());
|
||
|
}
|
||
|
|
||
|
template<typename ParserT>
|
||
|
no_actions_parser<ParserT>
|
||
|
operator[](parser<ParserT> const& subject) const
|
||
|
{
|
||
|
return no_actions_parser<ParserT>(subject.derived());
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// no_actions_d
|
||
|
|
||
|
const no_actions_parser_gen no_actions_d = no_actions_parser_gen();
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_END
|
||
|
} // namespace spirit
|
||
|
} // namespace boost
|
||
|
|
||
|
#endif // !defined(BOOST_SPIRIT_NO_ACTIONS_HPP)
|