Parser: Parse number negation.
This commit is contained in:
@@ -36,5 +36,46 @@ namespace VAR.ExpressionEvaluator.Tests
|
||||
object result = Parser.EvaluateString(expression);
|
||||
Assert.AreEqual(900000m, result);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
public void ParseString__MinusTen()
|
||||
{
|
||||
string expression = "-10";
|
||||
object result = Parser.EvaluateString(expression);
|
||||
Assert.AreEqual(-10m, result);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
public void ParseString__PlusTen()
|
||||
{
|
||||
string expression = "+10";
|
||||
object result = Parser.EvaluateString(expression);
|
||||
Assert.AreEqual(10m, result);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
public void ParseString__MinusMinusTen()
|
||||
{
|
||||
string expression = "--10";
|
||||
object result = Parser.EvaluateString(expression);
|
||||
Assert.AreEqual(10m, result);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
public void ParseString__MinusPlusChainTen()
|
||||
{
|
||||
string expression = "--++-+-10";
|
||||
object result = Parser.EvaluateString(expression);
|
||||
Assert.AreEqual(10m, result);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
public void ParseString__10Minus20Minus30()
|
||||
{
|
||||
string expression = "10 + -20 - +30";
|
||||
object result = Parser.EvaluateString(expression);
|
||||
Assert.AreEqual(-40m, result);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
15
VAR.ExpressionEvaluator/ExpressionNumberNegateNode.cs
Normal file
15
VAR.ExpressionEvaluator/ExpressionNumberNegateNode.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
namespace VAR.ExpressionEvaluator
|
||||
{
|
||||
public class ExpressionNumberNegateNode : ExpressionUnaryNode
|
||||
{
|
||||
public ExpressionNumberNegateNode(IExpressionNode node) :
|
||||
base(node, NumberNegateOp)
|
||||
{
|
||||
}
|
||||
|
||||
private static object NumberNegateOp(object value)
|
||||
{
|
||||
return - (decimal)value;
|
||||
}
|
||||
}
|
||||
}
|
||||
24
VAR.ExpressionEvaluator/ExpressionUnaryNode.cs
Normal file
24
VAR.ExpressionEvaluator/ExpressionUnaryNode.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
|
||||
namespace VAR.ExpressionEvaluator
|
||||
{
|
||||
public class ExpressionUnaryNode : IExpressionNode
|
||||
{
|
||||
private IExpressionNode _node;
|
||||
private readonly Func<object, object> _operation;
|
||||
|
||||
public ExpressionUnaryNode(IExpressionNode node, Func<object, object> operation)
|
||||
{
|
||||
_node = node;
|
||||
_operation = operation;
|
||||
}
|
||||
|
||||
public object Eval()
|
||||
{
|
||||
object value = _node.Eval();
|
||||
|
||||
object result = _operation(value);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,19 +26,19 @@ namespace VAR.ExpressionEvaluator
|
||||
|
||||
public IExpressionNode ParsePlusAndMinus()
|
||||
{
|
||||
IExpressionNode leftNode = ParseTerminus();
|
||||
IExpressionNode leftNode = ParseUnary();
|
||||
while (true)
|
||||
{
|
||||
if (_tokenizer.Token == Token.Plus)
|
||||
{
|
||||
_tokenizer.NextToken();
|
||||
IExpressionNode rightNode = ParseTerminus();
|
||||
IExpressionNode rightNode = ParseUnary();
|
||||
leftNode = new ExpressionPlusNode(leftNode, rightNode);
|
||||
}
|
||||
else if (_tokenizer.Token == Token.Minus)
|
||||
{
|
||||
_tokenizer.NextToken();
|
||||
IExpressionNode rightNode = ParseTerminus();
|
||||
IExpressionNode rightNode = ParseUnary();
|
||||
leftNode = new ExpressionMinusNode(leftNode, rightNode);
|
||||
}
|
||||
else
|
||||
@@ -48,6 +48,22 @@ namespace VAR.ExpressionEvaluator
|
||||
}
|
||||
}
|
||||
|
||||
private IExpressionNode ParseUnary()
|
||||
{
|
||||
if (_tokenizer.Token == Token.Plus)
|
||||
{
|
||||
_tokenizer.NextToken();
|
||||
return ParseUnary();
|
||||
}
|
||||
if (_tokenizer.Token == Token.Minus)
|
||||
{
|
||||
_tokenizer.NextToken();
|
||||
var node = ParseUnary();
|
||||
return new ExpressionNumberNegateNode(node);
|
||||
}
|
||||
return ParseTerminus();
|
||||
}
|
||||
|
||||
private IExpressionNode ParseTerminus()
|
||||
{
|
||||
if (_tokenizer.Token == Token.Number)
|
||||
|
||||
@@ -41,8 +41,10 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ExpressionUnaryNode.cs" />
|
||||
<Compile Include="ExpressionBinaryNode.cs" />
|
||||
<Compile Include="ExpressionMinusNode.cs" />
|
||||
<Compile Include="ExpressionNumberNegateNode.cs" />
|
||||
<Compile Include="ExpressionPlusNode.cs" />
|
||||
<Compile Include="ExpressionStringNode.cs" />
|
||||
<Compile Include="ExpressionNumberNode.cs" />
|
||||
|
||||
Reference in New Issue
Block a user