public class PrintTree implements ASTVisitor {

    private int offset;
    private final static int INDENT_STEP = 3;

    public PrintTree() {
        offset = 0;
    }

    private void Print(String printval) {
        int i;
        for (i=0; i < offset * INDENT_STEP; i++) {
            System.out.print(" ");
        }
        System.out.println(printval);
    }

    public Object VisitIntegerLiteral(ASTIntegerLiteral literal) { 
        Print(Integer.toString(literal.value()));
        return null;
    }
    
    public Object VisitOperatorExpression(ASTOperatorExpression opexpr) {
        Print(ASTOperatorExpression.Names[opexpr.operator()]);
        offset++;
        opexpr.left().accept(this);
        opexpr.right().accept(this);
        offset--;
        return null;
    }
}