// Visitor pattern // some place from the Internet abstract class ExpressionVisitor { abstract void visitIntExp(IntExp e); abstract void visitAddExp(AddExp e); } abstract class Expression { abstract void accept(ExpressionVisitor v); } class IntExp extends Expression { int value; void accept(ExpressionVisitor v) { v.visitIntExp(this); } } class AddExp extends Expression { Expression e1, e2; void accept(ExpressionVisitor v) { v.visitAddExp(this); } }