Beispiel #1
0
 public override Expression VisitBinaryExpression(DreamGrammarParser.BinaryExpressionContext context)
 {
     return(base.VisitBinaryExpression(context));
 }
Beispiel #2
0
        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);
        }