public dynamic Visit(MultPowExpr expr)
        {
            Visit((ExpressionBase)expr);
            if (OptimizeMode.ExpressionSimplify)
            {
                var left  = expr.First as LiteralExpr;
                var right = expr.Second as LiteralExpr;
                if (left != null && right != null)
                {
                    var literal = new LiteralExpr {
                        Namespace = expr.Namespace, Node = expr.Node, SymbolType = expr.GetExprType()
                    };
                    dynamic result;
                    switch (expr.Type)
                    {
                    case MultPowDivType.Mult:
                        result = left.Value * right.Value;
                        break;

                    case MultPowDivType.Div:
                        result = (double)left.Value / right.Value;
                        break;

                    case MultPowDivType.IntDiv:
                        result = left.Value / right.Value;
                        break;

                    case MultPowDivType.Mod:
                        result = left.Value % right.Value;
                        break;

                    case MultPowDivType.Pow:
                        result = Math.Pow(left.Value, right.Value);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                    if (literal.SymbolType == SymbolType.Integer)
                    {
                        result = Convert.ToInt32(result);
                    }
                    literal.Value = result;
                    return(literal);
                }
            }
            return(expr);
        }