package jmathlib.core.tokens; import jmathlib.core.interpreter.*; import jmathlib.core.tokens.numbertokens.DoubleNumberToken; /**Used to implement subscriptions of a array*/ public class ColonOperatorToken extends BinaryOperatorToken { /**Default Constructor - creates an operator with the value set to ' '*/ public ColonOperatorToken() { super(); value = ' '; } /**evaluates the operator*/ public OperandToken evaluate(Token[] operands, GlobalValues globals) { 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); } /**Convert the operator to a string*/ public String toString() { return ":"; } /**return a string containing the operator and it's operands*/ /*public String toString(OperandToken[] operands) { if (operands==null) return ":"; if (operands.length==2) { if ((operands[0]!=null) && (operands[1]!=null)) return operands[0].toString() + ":" + operands[1].toString(); } else if (operands.length==3) { if ((operands[0]!=null) && (operands[1]!=null) && (operands[2]!=null) ) return operands[0].toString() + ":" + operands[1].toString() + ":" + operands[2].toString(); } return ":"; }*/ }