Skip to content

Commit

Permalink
Added support for parentheses
Browse files Browse the repository at this point in the history
  • Loading branch information
Giorgi committed Feb 27, 2012
1 parent f1017a7 commit 46d4b41
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
12 changes: 12 additions & 0 deletions SimpleExpressionEvaluator.Tests/ExpressionEvaluatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,17 @@ public void Can_Add_Subtract_Multiply_Divide_Multiple_Numbers()
Assert.That(engine.Evaluate("25/3+1.34*2.56+1.49+2.36/1.48"), Is.EqualTo(25 / 3m + 1.34m * 2.56m + 1.49m + 2.36m / 1.48m));
Assert.That(engine.Evaluate("2*3+5-4-2*5+7"), Is.EqualTo(2 * 3 + 5 - 4 - 2 * 5 + 7));
}

[Test]
public void Supports_Parentheses()
{
Assert.That(engine.Evaluate("2*(5+3)"), Is.EqualTo(2 * (5 + 3)));
Assert.That(engine.Evaluate("(5+3)*2"), Is.EqualTo((5 + 3) * 2));
Assert.That(engine.Evaluate("(5+3)*5-2"), Is.EqualTo((5 + 3) * 5 - 2));
Assert.That(engine.Evaluate("(5+3)*(5-2)"), Is.EqualTo((5 + 3) * (5 - 2)));
Assert.That(engine.Evaluate("((5+3)*3-(8-2)/2)/2"), Is.EqualTo(((5 + 3) * 3 - (8 - 2) / 2) / 2m));
Assert.That(engine.Evaluate("(4*(3+5)-4-8/2-(6-4)/2)*((2+4)*4-(8-5)/3)-5"), Is.EqualTo((4 * (3 + 5) - 4 - 8 / 2 - (6 - 4) / 2) * ((2 + 4) * 4 - (8 - 5) / 3) - 5));
Assert.That(engine.Evaluate("(((9-6/2)*2-4)/2-6-1)/(2+24/(2+4))"), Is.EqualTo((((9 - 6 / 2) * 2 - 4) / 2m - 6 - 1) / (2 + 24 / (2 + 4))));
}
}
}
17 changes: 16 additions & 1 deletion SimpleExpressionEvaluator/ExpressionEvaluator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,28 @@ public decimal Evaluate(string expression)
{
var currentOperation = ReadOperation(reader);

EvaluateWhile(() => operatorStack.Count > 0 &&
EvaluateWhile(() => operatorStack.Count > 0 && operatorStack.Peek() != '(' &&
currentOperation.Precedence <= ((Operation)operatorStack.Peek()).Precedence);

operatorStack.Push(next);
continue;
}

if (next == '(')
{
reader.Read();
operatorStack.Push('(');
continue;
}

if (next == ')')
{
reader.Read();
EvaluateWhile(() => operatorStack.Count > 0 && operatorStack.Peek() != '(');
operatorStack.Pop();
continue;
}

if (next != ' ')
{
throw new ArgumentException(string.Format("Encountered invalid character {0}", next), "expression");
Expand Down

0 comments on commit 46d4b41

Please sign in to comment.