// ********** InterpreterDemo.java ********** class Stack { private static final int MAX_STACK = 1000; private static final int INIT_TOP = -1; private static final int ERROR = -99999; private int top = INIT_TOP; private int stack[] = new int[MAX_STACK]; public void push(int i) { if (top < MAX_STACK - 1) stack[++top] = i; } public int pop() { if (top != INIT_TOP) return stack[top--]; return ERROR; } } class Array { public static final int MAX_ARRAY = 1000; private AbstractExpression array[] = new AbstractExpression[MAX_ARRAY]; private int size = 0; public void add(AbstractExpression ae) { if (size < MAX_ARRAY - 1) array[size++] = ae; } public int getSize() { return size; } public AbstractExpression getExpression(int i) { return array[i]; } } interface AbstractExpression { public void interpret(Stack context); } class NonTerminalExpression implements AbstractExpression { private Array expressions = new Array(); public void interpret(Stack context) { for (int i=0; i