|
Boost : |
From: David A. Greene (greened_at_[hidden])
Date: 2007-07-01 16:25:25
On Sunday 01 July 2007 10:13, Eric Niebler wrote:
> Oh wait, that's not quite what you want, because then if_[e1].else_[e2]
> will chop off the if_ part of the tree. What you need instead is a
> member like (untested):
>
> template<typename Expr ...>
> struct phoenix_expr
>
> : proto::extends<Expr ...>
>
> {
> phoenix_expr(...)
>
> : else_(proto::make_expr<phoenix::tag::else_>(*this))
>
> {}
>
> // ...
>
> proto::result_of::make_expr<
> pheonix::tag::else_ // else is now an "operator"
> , phoenix_expr const
>
> >::type const else_;
>
> };
>
> Then, if_/else_ statements would conform to the following grammar:
>
> subscript<
> unary_expr<
> phoenix::tag::else_
> ,subscript<terminal<phoenix::tag::if_>,_>
>
> ,_
Ok, that makes sense to me, modulo the current lack of make_expr
documentation. :)
I'm looking to do something similar to what Dan is doing so I'm glad he
asked the question. I was just about to.
One thing that's not clear to me is how he would handle the
if_(expr)[...] syntax. In your first message you have:
// Here is the grammar for if_ expressions
struct IfGrammar
: proto::subscript<
proto::terminal<phoenix::tag::if_>
proto::_
>
{};
I don't understand the derivation from proto::subscript. What about the
call operator?
From your second message:
Then, if_/else_ statements would conform to the following grammar:
subscript<
unary_expr<
phoenix::tag::else_
,subscript<terminal<phoenix::tag::if_>,_>
>
,_
>
Again what about the call operator?
Dan has two uses of operator() here. The first is a proto expression that
needs to be part of the grammar to match the if expression. The other is
the operator() provided through proto::extends to do the runtime evaluation.
I'm going to be doing something different. Rather than evaluate the
expression, I'm going to want to run a transformation on it. Given the
example from your second message:
template<typename Expr ...>
struct phoenix_expr
: proto::extends<Expr ...>
{
phoenix_expr(...)
: else_(proto::make_expr<phoenix::tag::else_>(*this))
{}
// ...
proto::result_of::make_expr<
pheonix::tag::else_ // else is now an "operator"
, phoenix_expr const
>::type const else_;
};
how do I match the new "else_ operator" and transform it?
Thanks.
-Dave
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk