TraversalPP { (@ void selective_visit() { // a method using three visitors: // SelectiveVisitor: finds objects of some class C (JavaCode) // SelectorVisitor: determines which objects of // class C should be processed depending on whether // they are contained in some class Y (Before). // assumes C-objects are contained in Y-objects. // PrintingVisitor: determines how selected objects // should be processed SelectorVisitor sov = new SelectorVisitor(new Boolean(false)); SelectiveVisitor siv = new SelectiveVisitor(new PrintingVisitor(), sov); this.all(sov,siv); } @) (@ void g_print() { PrintingVisitor pv = new PrintingVisitor(); this.t(pv); } @) traversal t(PrintingVisitor pv) {to From;} traversal all(SelectorVisitor sov, SelectiveVisitor siv) { to JavaCode;} } JavaCode { traversal all_j(PrintingVisitor doingV) { to *;} } Main { (@ static public void main(String args[]) throws Exception { TraversalPP a = TraversalPP.parse(System.in); a.selective_visit(); a.g_print(); System.out.println(" "); } @) } SelectiveVisitor{ after JavaCode (@ if (soV.get_selected().booleanValue()) { host.all_j(doingV); soV.set_selected(new Boolean(false)); } @) } SelectorVisitor { before Before (@ set_selected(new Boolean(true)); @) } PrintingVisitor{ before -> *,*,* (@ System.out.println(" going through edge from " + source.getClass().getName() + " to " + dest.getClass().getName() + " labeled " + edge); @) before TraversalPP (@ System.out.println(" traversal-pp "); @) after TraversalPP (@ System.out.println(" "); @) before Body (@ System.out.println(" { "); @) after Body (@ System.out.println(" } "); @) before Initialize (@ System.out.println(" initialize "); @) before Join (@ System.out.println(" join "); @) before From (@ System.out.println(" from "); @) before To (@ System.out.println(" to "); @) before Bypassing (@ System.out.println(" bypassing "); @) before Through (@ System.out.println(" through "); @) before Edge (@ System.out.println(" -> "); @) before Before (@ System.out.println(" before "); @) before After (@ System.out.println(" after "); @) before ClassName (@ System.out.println (" " + host.get_n() + " "); @) before JavaTypeName (@ System.out.println (" " + host.get_name() + " "); @) before Variable (@ System.out.println (" " + host.get_name() + " "); @) before LabelName (@ System.out.println (" " + host.get_name() + " "); @) before FunctionName (@ System.out.println (" " + host.get_name() + " "); @) before JavaCode (@ System.out.println (" " + "(" + "@" + host.get_code() + "@" + ")" + " "); @) before Args (@ System.out.println(" ( "); @) after Args (@ System.out.println(" ) "); @) before ClassNames (@ System.out.println(" { "); @) after ClassNames (@ System.out.println(" } "); @) before Traversals (@ System.out.println(" ( "); @) after Traversals (@ System.out.println(" ) "); @) }