/// <summary> /// Client /// </summary> /// <remarks> /// Build a syntax tree representing a particular sentence in the language that the grammar defines. /// </remarks> public override void Execute() { var context = new Context(); // expression1 = 1 + 2 var expression1 = new AddExpression(new ConstantExpression(1), new ConstantExpression(2)); Assert.Equal(1 + 2, expression1.Solve(context)); // expression2 = 4 * 6 var expression2 = new MultiplyExpression(new ConstantExpression(4), new ConstantExpression(6)); Assert.Equal(4.0 * 6.0, expression2.Solve(context)); // expression3 = expression2 / 2 var expression3 = new DivideExpression(expression2, new ConstantExpression(2)); Assert.Equal(4.0 * 6.0 / 2.0, expression3.Solve(context)); // expression4 = expression1 - expression3 var expression4 = new SubtractExpression(new VariableExpression(nameof(expression1)), new VariableExpression(nameof(expression3))); context.SetVariable(nameof(expression1), expression1); context.SetVariable(nameof(expression3), expression3); Assert.Equal((/* expression1 */ 1 + 2) - (/* expression3 */ 4.0 * 6.0 / 2.0), expression4.Solve(context)); // f(x) = ((5 * x) / 2) + ((2 ^ x) - 6) // x = 6 var expression5 = new AddExpression( new DivideExpression( new MultiplyExpression( new ConstantExpression(5), new VariableExpression("x")), new ConstantExpression(2)), new SubtractExpression( new PowerExpression( new ConstantExpression(2), new VariableExpression("x")), new ConstantExpression(6))); double x = 6; context.SetVariable("x", new ConstantExpression(x)); Assert.Equal(((5 * x) / 2) + (Math.Pow(2, x) - 6), expression5.Solve(context)); }