private Expression ParseAdditive()
{
Expression left = ParseMultiplicative();
while (_token.ID == TokenId.Plus || _token.ID == TokenId.Minus ||
_token.ID == TokenId.Amphersand)
{
Token op = _token;
NextToken();
Expression right = ParseMultiplicative();
switch (op.ID)
{
case TokenId.Plus:
if (left.Type == typeof(string) || right.Type == typeof(string))
goto case TokenId.Amphersand;
CheckAndPromoteOperands(typeof(IAddSignatures), op.Text, ref left, ref right, op.Position);
left = GenerateAdd(left, right);
break;
case TokenId.Minus:
CheckAndPromoteOperands(typeof(ISubtractSignatures), op.Text, ref left, ref right, op.Position);
left = GenerateSubtract(left, right);
break;
case TokenId.Amphersand:
left = GenerateStringConcat(left, right);
break;
}
}
return left;
}