Boost logo

Boost Users :

Subject: Re: [Boost-users] [Proto] How to access the grammar of an expression?
From: Eric Niebler (eric_at_[hidden])
Date: 2010-09-24 13:35:03


On 9/24/2010 11:15 AM, Roland Bock wrote:
> On 09/24/2010 04:52 PM, Thomas Heller wrote:
>>
>> you can compute that type information directly in your proto transform:
>>
>> struct sorted_argument_function:
>> proto::and_
>> <
>> proto::function<fun_terminal, proto::_, proto::_>,
>> proto::if_
>> <
>> grammar_less<
>> proto::_value(proto::_child0(proto::_child1))
>> , proto::_value(proto::_child0(proto::_child2))>()
>> >
>> >
>> {};
>
> OK, admittedly, that looks a lot nicer, but in case I call something like
>
> fun(b(0), 42));
>
> the error messages are just horrible in both solutions...

The proto::and_ has two branches: proto::function and proto::if_.

The proto::if_ is assuming:

1. That there are at least three child nodes
2. That child1 and child2 themselves have a child
3. That the child nodes of child1 and child2 are terminals

The proto::function has only verified the first of these assumptions.
You need to change it to validate the other two as well:

    struct function_argument
      : proto::function<proto::terminal<proto::_>, proto::_>
    {};

    struct sorted_argument_function
      : proto::and_
        <
            proto::function
            <
                fun_terminal,
                function_argument,
                function_argument
>,
            proto::if_
            <
                grammar_less
                <
                   proto::_value(proto::_child0(proto::_child1))
                 , proto::_value(proto::_child0(proto::_child2))
>()
>
>
    {};

HTH,

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