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.
66 lines
2.1 KiB
66 lines
2.1 KiB
/*============================================================================= |
|
Copyright (c) 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) |
|
=============================================================================*/ |
|
#ifndef BOOST_SPIRIT_LAZY_HPP |
|
#define BOOST_SPIRIT_LAZY_HPP |
|
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
#include <boost/spirit/home/classic/namespace.hpp> |
|
#include <boost/spirit/home/classic/core/parser.hpp> |
|
#include <boost/spirit/home/classic/phoenix/actor.hpp> |
|
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
|
namespace boost { namespace spirit { |
|
|
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
|
|
|
//////////////////////////////////////////////////////////////////////////// |
|
// |
|
// lazy_parser, holds phoenix actor which returns a spirit parser. |
|
// |
|
//////////////////////////////////////////////////////////////////////////// |
|
|
|
template<class ActorT> |
|
struct lazy_parser : parser<lazy_parser<ActorT> > |
|
{ |
|
typedef lazy_parser<ActorT> self_t; |
|
typedef typename ::phoenix::actor_result< |
|
ActorT, ::phoenix::tuple<> >::plain_type actor_result_t; |
|
|
|
template<typename ScannerT> |
|
struct result |
|
{ |
|
typedef typename |
|
parser_result<actor_result_t, ScannerT>::type |
|
type; |
|
}; |
|
|
|
lazy_parser(ActorT const& actor_) |
|
: actor(actor_) {} |
|
|
|
template<typename ScannerT> |
|
typename parser_result<self_t, ScannerT>::type |
|
parse(ScannerT const& scan) const |
|
{ return actor().parse(scan); } |
|
|
|
ActorT actor; |
|
}; |
|
|
|
////////////////////////////// |
|
// lazy_p, returns lazy_parser |
|
// Usage: lazy_p(actor) |
|
template<class ActorT> |
|
lazy_parser<ActorT> lazy_p(ActorT const& actor) |
|
{ return lazy_parser<ActorT>(actor); } |
|
|
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
|
|
|
}} // namespace BOOST_SPIRIT_CLASSIC_NS |
|
|
|
#endif // BOOST_SPIRIT_LAZY_HPP
|
|
|