Ejemplo n.º 1
0
  /** evaluates the operator */
  public OperandToken evaluate(Token[] operands, GlobalValues globals) {
    if (breakHit || continueHit) return null;

    ErrorLogger.debugLine("DotOperatorToken: evaluate");

    //  syntax is <left><dot><right>  (e.g. a.b)
    Token left = operands[0];
    Token right = operands[1];

    left = left.evaluate(null, globals);

    // not needed. is done by variable token
    // check if left is a variable (e.g. a.abc, where "a" is a structure)
    // if(operands[0] instanceof VariableToken)
    // {
    //    String objName      = ((VariableToken)operands[0]).getName();
    //    String fieldName    = operands[1].toString();
    //
    //    MathLibObject obj   = (MathLibObject)(getVariables().getVariable(objName).getData());
    //    OperandToken  op    = obj.getFieldData(fieldName);
    //
    //    ErrorLogger.debugLine("DotOperatorToken getting object " + objName);
    //    return op.evaluate(null);
    // }

    // (e.g. a.sin() or a.getColor() or 2.sin or 3.sin() )
    String name = "";

    if (right instanceof FunctionToken) {
      name = ((FunctionToken) right).getName();
    }

    if (!name.equals("")) {
      try {
        // check if a function with this name exists
        if (globals.getFunctionManager().findFunctionByName(name) != null) {
          ErrorLogger.debugLine("parser value.function");
          FunctionToken func = new FunctionToken(name, (OperandToken) left);

          return func.evaluate(null, globals);
        }
      } catch (Exception e) {
      }
    }

    // if(function != null)
    // {
    // }
    // else
    // {
    //    String firstParam = operandStack.pop().toString();
    //    ErrorLogger.debugLine("parser value.field");
    //    OperandToken tree = new VariableToken(token.toString(), firstParam);
    //    return tree;
    // }

    return null;
  }
Ejemplo n.º 2
0
  /** evaluates the operator */
  public OperandToken evaluate(Token[] operands, GlobalValues globals) {
    if (breakHit || continueHit) return null;

    double x1; // minimum
    double x2; // maximum
    double dx = 1; // increment

    if (operands == null) return new Expression(new ColonOperatorToken());

    if ((operands.length < 2) || (operands.length > 3))
      Errors.throwMathLibException("ColonOperator: <2 or >3 arguments");

    if ((operands[0] == null) || (operands[1] == null))
      Errors.throwMathLibException("ColonOperator: argument 1 or 2 is null");

    if (operands.length == 2
        && ((operands[0] instanceof DoubleNumberToken) && (operands[1] instanceof DelimiterToken)))
      return new Expression(
          new ColonOperatorToken(), (OperandToken) operands[0], (OperandToken) operands[1]);

    if (operands.length == 3
        && (operands[0] instanceof DoubleNumberToken)
        && (operands[1] instanceof DoubleNumberToken)
        && (operands[2] instanceof DelimiterToken)) {
      OperandToken[] rettok = new OperandToken[3];
      rettok[0] = (OperandToken) operands[0];
      rettok[1] = (OperandToken) operands[1];
      rettok[2] = (OperandToken) operands[2];
      return new Expression(new ColonOperatorToken(), rettok, 3);
    }

    // get data from arguments
    if (operands.length == 0) {
      return new Expression(new ColonOperatorToken());
    } else if (operands.length == 2) {
      if ((!(operands[0] instanceof DoubleNumberToken))
          || (!(operands[1] instanceof DoubleNumberToken)))
        Errors.throwMathLibException("ColonOperator: argument not number or end (x:x)");

      // e.g. 4:5
      x1 = ((DoubleNumberToken) operands[0]).getReValues()[0][0];
      x2 = ((DoubleNumberToken) operands[1]).getReValues()[0][0];
    } else {
      if (operands[2] == null) return null;
      if ((!(operands[0] instanceof DoubleNumberToken))
          || (!(operands[1] instanceof DoubleNumberToken))
          || (!(operands[2] instanceof DoubleNumberToken)))
        Errors.throwMathLibException("ColonOperator: argument not number or end (x:x:x)");

      // e.g. 4:2:20
      x1 = ((DoubleNumberToken) operands[0]).getReValues()[0][0];
      dx = ((DoubleNumberToken) operands[1]).getReValues()[0][0];
      x2 = ((DoubleNumberToken) operands[2]).getReValues()[0][0];
    }

    ErrorLogger.debugLine("ColonOperator: x1,dx,x2 " + x1 + " " + dx + " " + x2);

    int n = (int) ((x2 - x1) / dx) + 1;
    double[][] values = new double[1][n];
    for (int i = 0; i < n; i++) {
      values[0][i] = x1 + ((double) i) * dx;
    }

    return new DoubleNumberToken(values);
  }