import java.util.*; public class FunCall extends Expression { private List operands = new ArrayList(); private String operator = "?"; public String getOperator() { return operator; } public static Expression parse(Scanner tokens) throws Exception { FunCall result = new FunCall(); tokens.next(); // toss left paren result.operator = tokens.next(); while (!tokens.hasNext("\\)")) { // parse operands until closing right paren encountered result.operands.add(Expression.parse(tokens)); } tokens.next(); // toss right paren return result; } public void accept(ExpVisitor v) { v.visit(this); } public Iterator iterator() { return operands.iterator(); } public String toString() { String result = "("; for(Expression node: operands) { result = result + node + " "; } return result + ")"; } public double eval() throws Exception { double result = 0; List args = new ArrayList(); for(Expression operand: operands) { args.add(operand.eval()); } if (operator.equals("+")) { for(Double arg: args) { result += arg; } } else if (operator.equals("*")) { result = 1; for(Double arg: args) { result *= arg; } } else { throw new Exception("unrecognized operator: " + operator); } return result; } }