private void calculateButton_Click(object sender, RoutedEventArgs e) { try { ClearScreen(); string formula = formulaTextBox.Text; TokenReader reader = new TokenReader(CultureInfo.InvariantCulture); List <Token> tokens = reader.Read(formula); ShowTokens(tokens); IFunctionRegistry functionRegistry = new FunctionRegistry(false); AstBuilder astBuilder = new AstBuilder(functionRegistry, false); Operation operation = astBuilder.Build(tokens); ShowAbstractSyntaxTree(operation); Dictionary <string, double> variables = new Dictionary <string, double>(); foreach (Variable variable in GetVariables(operation)) { double value = AskValueOfVariable(variable); variables.Add(variable.Name, value); } //IExecutor executor = new Interpreter(); //double result = executor.Execute(operation, null, null, variables); Interpreter executor = new Interpreter(); Dictionary <string, VariableCalcurator> variablesv2 = new Dictionary <string, VariableCalcurator>(); VariableCalcurator result = executor.Execute(operation, null, variablesv2); resultTextBox.Text = "Type:" + result.DataType.ToString() + " Param:" + result.paramString; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } }
private VariableCalcurator Index(VariableCalcurator arg1, VariableCalcurator arg2, IDictionary <string, VariableCalcurator> variables) { arg1 = new VariableCalcurator(DataType.Array, arg1.Literal()); arg1.Index(arg2); return(arg1); }
private VariableCalcurator Substitute(VariableCalcurator arg1, VariableCalcurator arg2, IDictionary <string, VariableCalcurator> variables) { arg1.Substitution(arg2, variables); return(arg1); }
public VariableCalcurator Execute(Operation operation, IFunctionRegistry functionRegistry, IDictionary <string, VariableCalcurator> variables) { VariableCalcurator.defaultVariables = variables; if (operation == null) { throw new ArgumentNullException("operation"); } /* * if (operation.GetType() == typeof(IntegerConstant)) * { * IntegerConstant constant = (IntegerConstant)operation; * return constant.Value; * } * else if (operation.GetType() == typeof(FloatingPointConstant)) * { * FloatingPointConstant constant = (FloatingPointConstant)operation; * return constant.Value; * } * else*/ if (operation.GetType() == typeof(VariableCalcurator)) { VariableCalcurator variable = (VariableCalcurator)operation; /* * if (variable.DataType == DataType.Literal) * return new VariableCalcurator(DataType.Literal, variable.Literal()); * else if(variable.DataType == DataType.Identifier) * { * bool variableFound = variables.ContainsKey(variable.Literal()); * * if (variableFound) * return variables[variable.Literal()]; * * else * return variable; * throw new VariableNotDefinedException(string.Format("The variable \"{0}\" used is not defined.", variable.Literal())); * } */ return(variable); } else if (operation.GetType() == typeof(Multiplication)) { Multiplication multiplication = (Multiplication)operation; return(Execute(multiplication.Argument1, functionRegistry, variables).GetInstance() * Execute(multiplication.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(Addition)) { Addition addition = (Addition)operation; return(Execute(addition.Argument1, functionRegistry, variables).GetInstance() + Execute(addition.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(Subtraction)) { Subtraction addition = (Subtraction)operation; return(Execute(addition.Argument1, functionRegistry, variables).GetInstance() - Execute(addition.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(Division)) { Division division = (Division)operation; return(Execute(division.Dividend, functionRegistry, variables).GetInstance() / Execute(division.Divisor, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(Modulo)) { Modulo division = (Modulo)operation; return(Execute(division.Dividend, functionRegistry, variables).GetInstance() % Execute(division.Divisor, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(Exponentiation)) { Exponentiation exponentiation = (Exponentiation)operation; return(new VariableCalcurator((float)Math.Pow(Execute(exponentiation.Base, functionRegistry, variables).GetInstance().Float(), Execute(exponentiation.Exponent, functionRegistry, variables).GetInstance().Float()))); } else if (operation.GetType() == typeof(UnaryMinus)) { UnaryMinus unaryMinus = (UnaryMinus)operation; return(-Execute(unaryMinus.Argument, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(LessThan)) { LessThan lessThan = (LessThan)operation; return(Execute(lessThan.Argument1, functionRegistry, variables).GetInstance() < Execute(lessThan.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(LessOrEqualThan)) { LessOrEqualThan lessOrEqualThan = (LessOrEqualThan)operation; return(Execute(lessOrEqualThan.Argument1, functionRegistry, variables).GetInstance() <= Execute(lessOrEqualThan.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(GreaterThan)) { GreaterThan greaterThan = (GreaterThan)operation; return(Execute(greaterThan.Argument1, functionRegistry, variables).GetInstance() > Execute(greaterThan.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(GreaterOrEqualThan)) { GreaterOrEqualThan greaterOrEqualThan = (GreaterOrEqualThan)operation; return(Execute(greaterOrEqualThan.Argument1, functionRegistry, variables).GetInstance() >= Execute(greaterOrEqualThan.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(Equal)) { Equal equal = (Equal)operation; return(Execute(equal.Argument1, functionRegistry, variables).GetInstance() == Execute(equal.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(NotEqual)) { NotEqual notEqual = (NotEqual)operation; return(Execute(notEqual.Argument1, functionRegistry, variables).GetInstance() != Execute(notEqual.Argument2, functionRegistry, variables).GetInstance()); } else if (operation.GetType() == typeof(Index)) { Index index = (Index)operation; return(Index(Execute(index.Argument1, functionRegistry, variables), Execute(index.Argument2, functionRegistry, variables), variables)); } else if (operation.GetType() == typeof(Substitution)) { Substitution substitution = (Substitution)operation; return(Substitute(Execute(substitution.Argument1, functionRegistry, variables), Execute(substitution.Argument2, functionRegistry, variables), variables)); } /* * else if (operation.GetType() == typeof(Function)) * { * Function function = (Function)operation; * * FunctionInfo functionInfo = functionRegistry.GetFunctionInfo(function.FunctionName); * * double[] arguments = new double[functionInfo.IsDynamicFunc ? function.Arguments.Count : functionInfo.NumberOfParameters]; * for (int i = 0; i < arguments.Length; i++) * arguments[i] = Execute(function.Arguments[i], functionRegistry, variables); * * return Invoke(functionInfo.Function, arguments); * } */ else { throw new ArgumentException(string.Format("Unsupported operation \"{0}\".", operation.GetType().FullName), "operation"); } }