Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
 private VariableCalcurator Index(VariableCalcurator arg1, VariableCalcurator arg2, IDictionary <string, VariableCalcurator> variables)
 {
     arg1 = new VariableCalcurator(DataType.Array, arg1.Literal());
     arg1.Index(arg2);
     return(arg1);
 }
Beispiel #3
0
 private VariableCalcurator Substitute(VariableCalcurator arg1, VariableCalcurator arg2, IDictionary <string, VariableCalcurator> variables)
 {
     arg1.Substitution(arg2, variables);
     return(arg1);
 }
Beispiel #4
0
        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");
            }
        }