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

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

Proto list run by eric at