12 Commits
0.2.3 ... Main

19 changed files with 288 additions and 124 deletions

13
.idea/.idea.VAR.ExpressionEvaluator/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/.idea.VAR.ExpressionEvaluator.iml
/modules.xml
/contentModel.xml
/projectSettingsUpdater.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2019-2020 Valeriano Alfonso Rodriguez Copyright (c) 2019-2021 Valeriano Alfonso Rodriguez
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -241,6 +241,19 @@ namespace VAR.ExpressionEvaluator.Tests
Assert.Equal(4m, result); Assert.Equal(4m, result);
} }
[Fact]
public void Functions__ZeroParameters()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetFunction("constant", (parameters) =>
{
return 9m;
});
string expression = "constant()";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.Equal(9m, result);
}
#endregion Functions #endregion Functions
#region Strings #region Strings
@@ -253,6 +266,14 @@ namespace VAR.ExpressionEvaluator.Tests
Assert.Equal("Hello World", result); Assert.Equal("Hello World", result);
} }
[Fact]
public void Strings__Contatenate_Hello_World_SimpleQuotes()
{
string expression = "'Hello' + ' ' +'World'";
object result = Parser.EvaluateString(expression);
Assert.Equal("Hello World", result);
}
[Fact] [Fact]
public void Strings__Contatenate_Hello_World_WithVariables() public void Strings__Contatenate_Hello_World_WithVariables()
{ {
@@ -495,6 +516,46 @@ namespace VAR.ExpressionEvaluator.Tests
Assert.False((bool?)result); Assert.False((bool?)result);
} }
[Fact()]
public void Relations__Var1NullEquals666_EqualsFalse()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", null);
string expression = "v1 = 666";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.False((bool?)result);
}
[Fact()]
public void Relations__Var1NullEqualsStringHello_EqualsFalse()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", null);
string expression = "v1 = \"Hello\"";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.False((bool?)result);
}
[Fact()]
public void Relations__Var1666Equals666_EqualsFalse()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", 666);
string expression = "v1 = 666";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.True((bool?)result);
}
[Fact()]
public void Relations__Var1HelloEqualsStringHello_EqualsFalse()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", "Hello");
string expression = "v1 = \"Hello\"";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.True((bool?)result);
}
#endregion Relations #endregion Relations
#region BooleanOps #region BooleanOps
@@ -507,6 +568,11 @@ namespace VAR.ExpressionEvaluator.Tests
Assert.False((bool?)Parser.EvaluateString("true and false")); Assert.False((bool?)Parser.EvaluateString("true and false"));
Assert.True((bool?)Parser.EvaluateString("true and true")); Assert.True((bool?)Parser.EvaluateString("true and true"));
Assert.False((bool?)Parser.EvaluateString("False And False"));
Assert.False((bool?)Parser.EvaluateString("False And True"));
Assert.False((bool?)Parser.EvaluateString("True And False"));
Assert.True((bool?)Parser.EvaluateString("True And True"));
Assert.False((bool?)Parser.EvaluateString("false && false")); Assert.False((bool?)Parser.EvaluateString("false && false"));
Assert.False((bool?)Parser.EvaluateString("false && true")); Assert.False((bool?)Parser.EvaluateString("false && true"));
Assert.False((bool?)Parser.EvaluateString("true && false")); Assert.False((bool?)Parser.EvaluateString("true && false"));
@@ -521,6 +587,11 @@ namespace VAR.ExpressionEvaluator.Tests
Assert.True((bool?)Parser.EvaluateString("true or false")); Assert.True((bool?)Parser.EvaluateString("true or false"));
Assert.True((bool?)Parser.EvaluateString("true or true")); Assert.True((bool?)Parser.EvaluateString("true or true"));
Assert.False((bool?)Parser.EvaluateString("False Or False"));
Assert.True((bool?)Parser.EvaluateString("False Or True"));
Assert.True((bool?)Parser.EvaluateString("True Or False"));
Assert.True((bool?)Parser.EvaluateString("True Or True"));
Assert.False((bool?)Parser.EvaluateString("false || false")); Assert.False((bool?)Parser.EvaluateString("false || false"));
Assert.True((bool?)Parser.EvaluateString("false || true")); Assert.True((bool?)Parser.EvaluateString("false || true"));
Assert.True((bool?)Parser.EvaluateString("true || false")); Assert.True((bool?)Parser.EvaluateString("true || false"));
@@ -537,7 +608,6 @@ namespace VAR.ExpressionEvaluator.Tests
Assert.False((bool?)Parser.EvaluateString("not true")); Assert.False((bool?)Parser.EvaluateString("not true"));
} }
#endregion BooleanOps #endregion BooleanOps
#region Null value #region Null value
@@ -581,7 +651,41 @@ namespace VAR.ExpressionEvaluator.Tests
#endregion #endregion
#region Excepctions #region String coercions
[Fact()]
public void StringCoercions__Var1NullEqualsStringEmpty_EqualsTrue()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", null);
string expression = "v1 = \"\"";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.True((bool?)result);
}
[Fact()]
public void StringCoercions__Var1TrueStringEqualsTrue_EqualsTrue()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", "True");
string expression = "v1 = true";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.True((bool?)result);
}
[Fact()]
public void StringCoercions__Var1FalseStringEqualsFalse_EqualsTrue()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("v1", "False");
string expression = "v1 = false";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.True((bool?)result);
}
#endregion String coercions
#region Exceptions
[Fact] [Fact]
public void Exceptions__HelloAtEnd__UnexpectedCharactersAtEndException() public void Exceptions__HelloAtEnd__UnexpectedCharactersAtEndException()
@@ -765,6 +869,33 @@ 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);
}
[Fact()]
public void Misc__ProductWithStringDecimals_EqualsFalse()
{
EvaluationContext evaluationContex = new EvaluationContext();
evaluationContex.SetVariable("$1109", "1933");
evaluationContex.SetVariable("$1150", "02.00000");
string expression = "$1109 * $1150";
object result = Parser.EvaluateString(expression, evaluationContex);
Assert.Equal(3866.00000M, result);
}
#endregion Misc #endregion Misc
} }
} }

View File

@@ -48,7 +48,7 @@ namespace VAR.ExpressionEvaluator
{ {
value = ((DateTime)value).ToString("s"); value = ((DateTime)value).ToString("s");
} }
if ((value is string) == false && (value is bool) == false) if ((value is string) == false && (value is bool) == false && value != null)
{ {
value = Convert.ToDecimal(value); value = Convert.ToDecimal(value);
} }

View File

@@ -18,7 +18,7 @@ namespace VAR.ExpressionEvaluator
if (leftValue is string) if (leftValue is string)
{ {
if (decimal.TryParse((string)leftValue, out decimal dec) == false) if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
} }
@@ -26,7 +26,7 @@ namespace VAR.ExpressionEvaluator
} }
if (rightValue is string) if (rightValue is string)
{ {
if (decimal.TryParse((string)rightValue, out decimal dec) == false) if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
} }

View File

@@ -1,6 +1,4 @@
using System; namespace VAR.ExpressionEvaluator
namespace VAR.ExpressionEvaluator
{ {
public class ExpressionEqualsNode : ExpressionBinaryNode public class ExpressionEqualsNode : ExpressionBinaryNode
{ {
@@ -9,44 +7,17 @@ namespace VAR.ExpressionEvaluator
{ {
} }
private static object EqualsOp(object leftValue, object rightValue) public static object EqualsOp(object leftValue, object rightValue)
{ {
if (leftValue is string && rightValue is string) // Null
if (leftValue is string && string.IsNullOrEmpty(leftValue as string))
{ {
return string.Compare((string)leftValue, (string)rightValue) == 0; leftValue = null;
} }
if (rightValue is string && string.IsNullOrEmpty(rightValue as string))
if (leftValue is string)
{ {
if (string.IsNullOrEmpty((string)leftValue)) rightValue = null;
{
leftValue = null;
}
else
{
if (decimal.TryParse((string)leftValue, out decimal dec) == false)
{
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
}
leftValue = dec;
}
} }
if (rightValue is string)
{
if (string.IsNullOrEmpty((string)rightValue))
{
leftValue = null;
}
else
{
if (decimal.TryParse((string)rightValue, out decimal dec) == false)
{
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
}
rightValue = dec;
}
}
if (leftValue == null && rightValue == null) if (leftValue == null && rightValue == null)
{ {
return true; return true;
@@ -56,11 +27,85 @@ namespace VAR.ExpressionEvaluator
return false; return false;
} }
// String
if (leftValue is string && rightValue is string)
{
return string.Compare((string)leftValue, (string)rightValue) == 0;
}
// Bool
if (leftValue is bool || rightValue is bool)
{
bool? leftBool = ConvertToNullableBool(leftValue);
bool? rightBool = ConvertToNullableBool(rightValue);
return leftBool == rightBool;
}
// Decimal
if (leftValue is string)
{
if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{
leftValue = null;
}
else
{
leftValue = dec;
}
}
if (rightValue is string)
{
if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{
rightValue = null;
}
else
{
rightValue = dec;
}
}
if ((leftValue is decimal) == false || (rightValue is decimal) == false) if ((leftValue is decimal) == false || (rightValue is decimal) == false)
{ {
throw new Exception("Can't compare non decimal values"); return false;
} }
return (decimal)leftValue == (decimal)rightValue; return (decimal)leftValue == (decimal)rightValue;
} }
private static bool? ConvertToNullableBool(object value)
{
if (value is bool)
{
return (bool)value;
}
if (value is string)
{
string text = value as string;
if (string.IsNullOrEmpty(text))
{
return null;
}
decimal decValue;
if (decimal.TryParse(text, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decValue))
{
return decValue != 0;
}
string textLower = text.ToLower();
if (textLower == "false" || textLower == "no" || textLower == "ez" || textLower == "non" || textLower == "nein")
{
return false;
}
if (textLower == "true" || textLower == "si" || textLower == "sí" || textLower == "yes" || textLower == "bai" || textLower == "oui" || textLower == "ja")
{
return true;
}
return null;
}
if (value is decimal)
{
return ((decimal)value) != 0;
}
return false;
}
} }
} }

View File

@@ -24,7 +24,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)leftValue, out decimal dec) == false) if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
} }
@@ -39,7 +39,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)rightValue, out decimal dec) == false) if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
} }

View File

@@ -24,7 +24,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)leftValue, out decimal dec) == false) if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
} }
@@ -39,7 +39,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)rightValue, out decimal dec) == false) if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
} }

View File

@@ -24,7 +24,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)leftValue, out decimal dec) == false) if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
} }
@@ -39,7 +39,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)rightValue, out decimal dec) == false) if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
} }

View File

@@ -24,7 +24,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)leftValue, out decimal dec) == false) if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
} }
@@ -39,7 +39,7 @@ namespace VAR.ExpressionEvaluator
} }
else else
{ {
if (decimal.TryParse((string)rightValue, out decimal dec) == false) if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
} }

View File

@@ -18,7 +18,7 @@ namespace VAR.ExpressionEvaluator
if (leftValue is string) if (leftValue is string)
{ {
if (decimal.TryParse((string)leftValue, out decimal dec) == false) if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
} }
@@ -26,7 +26,7 @@ namespace VAR.ExpressionEvaluator
} }
if (rightValue is string) if (rightValue is string)
{ {
if (decimal.TryParse((string)rightValue, out decimal dec) == false) if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
} }

View File

@@ -18,7 +18,7 @@ namespace VAR.ExpressionEvaluator
if (leftValue is string) if (leftValue is string)
{ {
if (decimal.TryParse((string)leftValue, out decimal dec) == false) if (decimal.TryParse((string)leftValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
} }
@@ -26,7 +26,7 @@ namespace VAR.ExpressionEvaluator
} }
if (rightValue is string) if (rightValue is string)
{ {
if (decimal.TryParse((string)rightValue, out decimal dec) == false) if (decimal.TryParse((string)rightValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
} }

View File

@@ -1,6 +1,4 @@
using System; namespace VAR.ExpressionEvaluator
namespace VAR.ExpressionEvaluator
{ {
public class ExpressionNotEqualsNode : ExpressionBinaryNode public class ExpressionNotEqualsNode : ExpressionBinaryNode
{ {
@@ -11,56 +9,8 @@ namespace VAR.ExpressionEvaluator
private static object NotEqualsOp(object leftValue, object rightValue) private static object NotEqualsOp(object leftValue, object rightValue)
{ {
if (leftValue is string && rightValue is string) bool result = (bool)ExpressionEqualsNode.EqualsOp(leftValue, rightValue);
{ return !result;
return string.Compare((string)leftValue, (string)rightValue) != 0;
}
if (leftValue is string)
{
if (string.IsNullOrEmpty((string)leftValue))
{
leftValue = null;
}
else
{
if (decimal.TryParse((string)leftValue, out decimal dec) == false)
{
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)leftValue));
}
leftValue = dec;
}
}
if (rightValue is string)
{
if (string.IsNullOrEmpty((string)rightValue))
{
leftValue = null;
}
else
{
if (decimal.TryParse((string)rightValue, out decimal dec) == false)
{
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)rightValue));
}
rightValue = dec;
}
}
if (leftValue == null && rightValue == null)
{
return false;
}
if (leftValue == null || rightValue == null)
{
return true;
}
if ((leftValue is decimal) == false || (rightValue is decimal) == false)
{
throw new Exception("Can't compare non decimal values");
}
return (decimal)leftValue != (decimal)rightValue;
} }
} }
} }

View File

@@ -18,7 +18,7 @@ namespace VAR.ExpressionEvaluator
if (value is string) if (value is string)
{ {
if (decimal.TryParse((string)value, out decimal dec) == false) if (decimal.TryParse((string)value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out decimal dec) == false)
{ {
throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)value)); throw new Exception(string.Format("Can't convert to decimal string value \"{0}\"", (string)value));
} }

View File

@@ -32,7 +32,7 @@ namespace VAR.ExpressionEvaluator
#region Creator #region Creator
private ITokenizer _tokenizer; private readonly ITokenizer _tokenizer;
public Parser(ITokenizer tokenizer) public Parser(ITokenizer tokenizer)
{ {
@@ -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,6 +84,13 @@ namespace VAR.ExpressionEvaluator
IExpressionNode rightNode = ParsePlusAndMinus(); IExpressionNode rightNode = ParsePlusAndMinus();
leftNode = new ExpressionEqualsNode(leftNode, rightNode); leftNode = new ExpressionEqualsNode(leftNode, rightNode);
} }
else if (_tokenizer.Token == Token.ExclusiveEquals)
{
// TODO: Implement ExpressionExclusiveEqualsNode
_tokenizer.NextToken();
IExpressionNode rightNode = ParsePlusAndMinus();
leftNode = new ExpressionEqualsNode(leftNode, rightNode);
}
else if (_tokenizer.Token == Token.NotEquals) else if (_tokenizer.Token == Token.NotEquals)
{ {
_tokenizer.NextToken(); _tokenizer.NextToken();
@@ -232,15 +239,18 @@ namespace VAR.ExpressionEvaluator
{ {
_tokenizer.NextToken(); _tokenizer.NextToken();
var parameters = new List<IExpressionNode>(); var parameters = new List<IExpressionNode>();
while (true) if (_tokenizer.Token != Token.ParenthesisEnd)
{ {
parameters.Add(ParseBooleanOp()); while (true)
if (_tokenizer.Token == Token.Comma)
{ {
_tokenizer.NextToken(); parameters.Add(ParseBooleanOp());
continue; if (_tokenizer.Token == Token.Comma)
{
_tokenizer.NextToken();
continue;
}
break;
} }
break;
} }
if (_tokenizer.Token != Token.ParenthesisEnd) if (_tokenizer.Token != Token.ParenthesisEnd)
{ {

View File

@@ -8,23 +8,20 @@
<PropertyGroup> <PropertyGroup>
<PackageId>VAR.ExpressionEvaluator</PackageId> <PackageId>VAR.ExpressionEvaluator</PackageId>
<Title>VAR.ExpressionEvaluator</Title> <Title>VAR.ExpressionEvaluator</Title>
<Version>0.2.3</Version> <Version>0.2.8</Version>
<Description>Expression Evaluation Library</Description> <Description>Expression Evaluation Library</Description>
<Authors>VAR</Authors> <Authors>VAR</Authors>
<Company>VAR</Company> <Company>VAR</Company>
<Copyright>Copyright © VAR 2019-2020</Copyright> <Copyright>Copyright © VAR 2019-2021</Copyright>
<RequireLicenseAcceptance>false</RequireLicenseAcceptance> <RequireLicenseAcceptance>false</RequireLicenseAcceptance>
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile> <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
<PackageProjectUrl>https://github.com/Kableado/VAR.ExpressionEvaluator</PackageProjectUrl> <PackageProjectUrl>https://github.com/Kableado/VAR.ExpressionEvaluator</PackageProjectUrl>
<PackageTags>Expression;Evaluation;Expression Evaluation</PackageTags> <PackageTags>Expression;Evaluation;Expression Evaluation</PackageTags>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Content Include="..\LICENSE.txt" Link="LICENSE.txt" Pack="true" PackagePath=""/> <Content Include="..\LICENSE.txt" Link="LICENSE.txt" Pack="true" PackagePath="" />
</ItemGroup> </ItemGroup>
<Target Name="CopyPackage" AfterTargets="Pack"> <Target Name="CopyPackage" AfterTargets="Pack">
<Copy <Copy SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg" DestinationFolder="Nuget\" />
SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg"
DestinationFolder="Nuget\"
/>
</Target> </Target>
</Project> </Project>