
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