/** 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; }
/** 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); }