Boost logo

Proto :

Subject: Re: [proto] Thoughts on traversing proto expressions and reusing grammar
From: Eric Niebler (eric_at_[hidden])
Date: 2010-10-04 15:25:54


On 10/4/2010 12:20 PM, Thomas Heller wrote:
> On Mon, Oct 4, 2010 at 8:53 PM, joel falcou <joel.falcou_at_[hidden]> wrote:
>> On 04/10/10 20:45, Eric Niebler wrote:
>>>
>>> I'm not opposed to such a thing being in Proto, but I (personally) don't
>>> feel a strong need. I'd be more willing if I saw a more strongly
>>> motivating example. I believe Joel Falcou invented something similar.
>>> Joel, what was your use scenario?
>>>
>>
>> NT2 ;)
>>
>> More specifically, all our transform are built the same way:
>> visit the tree, dispatch on visitor type + tag and act accordignly.
>> It was needed for us cause the grammar could NOT have been written by hand
>> as we supprot 200+ functions on nt2 terminal. All our code is somethign like
>> "for each node, do Foo" with variable Foo depending on the pass and
>> duplicating
>> the grammar was a no-no.
>>
>> We ended up with somethign like this, except without switch_ (which I like
>> btw), so we
>> can easily add new transform on the AST from the external view point of user
>> who
>> didn't have to know much proto. As I only had to define one grammar (the
>> visitor) and only specialisation of the
>> visitor for some tag, it compiled fast and that was what we wanted.
>>
>> Thomas, why not showign the split example ? It's far better than this one
>> and I remember I and Eric
>> weren't able to write it usign grammar/transform back in the day.
>
> The split example was one of the motivating examples, that is correct,
> though it suffers the exact points Eric is criticizing.
> The split example was possible because i added some new transforms
> which proto currently misses, but i didn't want to shoot out all my
> ammunition just yet :P
> But since you ask for it:
> http://github.com/sithhell/boosties/blob/master/proto/libs/proto/test/splitter.cpp

Can you describe in words or add some comments? It's not immediately
obvious what this code does.

> the new thing i added is transform_expr, which works like fusion::transform:
> It creates the expression again, with transformed child nodes (the
> child nodes get transformed according to the transform you specify as
> template parameter

How is that different than what the pass_through transform does?

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

Proto list run by eric at boostpro.com