public Operation(MathsExpression left, MathsExpression right, char @operator) => (Left, Right, Operator) = (left, right, @operator);
public void Visit(MathsExpression maths) { object leftVal = null; object rightVal = null; SailType resultType = SailType.UNKNOWN; // Left if (maths.Left is IntLiteralExpression) { leftVal = ((IntLiteralExpression)maths.Left).Value; resultType = SailType.INT; } else if (maths.Left is FloatLiteralExpression) { leftVal = ((FloatLiteralExpression)maths.Left).Value; resultType = SailType.FLOAT; } else if (maths.Left is IdentifierExpression) { string name = ((IdentifierExpression)maths.Left).Value; var variable = _variables.FirstOrDefault(v => v.Name == name); if (variable == null) { ErrorManager.CreateError("Can't compare non-existant variable!", ErrorType.Error, maths.Left.Line, maths.Left.Column); return; } if (variable.Value == null) { ErrorManager.CreateError("Can't compare null valued variable!", ErrorType.Error, maths.Left.Line, maths.Left.Column); return; } leftVal = variable.Value; resultType = variable.Type; } else if (maths.Left is MathsExpression) { Visit(maths.Left); var mathsValue = _mathsResults.Pop(); rightVal = mathsValue.Value; resultType = mathsValue.Type; } // Right if (maths.Right is IntLiteralExpression) { rightVal = ((IntLiteralExpression)maths.Right).Value; resultType = SailType.INT; } else if (maths.Right is FloatLiteralExpression) { rightVal = ((FloatLiteralExpression)maths.Right).Value; resultType = SailType.FLOAT; } else if (maths.Right is IdentifierExpression) { string name = ((IdentifierExpression)maths.Right).Value; var variable = _variables.FirstOrDefault(v => v.Name == name); if (variable == null) { ErrorManager.CreateError("Can't compare non-existant variable!", ErrorType.Error, maths.Right.Line, maths.Right.Column); return; } if (variable.Value == null) { ErrorManager.CreateError("Can't compare null valued variable!", ErrorType.Error, maths.Right.Line, maths.Right.Column); return; } rightVal = variable.Value; resultType = variable.Type; } else if (maths.Right is MathsExpression) { Visit(maths.Right); var mathsValue = _mathsResults.Pop(); rightVal = mathsValue.Value; resultType = mathsValue.Type; } object value = null; switch (maths.OperatorType) { case TokenType.PLUS: value = Convert.ToSingle(leftVal) + Convert.ToSingle(rightVal); break; case TokenType.MINUS: value = Convert.ToSingle(leftVal) - Convert.ToSingle(rightVal); break; case TokenType.ASTERISK: value = Convert.ToSingle(leftVal) * Convert.ToSingle(rightVal); break; case TokenType.FSLASH: value = Convert.ToSingle(leftVal) / Convert.ToSingle(rightVal); break; case TokenType.MODULO: value = Convert.ToSingle(leftVal) % Convert.ToSingle(rightVal); break; } _mathsResults.Push(new SailObject(null, value, resultType)); }