Boost logo

Boost Users :

Subject: Re: [Boost-users] Defining Statements with Proto
From: Eric Niebler (eric_at_[hidden])
Date: 2010-01-03 22:00:31


On 1/4/2010 5:15 AM, David A. Greene wrote:
> On Saturday 02 January 2010 16:17:03 Eric Niebler wrote:
>
>> The attached code compiles. You weren't handling the if_ case correctly.
>> You had specialized ConstructGrammarCases on IfTag, but you weren't
>> using IfTag anywhere, so that specialization wasn't getting picked up.
>> There were a few other small problems, but on the whole, you were pretty
>> close.
>
> If I wanted to keep the IfRule case as a specialization, what should it be
> specialized on? IfTag was a leftover remnant, so that was a coding error.
> What I intended to do is this:
>
> template<>
> struct ConstructGrammarCases::case_<keyword::if_>
> : boost::proto::when<
> IfRule,
> ConstructBinary<If>(ConstructGrammar(boost::proto::_right(boost::proto::_left)),
> ConstructGrammar(boost::proto::_right))> {};
>
> But this leads to the compiler error seen earlier. Something like if_ is
> going to have to use a case_ specialization, so it's necessary to know
> how this is supposed to work.

You already know the answer, but you don't know you know it. ;-) You
correctly defined IfRule as:

typedef boost::proto::subscript<
   boost::proto::function<
     IfTerminal,
     ConstructGrammar
>,
   ConstructGrammar
> IfRule;

So you know that the topmost node of an if_ statement has a tag type of
boost::proto::tag::subscript. So you should create a case_
specialization on that tag type, as follows:

template<>
struct ConstructGrammarCases::case_<boost::proto::tag::subscript>
   : boost::proto::when<
   IfRule,
   ConstructBinary<
     If,
     boost::shared_ptr<Base>
>(ConstructGrammar(boost::proto::_right(boost::proto::_left)),
                  ConstructGrammar(boost::proto::_right))> {};

Hope that helps.

-- 
Eric Niebler
BoostPro Computing
http://www.boostpro.com

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net