1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
#include "parser.ih"
RuleValue &Parser::assign(RuleValue &v1, int operation, RuleValue const &v2)
{
if (d_error)
return v1;
error(v1.tag() != RuleValue::VARIABLE, "Non-lvalue in assignment");
error(
v2.tag() == RuleValue::FUNCTION,
"Function names have no values. Forgot arguments?"
);
RuleValue &value = lvalue(v1);
RuleValue const &rv2 = rvalue(v2);
switch (operation)
{
case '=':
value = rv2;
break;
case ADDA:
value += rv2;
break;
case SUBA:
value -= rv2;
break;
case MULA:
value *= rv2;
break;
case DIVA:
div0(value, rv2);
value /= rv2;
break;
case MODA:
div0(value, rv2);
integral(value, rv2);
value %= rv2;
break;
case ANDA:
integral(value, rv2);
value &= rv2;
break;
case XORA:
integral(value, rv2);
value ^= rv2;
break;
case ORA:
integral(value, rv2);
value ^= rv2;
break;
case RSHIFTA:
integral(value, rv2);
value >>= rv2;
break;
case LSHIFTA:
integral(value, rv2);
value >>= rv2;
break;
}
return v1;
}
|