From 2dc0ed7ba317a2b6771b0225a0717c24ea129a36 Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Mon, 2 Dec 2019 12:05:56 +0100 Subject: [PATCH] Parser: Fix recursion bug. --- VAR.ExpressionEvaluator.Tests/ParserTests.cs | 27 ++++++++++++++++++-- VAR.ExpressionEvaluator/Parser.cs | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/VAR.ExpressionEvaluator.Tests/ParserTests.cs b/VAR.ExpressionEvaluator.Tests/ParserTests.cs index 0c8e785..0690896 100644 --- a/VAR.ExpressionEvaluator.Tests/ParserTests.cs +++ b/VAR.ExpressionEvaluator.Tests/ParserTests.cs @@ -1,6 +1,6 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; +using System; using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; namespace VAR.ExpressionEvaluator.Tests { @@ -199,6 +199,29 @@ namespace VAR.ExpressionEvaluator.Tests Assert.AreEqual(10m, result); } + [TestMethod()] + public void Functions__NestedTest() + { + EvaluationContext evaluationContex = new EvaluationContext(); + evaluationContex.SetVariable("linea1", 1); + evaluationContex.SetVariable("linea2", 1); + evaluationContex.SetVariable("linea4", 4); + evaluationContex.SetFunction("iif", (parameters) => + { + if (((bool)parameters[0]) == true) + { + return parameters[1]; + } + else + { + return parameters[2]; + } + }); + string expression = "iif(linea1>linea2,iif(linea1>linea4, linea1, iif(linea4>linea2,linea4,linea2)),iif(linea2>linea4,linea2,linea4))"; + object result = Parser.EvaluateString(expression, evaluationContex); + Assert.AreEqual(4m, result); + } + #endregion Functions #region Strings diff --git a/VAR.ExpressionEvaluator/Parser.cs b/VAR.ExpressionEvaluator/Parser.cs index fa03e96..9d9fd31 100644 --- a/VAR.ExpressionEvaluator/Parser.cs +++ b/VAR.ExpressionEvaluator/Parser.cs @@ -211,7 +211,7 @@ namespace VAR.ExpressionEvaluator var parameters = new List(); while (true) { - parameters.Add(ParsePlusAndMinus()); + parameters.Add(ParseBooleanOp()); if (_tokenizer.Token == Token.Comma) { _tokenizer.NextToken();