From 03aaf175c575700c21b4787e233cc66c82dd44e9 Mon Sep 17 00:00:00 2001 From: Dmytro Kyshchenko Date: Fri, 9 Jun 2017 16:25:12 +0300 Subject: [PATCH] #190 --- xFunc.Maths/Analyzers/TypeAnalyzer.cs | 80 ++++++++++++++++----------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/xFunc.Maths/Analyzers/TypeAnalyzer.cs b/xFunc.Maths/Analyzers/TypeAnalyzer.cs index 4617a4ca2..a48ff6157 100644 --- a/xFunc.Maths/Analyzers/TypeAnalyzer.cs +++ b/xFunc.Maths/Analyzers/TypeAnalyzer.cs @@ -27,7 +27,6 @@ namespace xFunc.Maths.Analyzers { // todo: exceptions!!! - // todo: define/undefine!!! /// /// Type Analyzer checks the expression tree for argument type and result type. If result type is Undefined, then Type Analyzer cannot determine the right type and bypass current expression. @@ -123,6 +122,7 @@ public virtual ResultType Analyze(Add exp) if (leftResult == ResultType.Vector && rightResult == ResultType.Vector) return ResultType.Vector; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -140,7 +140,7 @@ public virtual ResultType Analyze(Ceil exp) if (result == ResultType.Number) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number, result); } /// @@ -150,6 +150,7 @@ public virtual ResultType Analyze(Ceil exp) /// The result of analysis. public virtual ResultType Analyze(Define exp) { + // TODO: !!! return ResultType.Undefined; } @@ -160,6 +161,7 @@ public virtual ResultType Analyze(Define exp) /// The result of analysis. public virtual ResultType Analyze(Del exp) { + // TODO: !!! return ResultType.Vector; } @@ -179,6 +181,7 @@ public virtual ResultType Analyze(Derivative exp) if (exp.ParametersCount == 3 && exp.Arguments[1] is Variable && exp.Arguments[2] is Number) return ResultType.Number; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -203,6 +206,7 @@ public virtual ResultType Analyze(Div exp) if (leftResult == ResultType.Number && rightResult == ResultType.Number) return ResultType.Number; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -223,7 +227,7 @@ public virtual ResultType Analyze(Exp exp) if (result == ResultType.ComplexNumber) return ResultType.ComplexNumber; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number | ResultType.ComplexNumber, result); } /// @@ -240,7 +244,7 @@ public virtual ResultType Analyze(Fact exp) if (result == ResultType.Number) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number, result); } /// @@ -257,7 +261,7 @@ public virtual ResultType Analyze(Floor exp) if (result == ResultType.Number) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number, result); } /// @@ -271,10 +275,11 @@ public virtual ResultType Analyze(GCD exp) if (results == null || results.Contains(ResultType.Undefined)) return ResultType.Undefined; - if (results.All(x => x == ResultType.Number)) - return ResultType.Number; + for (var i = 0; i < results.Count; i++) + if (results[i] != ResultType.Number) + throw new DifferentParameterTypeMismatchException(ResultType.Number, results[i], i); - throw new ParameterTypeMismatchException(); + return ResultType.Number; } /// @@ -291,7 +296,7 @@ public virtual ResultType Analyze(Lb exp) if (result == ResultType.Number) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number, result); } /// @@ -305,10 +310,11 @@ public virtual ResultType Analyze(LCM exp) if (results == null || results.Contains(ResultType.Undefined)) return ResultType.Undefined; - if (results.All(x => x == ResultType.Number)) - return ResultType.Number; + for (var i = 0; i < results.Count; i++) + if (results[i] != ResultType.Number) + throw new DifferentParameterTypeMismatchException(ResultType.Number, results[i], i); - throw new ParameterTypeMismatchException(); + return ResultType.Number; } /// @@ -328,7 +334,7 @@ public virtual ResultType Analyze(Lg exp) if (result == ResultType.ComplexNumber) return ResultType.ComplexNumber; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number | ResultType.ComplexNumber, result); } /// @@ -348,7 +354,7 @@ public virtual ResultType Analyze(Ln exp) if (result == ResultType.ComplexNumber) return ResultType.ComplexNumber; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number | ResultType.ComplexNumber, result); } /// @@ -369,6 +375,7 @@ public virtual ResultType Analyze(Log exp) if (leftResult == ResultType.Number && rightResult == ResultType.ComplexNumber) return ResultType.ComplexNumber; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -387,6 +394,7 @@ public virtual ResultType Analyze(Mod exp) if (leftResult == ResultType.Number && rightResult == ResultType.Number) return ResultType.Number; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -423,6 +431,7 @@ public virtual ResultType Analyze(Mul exp) if (leftResult == ResultType.Vector || (leftResult == ResultType.Number || leftResult == ResultType.Matrix || leftResult == ResultType.Vector)) return ResultType.Vector; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -455,6 +464,7 @@ public virtual ResultType Analyze(Pow exp) (rightResult == ResultType.Number || rightResult == ResultType.ComplexNumber)) return ResultType.ComplexNumber; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -473,6 +483,7 @@ public virtual ResultType Analyze(Root exp) if (leftResult == ResultType.Number && rightResult == ResultType.Number) return ResultType.Number; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -487,10 +498,11 @@ public virtual ResultType Analyze(Round exp) if (results.Contains(ResultType.Undefined)) return ResultType.Undefined; - if (results.All(x => x == ResultType.Number)) - return ResultType.Number; + for (var i = 0; i < results.Count; i++) + if (results[i] != ResultType.Number) + throw new DifferentParameterTypeMismatchException(ResultType.Number, results[i], i); - throw new ParameterTypeMismatchException(); + return ResultType.Number; } /// @@ -540,6 +552,7 @@ public virtual ResultType Analyze(Sub exp) if (leftResult == ResultType.Vector && rightResult == ResultType.Vector) return ResultType.Vector; + // TODO: !!! throw new ParameterTypeMismatchException(); } @@ -560,7 +573,7 @@ public virtual ResultType Analyze(UnaryMinus exp) if (result == ResultType.ComplexNumber) return ResultType.ComplexNumber; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Number | ResultType.ComplexNumber, result); } /// @@ -570,6 +583,7 @@ public virtual ResultType Analyze(UnaryMinus exp) /// The result of analysis. public virtual ResultType Analyze(Undefine exp) { + // TODO: !!! return ResultType.Undefined; } @@ -618,10 +632,11 @@ public virtual ResultType Analyze(Vector exp) if (results == null || results.Contains(ResultType.Undefined)) return ResultType.Undefined; - if (results.All(x => x == ResultType.Number)) - return ResultType.Vector; + for (var i = 0; i < results.Count; i++) + if (results[i] != ResultType.Number) + throw new DifferentParameterTypeMismatchException(ResultType.Number, results[i], i); - throw new ParameterTypeMismatchException(); + return ResultType.Vector; } /// @@ -635,10 +650,11 @@ public virtual ResultType Analyze(Matrix exp) if (results == null || results.Contains(ResultType.Undefined)) return ResultType.Undefined; - if (results.All(x => x == ResultType.Vector)) - return ResultType.Matrix; + for (var i = 0; i < results.Count; i++) + if (results[i] != ResultType.Number) + throw new DifferentParameterTypeMismatchException(ResultType.Vector, results[i], i); - throw new ParameterTypeMismatchException(); + return ResultType.Matrix; } /// @@ -655,7 +671,7 @@ public virtual ResultType Analyze(Determinant exp) if (result == ResultType.Matrix) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Matrix, result); } /// @@ -672,7 +688,7 @@ public virtual ResultType Analyze(Inverse exp) if (result == ResultType.Matrix) return ResultType.Matrix; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Matrix, result); } /// @@ -689,7 +705,7 @@ public virtual ResultType Analyze(Transpose exp) if (result == ResultType.Vector || result == ResultType.Matrix) return ResultType.Matrix; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.Vector | ResultType.Matrix, result); } #endregion Matrix @@ -720,7 +736,7 @@ public virtual ResultType Analyze(Conjugate exp) if (result == ResultType.ComplexNumber) return ResultType.ComplexNumber; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.ComplexNumber, result); } /// @@ -737,7 +753,7 @@ public virtual ResultType Analyze(Im exp) if (result == ResultType.ComplexNumber) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.ComplexNumber, result); } /// @@ -754,7 +770,7 @@ public virtual ResultType Analyze(Phase exp) if (result == ResultType.ComplexNumber) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.ComplexNumber, result); } /// @@ -771,7 +787,7 @@ public virtual ResultType Analyze(Re exp) if (result == ResultType.ComplexNumber) return ResultType.Number; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.ComplexNumber, result); } /// @@ -788,7 +804,7 @@ public virtual ResultType Analyze(Reciprocal exp) if (result == ResultType.ComplexNumber) return ResultType.ComplexNumber; - throw new ParameterTypeMismatchException(); + throw new ParameterTypeMismatchException(ResultType.ComplexNumber, result); } #endregion Complex Numbers