public void ExecuteForCommand() { ICommand setX = new SetVariableCommand("x", new ConstantExpression(0)); ICommand setY = new SetVariableCommand("y", new ConstantExpression(0)); List<ICommand> commands = new List<ICommand>(); commands.Add(setX); commands.Add(setY); ICommand initialCommand = new CompositeCommand(commands); IExpression condition = new CompareExpression(ComparisonOperator.Less, new VariableExpression("x"), new ConstantExpression(6)); IExpression addXtoY = new ArithmeticBinaryExpression(ArithmeticOperator.Add, new VariableExpression("y"), new VariableExpression("x")); ICommand addToY = new SetVariableCommand("y", addXtoY); ICommand endCommand = new SetVariableCommand("x", new ArithmeticBinaryExpression(ArithmeticOperator.Add, new VariableExpression("x"), new ConstantExpression(1))); ForCommand forcmd = new ForCommand(initialCommand, condition, endCommand, addToY); BindingEnvironment environment = new BindingEnvironment(); environment.SetValue("y", null); forcmd.Execute(environment); Assert.AreEqual(15, environment.GetValue("y")); }
private static ICallable BuildFactorialFunction() { IExpression condition = new CompareExpression(ComparisonOperator.LessEqual, new VariableExpression("n"), new ConstantExpression(1)); ICommand return1 = new ReturnCommand(new ConstantExpression(1)); ICommand return2 = new ReturnCommand(new ArithmeticBinaryExpression( ArithmeticOperator.Multiply, new VariableExpression("n"), new InvokeExpression("Factorial", new IExpression[] { new ArithmeticBinaryExpression(ArithmeticOperator.Subtract, new VariableExpression("n"), new ConstantExpression(1)) }))); ICommand ifcmd = new IfCommand(condition, return1, return2); ICallable factorial = new Function(new string[] { "n" }, ifcmd); return factorial; }
private static bool EvaluateComparisonOperator(ComparisonOperator operation, object left, object right) { IExpression expression = new CompareExpression(operation, new ConstantExpression(left), new ConstantExpression(right)); return (bool)expression.Evaluate(null); }
private IExpression ParseBinaryExpressionZerothLevel() { IExpression expression = this.ParseBinaryExpressionFirstLevel(); if (expression == null) return null; while (this.TryParse(TokenType.Operator, "<", ">", "==", ">=", "<=", "!=")) { Token oper = this.lexer.NextToken(); IExpression right = this.ParseBinaryExpressionFirstLevel(); ComparisonOperator op = 0; if (oper.Value == "<") op = ComparisonOperator.Less; if (oper.Value == ">") op = ComparisonOperator.Greater; if (oper.Value == "<=") op = ComparisonOperator.LessEqual; if (oper.Value == ">=") op = ComparisonOperator.GreaterEqual; if (oper.Value == "==") op = ComparisonOperator.Equal; if (oper.Value == "!=") op = ComparisonOperator.NotEqual; expression = new CompareExpression(op, expression, right); } return expression; }