package lab.art; import java.util.Random; /** * This utility class provides methods to create expressions. * * @author Franck van Breugel */ public class Expressions { private Expressions() {} /** * Returns a random expression. * * @param random a Random object. * @pre. random != null * @return a random expression. */ public static Expression getRandom(Random random) { final int TYPES = 6; final int PRODUCT = 0; final int AVERAGE = 1; final int SINE = 2; final int COSINE = 3; final int VARIABLE_X = 4; final int VARIABLE_Y = 5; Expression expression; switch (random.nextInt(TYPES)) { case PRODUCT : expression = new Product(Expressions.getRandom(random), Expressions.getRandom(random)); break; case AVERAGE : expression = new Average(Expressions.getRandom(random), Expressions.getRandom(random)); break; case SINE : expression = new Sine(Expressions.getRandom(random)); break; case COSINE : expression = new Cosine(Expressions.getRandom(random)); break; case VARIABLE_X : expression = new VariableX(); break; case VARIABLE_Y : expression = new VariableY(); break; default : expression = null; } return expression; } /** * Returns the expression represented by the given string. * * @param expression string representation of an expression. * @return the expression represented by the given string. * @throws Exception if the given string does not represent an expression. */ public static Expression fromString(String expression) throws Exception { final String COS_START = "cos(pi * "; final String SIN_START = "sin(pi * "; final String AVG_START = "average("; final String X_START = "x"; final String Y_START = "y"; final String PRODUCT_START = "("; if (expression.startsWith(COS_START)) { expression = expression.substring(COS_START.length(), expression.length() - 1); return new Cosine(Expressions.fromString(expression)); } else if (expression.startsWith(SIN_START)) { expression = expression.substring(SIN_START.length(), expression.length() - 1); return new Sine(Expressions.fromString(expression)); } else if (expression.startsWith(AVG_START)) { expression = expression.substring(AVG_START.length(), expression.length() - 1); int index = 0; int open = 0; boolean found = false; while (index < expression.length() && !found) { if (expression.charAt(index) == ',' && open == 0) { found = true; } else if (expression.charAt(index) == '(') { open++; } else if (expression.charAt(index) == ')') { open--; } index++; } if (!found) { throw new Exception("Parsing failed"); } else { Expression first = Expressions.fromString(expression.substring(0, index)); Expression second = Expressions.fromString(expression.substring(index + 1, expression.length())); return new Average(first, second); } } else if (expression.startsWith(X_START)) { return new VariableX(); } else if (expression.startsWith(Y_START)) { return new VariableY(); } else if (expression.startsWith(PRODUCT_START)) { expression = expression.substring(1, expression.length() - 1); int index = 0; int open = 0; boolean found = false; while (index < expression.length() && !found) { if (expression.charAt(index) == '*' && open == 0) { found = true; } else if (expression.charAt(index) == '(') { open++; } else if (expression.charAt(index) == ')') { open--; } index++; } if (!found) { throw new Exception("Parsing failed"); } else { Expression first = Expressions.fromString(expression.substring(0, index - 1)); Expression second = Expressions.fromString(expression.substring(index + 1, expression.length())); return new Product(first, second); } } else { throw new Exception("Parsing failed"); } } }