From ad9e3e6bad7b0d918eb77784bfeb3465710e9a5c Mon Sep 17 00:00:00 2001 From: Valeriano Alfonso Rodriguez Date: Thu, 14 Oct 2021 20:07:36 +0200 Subject: [PATCH] Parser.ParseBooleanOp: Parse failure with multiple "And" "Or" chained --- VAR.ExpressionEvaluator.Tests/ParserTests.cs | 18 +++++++++++++++++- VAR.ExpressionEvaluator/Parser.cs | 4 ++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/VAR.ExpressionEvaluator.Tests/ParserTests.cs b/VAR.ExpressionEvaluator.Tests/ParserTests.cs index d8574b1..c142532 100644 --- a/VAR.ExpressionEvaluator.Tests/ParserTests.cs +++ b/VAR.ExpressionEvaluator.Tests/ParserTests.cs @@ -664,7 +664,7 @@ namespace VAR.ExpressionEvaluator.Tests #endregion String coercions - #region Excepctions + #region Exceptions [Fact] public void Exceptions__HelloAtEnd__UnexpectedCharactersAtEndException() @@ -848,6 +848,22 @@ namespace VAR.ExpressionEvaluator.Tests } + #endregion Exceptions + + #region Misc + + [Fact()] + public void Misc__MixedExpression_EqualsFalse() + { + EvaluationContext evaluationContex = new EvaluationContext(); + evaluationContex.SetVariable("QI_86", null); + evaluationContex.SetVariable("QI_87", null); + evaluationContex.SetVariable("QI_104", null); + string expression = "( QI_86 = 0 Or QI_86 = null ) And ( QI_87 = 0 Or QI_87 = null ) And QI_104 > 0"; + object result = Parser.EvaluateString(expression, evaluationContex); + Assert.False((bool?)result); + } + #endregion Misc } } \ No newline at end of file diff --git a/VAR.ExpressionEvaluator/Parser.cs b/VAR.ExpressionEvaluator/Parser.cs index 81be887..055a089 100644 --- a/VAR.ExpressionEvaluator/Parser.cs +++ b/VAR.ExpressionEvaluator/Parser.cs @@ -60,7 +60,7 @@ namespace VAR.ExpressionEvaluator IExpressionNode rightNode = ParseRelations(); leftNode = new ExpressionBooleanAndNode(leftNode, rightNode); } - if (_tokenizer.Token == Token.Or) + else if (_tokenizer.Token == Token.Or) { _tokenizer.NextToken(); IExpressionNode rightNode = ParseRelations(); @@ -84,7 +84,7 @@ namespace VAR.ExpressionEvaluator IExpressionNode rightNode = ParsePlusAndMinus(); leftNode = new ExpressionEqualsNode(leftNode, rightNode); } - if (_tokenizer.Token == Token.ExclusiveEquals) + else if (_tokenizer.Token == Token.ExclusiveEquals) { // TODO: Implement ExpressionExclusiveEqualsNode _tokenizer.NextToken();