How do I code and compile in the areas that say "IMPLEMENT ME"?
import java.util.Scanner;
import java.util.Stack;
class EvalException extends Exception{ public EvalException(String msg) { super(msg); }
interface Expr {
public int eval() throws EvalException;
}
class Atom implements Expr {
String value; public Atom(String value) { this.value = value; } public String toString() { return value; } public int eval() throws EvalException { /* IMPLEMENT ME * We'll assume Atoms represent integers when we eval them, so try to * parse the value as an int. If this can't be done, we'll want to throw * an EvalException with the proper error message. */ }
}
class List<E> implements Expr {
private Node<E> head; public List(E... elements) { head = null; for(int i = elements.length - 1; i >= 0; i--) { head = new Node<E>(elements[i], head); } } public void append(E element) { if (head == null) { head = new Node<E>(element, null); } else { Node<E> last = head; while (last.link != null) last = last.link; last.link = new Node<E>(element, null); } } public String toString() { String s = "( "; Node<E> elements = head; while (elements != null) { s += elements.data + " "; elements = elements.link; } return s + ")"; } public void evalAndPrintEach() { Node<Expr> current = (Node<Expr>) head; while (current != null) { try { System.out.println( ((Expr) current.data).eval() ); } catch (EvalException e) { System.out.println(e); } current = current.link; } } private Node<Integer> evalArgs(Node<Expr> xs) throws EvalException { if (xs == null) return null; return new Node<Integer>(xs.data.eval(), evalArgs(xs.link)); } public int eval() throws EvalException { Node<Expr> elts = (Node<Expr>) head; if (elts == null) throw new EvalException("Empty list."); String op = ((Atom) elts.data).value; /* IMPLEMENT ME * To evaluate a (non-empty) List<Expr>, we look at the first element * (which we assume is an Atom), evaluate each of the remaining elements * (using evalArgs), then apply the appropriate operator to the results. * See the examples in the handout. * * Attempting to evaluate an empty list results in an error. If op isn't * one of "+", "-", "*", "/", then this too is an error. */ } private int add(Node<Integer> xs) throws EvalException { /* IMPLEMENT ME * Find the sum of xs using a right fold. */ } private int mul(Node<Integer> xs) throws EvalException { /* IMPLEMENT ME * Find the product of xs using a left fold. */ } private int sub(Node<Integer> xs) throws EvalException { /* IMPLEMENT ME * Calculate the result by using a tail-recursive helper method. */ } private int div(Node<Integer> xs) throws EvalException { /* IMPLEMENT ME * Calculate the result iteratively. If xs doesn't have at least 2 * elements, throw an Exception. */ } private class Node<E> { E data; Node<E> link; public Node (E data, Node<E> link) { this.data = data; this.link = link; } }
}
class UnclosedListException extends Exception { }
class Lisp {
public static List<Expr> parse(String[] tokens) throws Exception { Stack<List<Expr>> stack = new Stack<List<Expr>>(); stack.push(new List<Expr>()); for (String token : tokens) { if (token.equals("(")) { stack.push(new List<Expr>()); } else if (token.equals(")")) { List<Expr> toAppend = stack.pop(); stack.peek().append(toAppend); } else { stack.peek().append(new Atom(token)); } } if (stack.size() > 1) throw new UnclosedListException(); return stack.pop(); } public static void main(String[] args) throws Exception { Scanner in = new Scanner(System.in); while(true) { System.out.print("lisp> "); String line = in.nextLine(); try { parse(line.split("\\s+")).evalAndPrintEach(); } catch (Exception e) { System.out.println("Parsing error."); } } }
}
How do I code and compile in the areas that say "IMPLEMENT ME"?
Ads