/* * Copyright © 2002 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * California 95054, U.S.A. All rights reserved. Sun Microsystems, Inc. has * intellectual property rights relating to technology embodied in the product * that is described in this document. In particular, and without limitation, * these intellectual property rights may include one or more of the U.S. * patents listed at http://www.sun.com/patents and one or more additional * patents or pending patent applications in the U.S. and in other countries. * U.S. Government Rights - Commercial software. Government users are subject * to the Sun Microsystems, Inc. standard license agreement and applicable * provisions of the FAR and its supplements. Use is subject to license terms. * Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered * trademarks of Sun Microsystems, Inc. in the U.S. and other countries. This * product is covered and controlled by U.S. Export Control laws and may be * subject to the export or import laws in other countries. Nuclear, missile, * chemical biological weapons or nuclear maritime end uses or end users, * whether direct or indirect, are strictly prohibited. Export or reexport * to countries subject to U.S. embargo or to entities identified on U.S. * export exclusion lists, including, but not limited to, the denied persons * and specially designated nationals lists is strictly prohibited. */ /* 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. */ public class eg4DumpVisitor implements eg4Visitor { 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) { 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) { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTAdd node, Object data) { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTMult node, Object data) { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTMyOtherID node, Object data) { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } public Object visit(ASTInteger node, Object data) { System.out.println(indentString() + node); ++indent; data = node.childrenAccept(this, data); --indent; return data; } } /*end*/