context-free grammar

KennyTM~ kennytm at gmail.com
Sun Mar 6 23:27:56 PST 2011


On Mar 7, 11 15:16, %u wrote:
>> That's essentially the example that's been under discussion - though in this case it's a ref instead of
> a temporary for the lvalue. Regardless, it's context free because a * b is by definition a variable
> declaration, not a call to the multiplication operator. If you want it to use the multiplication
> operator, then use parens: (a * b) = b. It's context free, because it just assumes one of the two and
> it's _always_ that one, so there's no ambiguity. It is, _by definition_, a variable declaration.
>
> Oh, I see. So is multiplication being special-cased in the grammar, or is it part of a more general rule
> in the language?
>

Only statement of the form 'p*q=r' is "special-cased". Actually it's not 
quite fair to say it is "special-cased", just because declarations 
(which accepts 'p*q=r') are processed before expressions.

     import std.stdio;

     struct Foo {
         ref Foo opBinary(string x) (int a) pure nothrow {
             return this;
         }
         ref Foo opBinaryRight(string x) (int a) pure nothrow {
             return this;
         }
     }

     void main() {
         Foo a;
         int b;
         a + 1 = a;
         a * 1 = a;
         1 + a = a;
         1 * a = a;
         a + b = a;
         //a * b = a;
     }





>
>> Also, opMul is on its way to deprecation. binaryOp should be used for overloading the multiplication
> operator.
>
> Whoa! I did not know that; thanks.



More information about the Digitalmars-d mailing list