/** * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * Use of this file and the system it is part of is constrained by the * file COPYRIGHT in the root directory of this system. * */ /* This is an example of how the Visitor pattern might be used to implement the dumping code that comes with SimpleNode. It's a bit long-winded, but it does illustrate a couple of the main points. 1) the visitor can maintain state between the nodes that it visits (for example the current indentation level). 2) if you don't implement a jjtAccept() method for a subclass of SimpleNode, then SimpleNode's acceptor will get called. 3) the utility method childrenAccept() can be useful when implementing preorder or postorder tree walks. Err, that's it. */ package com.meidusa.amoeba.sqljep; public class ParserDumpVisitor implements ParserVisitor { private int indent = 0; private String indentString() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < indent; ++i) { sb.append(" "); } return sb.toString(); } public Object visit(SimpleNode node, Object data) throws ParseException { System.out.println(indentString() + node + ": acceptor not unimplemented in subclass?"); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTStart node, Object data) throws ParseException { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTFunNode node, Object data) throws ParseException { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTVarNode node, Object data) throws ParseException { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTConstant node, Object data) throws ParseException { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTArray node, Object data) throws ParseException { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } } /*end*/