public override Expression VisitBinaryExpression(DreamGrammarParser.BinaryExpressionContext context) { return(base.VisitBinaryExpression(context)); }
public override Expression VisitBinaryExpression(DreamGrammarParser.BinaryExpressionContext context) { var expressions = new List <Expression>(); foreach (var t in context.children) { expressions.Add(t.Accept(this)); } BinaryExpression binaryExpression = null; BinaryExpressionTypes currentType = binaryExpressionStack.Peek(); String binaryOperator = RemoveLeadingAndTrailingQuotes(expressions[1].ToString()); switch (binaryOperator) { case "+": case "/": case "-": case "*": case "%": if (currentType == BinaryExpressionTypes.Int) { Expression left; Expression right; // Assumptions: Constant Expressions may be wrapped in quotes. So strips quotes. if (expressions[0] is ConstantExpression) { left = Expression.Constant(Convert.ToInt32(RemoveLeadingAndTrailingQuotes(expressions[0].ToString()))); } else { left = expressions[0]; } if (expressions[2] is ConstantExpression) { right = Expression.Constant(Convert.ToInt32(RemoveLeadingAndTrailingQuotes(expressions[2].ToString()))); } else { right = expressions[2]; } if (binaryOperator.Equals("+")) { binaryExpression = Expression.Add(left, right); } else if (binaryOperator.Equals("/")) { binaryExpression = Expression.Divide(left, right); } else if (binaryOperator.Equals("-")) { binaryExpression = Expression.Subtract(left, right); } else if (binaryOperator.Equals("*")) { binaryExpression = Expression.Multiply(left, right); } else if (binaryOperator.Equals("%")) { binaryExpression = Expression.Modulo(left, right); } } else if (currentType == BinaryExpressionTypes.Double) { Expression left; Expression right; if (expressions[0] is ConstantExpression) { left = Expression.Constant(Convert.ToDouble(RemoveLeadingAndTrailingQuotes(expressions[0].ToString()))); } else { left = expressions[0]; } if (expressions[2] is ConstantExpression) { right = Expression.Constant(Convert.ToDouble(RemoveLeadingAndTrailingQuotes(expressions[2].ToString()))); } else { right = expressions[2]; } if (binaryOperator.Equals("+")) { binaryExpression = Expression.Add(left, right); } else if (binaryOperator.Equals("/")) { binaryExpression = Expression.Divide(left, right); } else if (binaryOperator.Equals("-")) { binaryExpression = Expression.Subtract(left, right); } else if (binaryOperator.Equals("*")) { binaryExpression = Expression.Multiply(left, right); } else if (binaryOperator.Equals("%")) { binaryExpression = Expression.Modulo(left, right); } } else if (currentType == BinaryExpressionTypes.String) { Expression left; Expression right; var concatMethod = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }); if (binaryOperator.Equals("+")) { if (expressions[0] is ConstantExpression) { left = Expression.Constant(Convert.ToDouble(RemoveLeadingAndTrailingQuotes(expressions[0].ToString()))); } else { left = expressions[0]; } if (expressions[2] is ConstantExpression) { right = Expression.Constant(Convert.ToDouble(RemoveLeadingAndTrailingQuotes(expressions[2].ToString()))); } else { right = expressions[2]; } binaryExpression = Expression.Add(left, right, concatMethod); } } break; default: break; } Debug.Assert(binaryExpression != null, "you probably need to add a support for a binary operator"); return(binaryExpression); }