Parser.ParseBooleanOp: Parse failure with multiple "And" "Or" chained

This commit is contained in:
2021-10-14 20:07:36 +02:00
parent 953a9340cc
commit ad9e3e6bad
2 changed files with 19 additions and 3 deletions

View File

@@ -664,7 +664,7 @@ namespace VAR.ExpressionEvaluator.Tests
#endregion String coercions #endregion String coercions
#region Excepctions #region Exceptions
[Fact] [Fact]
public void Exceptions__HelloAtEnd__UnexpectedCharactersAtEndException() 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 #endregion Misc
} }
} }

View File

@@ -60,7 +60,7 @@ namespace VAR.ExpressionEvaluator
IExpressionNode rightNode = ParseRelations(); IExpressionNode rightNode = ParseRelations();
leftNode = new ExpressionBooleanAndNode(leftNode, rightNode); leftNode = new ExpressionBooleanAndNode(leftNode, rightNode);
} }
if (_tokenizer.Token == Token.Or) else if (_tokenizer.Token == Token.Or)
{ {
_tokenizer.NextToken(); _tokenizer.NextToken();
IExpressionNode rightNode = ParseRelations(); IExpressionNode rightNode = ParseRelations();
@@ -84,7 +84,7 @@ namespace VAR.ExpressionEvaluator
IExpressionNode rightNode = ParsePlusAndMinus(); IExpressionNode rightNode = ParsePlusAndMinus();
leftNode = new ExpressionEqualsNode(leftNode, rightNode); leftNode = new ExpressionEqualsNode(leftNode, rightNode);
} }
if (_tokenizer.Token == Token.ExclusiveEquals) else if (_tokenizer.Token == Token.ExclusiveEquals)
{ {
// TODO: Implement ExpressionExclusiveEqualsNode // TODO: Implement ExpressionExclusiveEqualsNode
_tokenizer.NextToken(); _tokenizer.NextToken();