/// <summary> /// Apply operator /// </summary> /// <param name="left">Left value</param> /// <param name="right">Right value</param> /// <param name="op">Operator</param> /// <returns>Result value</returns> Value Calculate(Value left, Value right, TokenType op) { switch (left.VariableType) { case VariableType.BOOL: //TODO Bool calculate break; case VariableType.STRING: if (CanBe.Converted(typeof(string), right.ObjectValue)) { switch (op) { case TokenType.PLUS: return new Value(VariableType.STRING, left.ValueToString() + right.ValueToString()); default: break; } } break; case VariableType.INT: case VariableType.FLOAT: if (CanBe.Converted(typeof(float), right.ObjectValue)) { switch (op) { case TokenType.PLUS: return new Value(VariableType.FLOAT, left.ValueToFloat() + right.ValueToFloat()); case TokenType.MINUS: return new Value(VariableType.FLOAT, left.ValueToFloat() - right.ValueToFloat()); case TokenType.MULTIPLY: return new Value(VariableType.FLOAT, left.ValueToFloat() * right.ValueToFloat()); case TokenType.DIVIDE: return new Value(VariableType.FLOAT, left.ValueToFloat() / right.ValueToFloat()); default: break; } } else if (right.VariableType == VariableType.STRING && CanBe.Converted(typeof(string), left.ObjectValue)) { switch (op) { case TokenType.PLUS: return new Value(VariableType.STRING, left.ValueToString() + right.ValueToString()); } } break; case VariableType.CUSTOM: Logger.Error("Cannot apply operator on custom object for now."); break; } Logger.Error($"Cant apply this operator {op} on {left.VariableType} and {right.VariableType}"); return null; }
/// <summary> /// Set value /// </summary> /// <param name="newValue">New value</param> public void SetValue(Value newValue, AssignType op) { switch (newValue.VariableType) { #region STRING case VariableType.STRING: if (VariableType == VariableType.STRING) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToString(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToString() + newValue.ValueToString(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #1"); break; } else if (VariableType == VariableType.BOOL && CanBe.Converted(typeof(bool), newValue.ValueToString())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToBool(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #2"); break; } else if (VariableType == VariableType.FLOAT && CanBe.Converted(typeof(float), newValue.ValueToString())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToFloat(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToFloat() + newValue.ValueToFloat(); break; case AssignType.MINUSEQUAL: ObjectValue = ValueToFloat() - newValue.ValueToFloat(); break; case AssignType.MULTIPLYEQUAL: ObjectValue = ValueToFloat() * newValue.ValueToFloat(); break; case AssignType.DIVIDEEQUAL: ObjectValue = ValueToFloat() / newValue.ValueToFloat(); break; case AssignType.PLUSPLUS: ObjectValue = ValueToFloat() + 1; break; case AssignType.MINUSMINUS: ObjectValue = ValueToFloat() - 1; break; } else if (VariableType == VariableType.INT && CanBe.Converted(typeof(int), newValue.ValueToString())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToInt(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToInt() + newValue.ValueToInt(); break; case AssignType.MINUSEQUAL: ObjectValue = ValueToInt() - newValue.ValueToInt(); break; case AssignType.MULTIPLYEQUAL: ObjectValue = ValueToInt() * newValue.ValueToInt(); break; case AssignType.DIVIDEEQUAL: ObjectValue = ValueToInt() / newValue.ValueToInt(); break; case AssignType.PLUSPLUS: ObjectValue = ValueToInt() + 1; break; case AssignType.MINUSMINUS: ObjectValue = ValueToInt() - 1; break; } else Logger.Error($"You cant assign a string value to a {VariableType} variable."); break; #endregion #region INT case VariableType.INT: if (VariableType == VariableType.INT) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToInt(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToInt() + newValue.ValueToInt(); break; case AssignType.MINUSEQUAL: ObjectValue = ValueToInt() - newValue.ValueToInt(); break; case AssignType.MULTIPLYEQUAL: ObjectValue = ValueToInt() * newValue.ValueToInt(); break; case AssignType.DIVIDEEQUAL: ObjectValue = ValueToInt() / newValue.ValueToInt(); break; case AssignType.PLUSPLUS: ObjectValue = ValueToInt() + 1; break; case AssignType.MINUSMINUS: ObjectValue = ValueToInt() - 1; break; } else if (VariableType == VariableType.FLOAT) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToFloat(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToFloat() + newValue.ValueToFloat(); break; case AssignType.MINUSEQUAL: ObjectValue = ValueToFloat() - newValue.ValueToFloat(); break; case AssignType.MULTIPLYEQUAL: ObjectValue = ValueToFloat() * newValue.ValueToFloat(); break; case AssignType.DIVIDEEQUAL: ObjectValue = ValueToFloat() / newValue.ValueToFloat(); break; case AssignType.PLUSPLUS: ObjectValue = ValueToFloat() + 1; break; case AssignType.MINUSMINUS: ObjectValue = ValueToFloat() - 1; break; } else if (VariableType == VariableType.BOOL && CanBe.Converted(typeof(bool), newValue.ValueToInt())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToBool(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #3"); break; } else if (VariableType == VariableType.STRING && CanBe.Converted(typeof(string), newValue.ValueToInt())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToString(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToString() + newValue.ValueToString(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #4"); break; } else Logger.Error($"You cant assign a int value to a {VariableType} variable."); break; #endregion #region FLOAT case VariableType.FLOAT: if (VariableType == VariableType.FLOAT) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToFloat(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToFloat() + newValue.ValueToFloat(); break; case AssignType.MINUSEQUAL: ObjectValue = ValueToFloat() - newValue.ValueToFloat(); break; case AssignType.MULTIPLYEQUAL: ObjectValue = ValueToFloat() * newValue.ValueToFloat(); break; case AssignType.DIVIDEEQUAL: ObjectValue = ValueToFloat() / newValue.ValueToFloat(); break; case AssignType.PLUSPLUS: ObjectValue = ValueToFloat() + 1; break; case AssignType.MINUSMINUS: ObjectValue = ValueToFloat() + 1; break; } else if (VariableType == VariableType.INT) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToInt(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToInt() + newValue.ValueToInt(); break; case AssignType.MINUSEQUAL: ObjectValue = ValueToInt() - newValue.ValueToInt(); break; case AssignType.MULTIPLYEQUAL: ObjectValue = ValueToInt() * newValue.ValueToInt(); break; case AssignType.DIVIDEEQUAL: ObjectValue = ValueToInt() / newValue.ValueToInt(); break; case AssignType.PLUSPLUS: ObjectValue = ValueToInt() + 1; break; case AssignType.MINUSMINUS: ObjectValue = ValueToInt() + 1; break; } else if (VariableType == VariableType.BOOL && CanBe.Converted(typeof(bool), newValue.ValueToFloat())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToBool(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #5"); break; } else if (VariableType == VariableType.STRING && CanBe.Converted(typeof(string), newValue.ValueToFloat())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToString(); break; case AssignType.PLUSEQUAL: ObjectValue = ValueToString() + newValue.ValueToString(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #6"); break; } else Logger.Error($"You cant assign a float value to a {VariableType} variable."); break; #endregion #region BOOL case VariableType.BOOL: if (VariableType == VariableType.BOOL) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToBool(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #7"); break; } else if (VariableType == VariableType.FLOAT && CanBe.Converted(typeof(float), newValue.ValueToBool())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToFloat(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #8"); break; } else if (VariableType == VariableType.INT && CanBe.Converted(typeof(float), newValue.ValueToInt())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToInt(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #9"); break; } else if (VariableType == VariableType.STRING && CanBe.Converted(typeof(float), newValue.ValueToString())) switch (op) { case AssignType.EQUAL: ObjectValue = newValue.ValueToString(); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #10"); break; } else Logger.Error($"You cant assign a bool value to a {VariableType} variable."); break; #endregion #region CUSTOM case VariableType.CUSTOM: if (VariableType == VariableType.CUSTOM) switch (op) { case AssignType.EQUAL: if (newValue.CustomType == CustomType) ObjectValue = newValue.ObjectValue; else Logger.Error(LocaString.Get("WrongCustomObjectType")); break; default: Logger.Error(LocaString.Get("UnhandledError") + " : Value.cs #11"); break; } else Logger.Error($"You cant assign a custom value to a {VariableType} variable."); break; #endregion } CheckType(); }