Boost logo

Proto :

Subject: Re: [proto] : How to use complex grammars in a domain/extension
From: Eric Niebler (eric_at_[hidden])
Date: 2010-09-21 10:01:55


On 9/21/2010 9:51 AM, Eric Niebler wrote:
> (proto lists members, see this thread for the rest of the discussion,
> which has been happening on -users:
> http://lists.boost.org/boost-users/2010/09/62747.php)
>
> On 9/21/2010 9:19 AM, Roland Bock wrote:
>> On 09/21/2010 11:55 AM, Thomas Heller wrote:
>>> <snip>
>>> Solved the mistery. here is the code, explanation comes afterward:
>>>
>>> <snip>
>>> So, everything works as expected!
>>>
>> Thomas,
>>
>> wow, this was driving me crazy, thanks for solving and explaining in all
>> the detail! :-)
>>
>> I am still not sure if this isn't a conceptual problem, though:
>>
>> The "equation" grammar is perfectly OK. But without or-ing it with the
>> "addition" grammar, the extension does not allow ANY valid expression to
>> be created. I wonder if that is a bug or a feature?
>
> It's a feature. Imagine this grammar:
>
> struct IntsOnlyPlease
> : proto::or_<
> proto::terminal<int>
> , proto::nary_expr<proto::_, proto::vararg<IntsOnlyPlease> >
> >
> {};
>
> And a integer terminal "i" in a domain that obeys this grammar. Now,
> what should this do:
>
> i + "hello!";
>
> You want it to fail because if it doesn't, you would create an
> expression that doesn't conform to the domain's grammar. Right? Proto
> accomplishes this by enforcing that all operands must conform to the
> domain's grammar *and* the resulting expression must also conform.
> Otherwise, the operator is disabled.
>
> Anything else would be fundamentally broken.

This explanation is incomplete. Naturally, this operator+ would be
disabled anyway because the resulting expression doesn't conform to the
grammar regardless of whether the LHS and RHS conform. It's a question
of *when* the operator gets disabled. For a full explanation, see this
bug report:

https://svn.boost.org/trac/boost/ticket/2407

The answer is simple and logically consistent: make sure *every* valid
expression in your domain (including lone terminals) is accounted for by
your grammar.

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

Proto list run by eric at boostpro.com