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); }
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)); }
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); }