more polymorphism, cleanup

This commit is contained in:
2013-10-01 16:56:58 +02:00
parent cf36cb222f
commit 90477d8d69
11 changed files with 69 additions and 49 deletions
+5 -1
View File
@@ -7,5 +7,9 @@ package net.mightypork.rcalc;
* @author Ondrej Hruska
*/
public interface IToken {
/**
* Wrap this token in a tokenList (return itself if already instance of a TokenList)
* @return the wrapping TokenList
*/
public TokenList wrapInTokenList();
}
+1 -1
View File
@@ -76,7 +76,7 @@ public class RCalcSession implements IDebugable {
if (expression.length() == 0) return null; // no operation
expression.replace(":=", "="); // normalize assignment sign
expression = expression.replace(":=", "="); // normalize assignment sign
String assignedVariable = null;
String assignmentOperation = "";
+24 -44
View File
@@ -35,6 +35,15 @@ public class TokenList extends ArrayList<IToken> implements IToken {
}
/**
* Create a tokenList with single item
* @param token the item
*/
public TokenList(IToken token) {
add(token);
}
/**
* Parse the token list.<br>
* After running this method, the list is typically reduced to a single
@@ -121,29 +130,12 @@ public class TokenList extends ArrayList<IToken> implements IToken {
TokenBinaryOperator opToken = (TokenBinaryOperator) operatorToken;
// variables for tokenLists of the operands
TokenList leftTL, rightTL;
// get left operand
IToken leftArg = get(pos - 1);
if (leftArg instanceof TokenList) {
leftTL = (TokenList) leftArg;
} else {
leftTL = new TokenList(1);
leftTL.add(leftArg);
}
// get right operand
IToken rightArg = get(pos + 1);
if (rightArg instanceof TokenList) {
rightTL = (TokenList) rightArg;
} else {
rightTL = new TokenList(1);
rightTL.add(rightArg);
}
// get operands
TokenList leftArg = get(pos - 1).wrapInTokenList();
TokenList rightArg = get(pos + 1).wrapInTokenList();
// build an operation
Operation op = opToken.toOperation(leftTL, rightTL);
Operation op = opToken.toOperation(leftArg, rightArg);
// discard used tokens
subList(pos - 1, pos + 2).clear();
@@ -156,20 +148,11 @@ public class TokenList extends ArrayList<IToken> implements IToken {
TokenUnaryOperatorLeft opToken = (TokenUnaryOperatorLeft) operatorToken;
// variable for left operand
TokenList leftTL;
// get left operand (the only one)
IToken leftArg = get(pos - 1);
if (leftArg instanceof TokenList) {
leftTL = (TokenList) leftArg;
} else {
leftTL = new TokenList(1);
leftTL.add(leftArg);
}
// get operand
TokenList leftArg = get(pos - 1).wrapInTokenList();
// build an operation
Operation op = opToken.toOperation(leftTL);
Operation op = opToken.toOperation(leftArg);
// discard used tokens
subList(pos - 1, pos + 1).clear();
@@ -183,19 +166,10 @@ public class TokenList extends ArrayList<IToken> implements IToken {
TokenUnaryOperatorRight opToken = (TokenUnaryOperatorRight) operatorToken;
// variable for left operand
TokenList rightTL;
// get right operand (the only one)
IToken rightArg = get(pos + 1);
if (rightArg instanceof TokenList) {
rightTL = (TokenList) rightArg;
} else {
rightTL = new TokenList(1);
rightTL.add(rightArg);
}
TokenList rightArg = get(pos + 1).wrapInTokenList();
// build an operation
Operation op = opToken.toOperation(rightTL);
Operation op = opToken.toOperation(rightArg);
// discard used tokens
subList(pos, pos + 2).clear();
@@ -265,4 +239,10 @@ public class TokenList extends ArrayList<IToken> implements IToken {
}
@Override
public TokenList wrapInTokenList() {
return this;
}
}
@@ -5,6 +5,7 @@ import java.math.BigInteger;
import net.mightypork.rcalc.IEvaluableToken;
import net.mightypork.rcalc.ParseError;
import net.mightypork.rcalc.TokenList;
/**
@@ -461,4 +462,10 @@ public class Fraction implements IEvaluableToken {
return new Fraction(result, BigInteger.ONE);
}
@Override
public TokenList wrapInTokenList() {
return new TokenList(this);
}
}
@@ -2,6 +2,7 @@ package net.mightypork.rcalc.operations;
import net.mightypork.rcalc.IEvaluableToken;
import net.mightypork.rcalc.TokenList;
import net.mightypork.rcalc.numbers.Fraction;
@@ -14,4 +15,9 @@ public abstract class Operation implements IEvaluableToken {
@Override
public abstract Fraction evaluate();
@Override
public TokenList wrapInTokenList() {
return new TokenList(this);
}
}
@@ -10,7 +10,7 @@ import net.mightypork.rcalc.operations.Operation;
*
* @author Ondrej Hruska
*/
public abstract class TokenBinaryOperator implements IOperatorToken {
public abstract class TokenBinaryOperator extends TokenOperator {
/**
* Convert to operation
@@ -0,0 +1,12 @@
package net.mightypork.rcalc.tokens;
import net.mightypork.rcalc.TokenList;
public class TokenOperator implements IOperatorToken {
@Override
public TokenList wrapInTokenList() {
return new TokenList(this);
}
}
@@ -2,6 +2,7 @@ package net.mightypork.rcalc.tokens;
import net.mightypork.rcalc.IToken;
import net.mightypork.rcalc.TokenList;
/**
@@ -17,4 +18,9 @@ public class TokenParenthesisLeft implements IToken {
return "(";
}
@Override
public TokenList wrapInTokenList() {
throw new RuntimeException("Cannot wrap a parenthesis in a TokenList!");
}
}
@@ -2,6 +2,7 @@ package net.mightypork.rcalc.tokens;
import net.mightypork.rcalc.IToken;
import net.mightypork.rcalc.TokenList;
/**
@@ -17,4 +18,8 @@ public class TokenParenthesisRight implements IToken {
return ")";
}
@Override
public TokenList wrapInTokenList() {
throw new RuntimeException("Cannot wrap a parenthesis in a TokenList!");
}
}
@@ -10,7 +10,7 @@ import net.mightypork.rcalc.operations.Operation;
*
* @author Ondrej Hruska
*/
public abstract class TokenUnaryOperatorLeft implements IOperatorToken {
public abstract class TokenUnaryOperatorLeft extends TokenOperator {
/**
* Convert to operation
@@ -10,7 +10,7 @@ import net.mightypork.rcalc.operations.Operation;
*
* @author Ondrej Hruska
*/
public abstract class TokenUnaryOperatorRight implements IOperatorToken {
public abstract class TokenUnaryOperatorRight extends TokenOperator {
/**
* Convert to operation