Boost logo

Proto :

Subject: Re: [proto] Thoughts on traversing proto expressions and reusing grammar
From: Eric Niebler (eric_at_[hidden])
Date: 2010-10-13 19:58:16

On 10/4/2010 12:20 PM, Thomas Heller wrote:
> On Mon, Oct 4, 2010 at 8:53 PM, joel falcou 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.

Fair 'nuf. But I haven't yet reached the conclusion that visitor is the
appropriate solution.

>> 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)

This is something I have trouble with. A visitor is a grammar? That
doesn't make sense to me.

>> 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.

Joel, I don't recall this particular problem or being unable to solve it
with Proto transforms.

> 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:
> 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

If the theory is that this particular problem cannot be implemented with
existing Proto grammars and transforms, then I submit the attached
solution as contrary evidence. I'll admit that it doesn't have the
property that the transforms can be substituted post-hoc into an
existing Proto algorithm, but is that really necessary? There is no
grammar to speak of; *every* expression is a valid split expression.

This solution is much, much simpler than Thomas' solution that uses a
visitor. Heck, it took me longer to understand Thomas' code than it did
for me to write the solution using standard Proto components.

Still not seeing the big picture with visitors,

Eric Niebler
BoostPro Computing

Proto list run by eric at