package edu.mit.ai.psg.jeva.examples;
import edu.mit.ai.psg.jeva.*;
import edu.mit.ai.psg.strings.*;
import java.util.*;
import java.io.PrintWriter;
{@link #trace(IJevaNode, Object)}{@link #visit(IJevaNode, Object)}{@link #trace(IJevaNode, Object)}{@link #indentedTrace(PrintWriter, IJevaNode, Object)}@author
public abstract class TraceEvalHookBase extends JevaVisitorBase {
class PrintWriterStack extends Stack {
public PrintWriter popWriter() { return (PrintWriter) super.pop(); }
public PrintWriter topWriter() { return (PrintWriter) super.peek(); }
}
final PrintWriterStack printWriterStack = new PrintWriterStack();
public TraceEvalHookBase() {
printWriterStack.push(new PrintWriter(System.err));
}
public TraceEvalHookBase(PrintWriter pw) {
printWriterStack.push(pw);
}
{@link #trace(IJevaNode, Object) return trace(node, data);}
public Object visit(IJevaNode node, Object data) {
return trace(node, data);
}
{@link #indentedTrace(PrintWriter, IJevaNode, Object)}
public Object trace(IJevaNode node, Object data) {
Object result = null;
if (data instanceof EvalMethods.EvalHookPreData) {
PrintWriter pw = printWriterStack.topWriter();
pw.print("->");
PrintWriter iw = new IndentWriter(pw, "| ");
printWriterStack.push(iw);
result = indentedTrace(iw, node, data);
} else if (data instanceof EvalMethods.PreApplyData) {
PrintWriter pw = printWriterStack.topWriter();
result = indentedTrace(pw, node, data);
} else if (data instanceof EvalMethods.EvalHookPostData) {
if (printWriterStack.size() > 1)
printWriterStack.popWriter().flush();
PrintWriter pw = printWriterStack.topWriter();
pw.print("<- ");
PrintWriter iw = new IndentWriter(pw, " ");
result = indentedTrace(iw, node, data);
iw.flush();
pw.flush();
}
return result;
}
public abstract Object indentedTrace(PrintWriter pw,
IJevaNode node, Object data);
}