public override Node ExitNumber(Token node)
        {
            double           value;
            PrimitiveOperand op;

            // Try to store the number as an integer if possible
            bool success = double.TryParse(node.Image, NumberStyles.Integer, null, out value);

            if (success)
            {
                if (value >= Int32.MinValue & value <= Int32.MaxValue)
                {
                    op = new IntegerOperand(Convert.ToInt32(value));
                }
                else
                {
                    op = new DoubleOperand(value);
                }
            }
            else
            {
                value = double.Parse(node.Image);
                op    = new DoubleOperand(value);
            }

            node.AddValue(op);
            return(node);
        }
Beispiel #2
0
        protected IOperand DoDoubleOperation(DoubleOperand lhs, DoubleOperand rhs, DoubleOperator @operator)
        {
            double result = @operator(lhs.ValueAsDouble, rhs.ValueAsDouble);

            if (IsInvalidDouble(result))
            {
                return(new ErrorValueOperand(ErrorValueType.Num));
            }
            return(new DoubleOperand(result));
        }
Beispiel #3
0
        public static IOperand CreateDynamic(object value)
        {
            if (value == null)
            {
                return(new NullValueOperand());
            }

            Type     t = value.GetType();
            IOperand op;

            if (ReferenceEquals(t, typeof(double)))
            {
                op = new DoubleOperand((double)value);
            }
            else if (ReferenceEquals(t, typeof(string)))
            {
                op = new StringOperand((string)value);
            }
            else if (ReferenceEquals(t, typeof(bool)))
            {
                op = new BooleanOperand((bool)value);
            }
            else if (ReferenceEquals(t, typeof(int)))
            {
                op = new IntegerOperand((int)value);
            }
            else if ((value) is IReference)
            {
                op = (IOperand)value;
            }
            else if (ReferenceEquals(t, typeof(ErrorValueWrapper)))
            {
                op = new ErrorValueOperand((ErrorValueWrapper)value);
            }
            else if (ReferenceEquals(t, typeof(DateTime)))
            {
                op = new DateTimeOperand((DateTime)value);
            }
            else
            {
                throw new ArgumentException(String.Format("The type {0} is not supported as an operand", t.Name));
            }

            return(op);
        }