In Java SOP expressions are sums of products of doubles Exp
In Java :
SOP expressions are sums of products of doubles:
Expression ::= Sum | Product
Sum ::= Product~(\"+\"~Product)*
Product ::= Double~(\"*\"~Double)*
The SOP console reads a string from the keyboard and breaks it into a list of sub-strings separated by + signs. These sub-strings are broken into a list of sub-sub-strings separated by * signs. The sub-sub-strings should be parsable as doubles. (Otherwise and exception should be thrown.)
The lists of sub-sub-strings should be converted into instances of a Product class. Lists of products should be converted into lists of expressions
Hint
You can modify the console presented in class.
You could break a string such as 1+2*3 + 4 * 5 * 6 into the lists of lists [1, [2, 3], [4, 5, 6]] by creating scanners using the right delimiter pattern. For example:
Scanner tokens1 = new Scanner(input).useDelimiter(\"\\\\s*\\\\+\\\\s*\");
«interface» Expression +execute0: Double Sum Product -operands: Product(1. -operands: Double[1. Console +repl0 +parse(line: String): ExpressionSolution
import java.util.Scanner;
interface Expression {
public Double execute();
}
class Sum implements Expression {
private Product[] operands;
public Product[] getOperands() {
return operands;
}
public void setOperands(Product[] operands) {
this.operands = operands;
}
@Override
public Double execute() {
Double sum = 0.0;
for(int i=0;i<operands.length;i++){
sum += operands[i].execute();
}
return sum;
}
}
class Product implements Expression {
private Double[] operands;
public Double[] getOperands() {
return operands;
}
public void setOperands(Double[] operands) {
this.operands = operands;
}
@Override
public Double execute() {
Double product = 1.0;
for(int i=0;i<operands.length;i++){
product *= operands[i];
}
return product;
}
}
class Console {
public void repl() {
// I have used console for input
Scanner tokens1 = new Scanner(System.in);
// You can use a file even by
//Scanner tokens1 = new Scanner(new file(\"input.txt\")).useDelimiter(\"\ \");
// this follows the REPL = read-eval-print-loop flow, to check many expression in one
// execution
while (tokens1.hasNextLine()) {
String sopExpression = tokens1.nextLine();
//System.out.println(\"sopExpression\"+sopExpression);
if(sopExpression.equals(\"\"))
break;
Expression exp = parse(sopExpression);
Double ans = exp.execute();
System.out.println(\"ans = \"+ans);
}
}
public Expression parse(String line) {
Expression exp;
if(line.contains(\"+\")){
Sum sum = new Sum();
String proList[] = line.split(\"\\\\+\");
Product[] operands = new Product[proList.length];
for(int i=0;i<proList.length;i++){
operands[i] = (Product) parse(proList[i]);
}
sum.setOperands(operands);
exp = sum;
}else{
Product pro = new Product();
String doubsList[] = line.split(\"\\\\*\");
Double[] operands = new Double[doubsList.length];
for(int i=0;i<doubsList.length;i++){
operands[i] = Double.parseDouble(doubsList[i]);
}
pro.setOperands(operands);
exp = pro;
}
return exp;
}
}
public class TestExecution {
public static void main(String[] args) {
// TODO Auto-generated method stub
Console obj = new Console();
obj.repl();
}
}


