Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2007-07-01 11:13:19


Eric Niebler wrote:
> dan marsden wrote:
>> As phoenix expressions have operator(), I'm already using an expression wrapper around all my proto expressions, so I presume that is where I would add any special member support?
>
> Yep. You could be to put all such members into the Phoenix expression
> wrapper and use a grammar to flag or disallow invalid uses. The members
> would just be Proto terminals, like "terminal<phoenix::tag::else_>::type
> const else_".

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_>,_>
>
  ,_
>

-- 
Eric Niebler
Boost Consulting
www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk