Skip to content

Commit 3565d9b

Browse files
committed
chained different custom left operand only operators OK
1 parent 76963c0 commit 3565d9b

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

CodingSeb.ExpressionEvaluator.Tests/ExpressionEvaluatorTests.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2165,14 +2165,41 @@ void Evaluator_PreEvaluateVariable(object sender, VariablePreEvaluationEventArg
21652165
.SetCategory("inherits ExpressionEvaluator")
21662166
.SetCategory("Custom operators");
21672167

2168-
21692168
yield return new TestCaseData(xExpressionEvaluator2
21702169
, "2## + +-+-~+1", null)
21712170
.Returns(-0.58578643762690485d)
21722171
.SetCategory("ExpressionEvaluator extend")
21732172
.SetCategory("inherits ExpressionEvaluator")
21742173
.SetCategory("Custom operators");
21752174

2175+
yield return new TestCaseData(xExpressionEvaluator2
2176+
, "2#°", null)
2177+
.Returns(0.70710678118654757d)
2178+
.SetCategory("ExpressionEvaluator extend")
2179+
.SetCategory("inherits ExpressionEvaluator")
2180+
.SetCategory("Custom operators");
2181+
2182+
yield return new TestCaseData(xExpressionEvaluator2
2183+
, "2°#", null)
2184+
.Returns(0.00390625d)
2185+
.SetCategory("ExpressionEvaluator extend")
2186+
.SetCategory("inherits ExpressionEvaluator")
2187+
.SetCategory("Custom operators");
2188+
2189+
yield return new TestCaseData(xExpressionEvaluator2
2190+
, "2#° + +-+-~+1", null)
2191+
.Returns(-1.2928932188134525d)
2192+
.SetCategory("ExpressionEvaluator extend")
2193+
.SetCategory("inherits ExpressionEvaluator")
2194+
.SetCategory("Custom operators");
2195+
2196+
yield return new TestCaseData(xExpressionEvaluator2
2197+
, "2°# + +-+-~+1", null)
2198+
.Returns(-1.99609375d)
2199+
.SetCategory("ExpressionEvaluator extend")
2200+
.SetCategory("inherits ExpressionEvaluator")
2201+
.SetCategory("Custom operators");
2202+
21762203
yield return new TestCaseData(xExpressionEvaluator2
21772204
, "1 love 2", null)
21782205
.Returns(6)

CodingSeb.ExpressionEvaluator.Tests/TestsUtils/XExpressionEvaluator2.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ public class XExpressionEvaluator2 : ExpressionEvaluator
99
protected new static readonly IList<ExpressionOperator> leftOperandOnlyOperatorsEvaluationDictionary =
1010
ExpressionEvaluator.leftOperandOnlyOperatorsEvaluationDictionary
1111
.ToList()
12-
.FluidAdd(XExpressionOperator2.Sharp);
12+
.FluidAdd(XExpressionOperator2.Sharp)
13+
.FluidAdd(XExpressionOperator2.Degree);
1314

1415
//protected new static readonly IList<ExpressionOperator> rightOperandOnlyOperatorsEvaluationDictionary =
1516
// ExpressionEvaluator.rightOperandOnlyOperatorsEvaluationDictionary
@@ -19,6 +20,7 @@ public class XExpressionEvaluator2 : ExpressionEvaluator
1920
ExpressionEvaluator.operatorsEvaluations
2021
.Copy()
2122
.AddOperatorEvaluationAtNewLevelAfter(XExpressionOperator2.Sharp, (left, _) => Math.Pow(left, -left), ExpressionOperator.Cast)
23+
.AddOperatorEvaluationAtNewLevelAfter(XExpressionOperator2.Degree, (left, _) => Math.Pow(left, left), ExpressionOperator.Cast)
2224
.AddOperatorEvaluationAtLevelOf(XExpressionOperator2.Love, (left, right) => (left | right) << 1, ExpressionOperator.ShiftBitsLeft);
2325

2426
protected override IList<ExpressionOperator> LeftOperandOnlyOperatorsEvaluationDictionary => leftOperandOnlyOperatorsEvaluationDictionary;
@@ -30,6 +32,7 @@ public class XExpressionEvaluator2 : ExpressionEvaluator
3032
protected override void Init()
3133
{
3234
operatorsDictionary.Add("#", XExpressionOperator2.Sharp);
35+
operatorsDictionary.Add("°", XExpressionOperator2.Degree);
3336
operatorsDictionary.Add("love", XExpressionOperator2.Love);
3437
operatorsDictionary.Add("Not", ExpressionOperator.LogicalNegation);
3538
}
@@ -38,6 +41,7 @@ protected override void Init()
3841
public class XExpressionOperator2 : ExpressionOperator
3942
{
4043
public static readonly ExpressionOperator Sharp = new XExpressionOperator2();
44+
public static readonly ExpressionOperator Degree = new XExpressionOperator2();
4145
public static readonly ExpressionOperator Love = new XExpressionOperator2();
4246
}
4347
}

CodingSeb.ExpressionEvaluator/ExpressionEvaluator.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2999,6 +2999,20 @@ void EvaluateFirstNextUnaryOp(int j, ref int parentIndex)
29992999
{
30003000
try
30013001
{
3002+
void EvaluateFirstPreviousUnaryOp(int j)
3003+
{
3004+
if (j < list.Count - 1 && list[j] is ExpressionOperator previousOp && LeftOperandOnlyOperatorsEvaluationDictionary.Contains(previousOp))
3005+
{
3006+
EvaluateFirstPreviousUnaryOp(j + 1);
3007+
3008+
list[j] = OperatorsEvaluations.FirstOrDefault(od => od.ContainsKey(previousOp))?[previousOp]((dynamic)list[j + 1], null);
3009+
3010+
list.RemoveAt(j + 1);
3011+
}
3012+
}
3013+
3014+
EvaluateFirstPreviousUnaryOp(i + 1);
3015+
30023016
list[i] = operatorEvalutationsDict[eOp]((dynamic)list[i + 1], null);
30033017
}
30043018
catch (Exception ex)

0 commit comments

Comments
 (0)