|
Proto : |
Subject: [proto] vararg + fold
From: Christophe Henry (christophe.j.henry_at_[hidden])
Date: 2010-07-21 07:43:14
Hi,
I want a grammar B which parses a comma-separated list of expressions
matching another grammar A and returning a mpl::vector of expressions
transformed using A. Something like:
(AExpr, AExpr, ...).
I managed to do it this way:
struct A...
template <class T>
struct make_vector
{
typedef boost::mpl::vector<T> type;
};
struct B
: proto::or_<
proto::when <
A,
make_vector<A(proto::_)>()
>,
proto::when <
proto::comma<B,A>,
boost::mpl::push_back<
B(proto::_left),
A(proto::_right) >()
>
>
{};
This seems to work but shouts for a fold so I tried:
struct B
: proto::when <
proto::comma< A,proto::vararg<A> >, // => probably wrong
proto::fold_tree<
proto::_
, ::boost::mpl::vector<>()
, ::boost::mpl::push_back<proto::_state, A(proto::_) >()
>
>
{};
This seems to work in most cases (I suppose by sheer luck) but doesn't
parse correctly if no comma at all: (AExpr)
So I suppose that at least the first part of when is wrong.
Any idea how to make it work?
Thanks,
Christophe
Proto list run by eric at boostpro.com