001 /*
002 @license.text@
003 */
004 package biz.hammurapi.antlr;
005
006 import antlr.collections.AST;
007 import biz.hammurapi.util.PoliteVisitor;
008 import biz.hammurapi.util.Visitable;
009 import biz.hammurapi.util.Visitor;
010
011
012 /**
013 * Navigates Visitor through DOM tree.
014 * @author Pavel Vlasov
015 * @version $Revision: 1.2 $
016 */
017 public class AstVisitable implements Visitable {
018 private AST node;
019 private boolean withSiblings;
020
021 public boolean accept(Visitor visitor) {
022 if (withSiblings) {
023 for (AST ast=node; ast!=null; ast=ast.getNextSibling()) {
024 accept(ast, visitor);
025 }
026 return true;
027 }
028
029 return accept(node, visitor);
030 }
031
032 /**
033 * @param node
034 * @param visitor
035 */
036 private boolean accept(AST node, Visitor visitor) {
037 if (visitor.visit(node)) {
038 for (AST child=node.getFirstChild(); child!=null; child=child.getNextSibling()) {
039 accept(child, visitor);
040 }
041 if (visitor instanceof PoliteVisitor) {
042 ((PoliteVisitor) visitor).leave(node);
043 }
044 return true;
045 }
046
047 return false;
048 }
049
050 /**
051 * @param node
052 */
053 public AstVisitable(AST node, boolean withSiblings) {
054 super();
055 this.node = node;
056 this.withSiblings=withSiblings;
057 }
058 }