package java_cup.runtime; import java.util.HashMap; import java.util.List; public class SyntaxTreeDFS { public static interface ElementHandler { public void handle(XMLElement parent, List<XMLElement> children); } public static abstract class AbstractVisitor implements Visitor { private HashMap<String, ElementHandler> preMap = new HashMap<>(); private HashMap<String, ElementHandler> postMap = new HashMap<>(); public abstract void defaultPre(XMLElement element, List<XMLElement> children); public abstract void defaultPost(XMLElement element,List<XMLElement> children); @Override public void preVisit(XMLElement element) { ElementHandler handler = preMap.get(element.tagname); if (handler==null) { defaultPre(element,element.getChildren()); } else handler.handle(element, element.getChildren()); } @Override public void postVisit(XMLElement element) { ElementHandler handler = postMap.get(element.tagname); if (handler==null) { defaultPost(element,element.getChildren()); } else handler.handle(element, element.getChildren()); } public void registerPreVisit(String s,ElementHandler h){ preMap.put(s, h); } public void registerPostVisit(String s, ElementHandler h){ postMap.put(s, h); } } public static interface Visitor { public void preVisit(XMLElement element); public void postVisit(XMLElement element); } public static void dfs(XMLElement element, Visitor visitor){ visitor.preVisit(element); for (XMLElement el :element.getChildren()){ dfs(el,visitor); } visitor.postVisit(element); } }