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 mailing list
[email protected]
http://lists.boost.org/mailman/listinfo.cgi/proto

Reply via email to