import edu.neu.ccs.demeter.dj.Visitor; import java.util.*; import edu.neu.ccs.demeter.*; public class TBRVisitor extends Visitor { private Vector vNonTerminals = new Vector(); // default initial size is 10 private Vector vConstructParts = new Vector(); private Ident idCurrentAdj; public void start() { System.out.println("begin");} public void finish() {System.out.println("end"); } TBRVisitor(Vector vDefinedClasses) { vNonTerminals = vDefinedClasses; } public void before(Adj o) { idCurrentAdj = o.vertex.name; System.out.println("Adj: " + idCurrentAdj.toString()); } public void before(Labeled_vertex o) { if (o != null) { vConstructParts.addElement(o.class_name.name); System.out.println("\ttarget class " + o.class_name.name.toString()); } } public void after(Construct o) { int pi = vConstructParts.size(); int pti = 0; // // Check each part of the construct to see if it is a terminal // for (int i = 0; i < pi; i++) { if (IsTerminal((Ident)vConstructParts.elementAt(i)) ) { pti++; if (pi > 1) { System.out.print( "\tClass violates the" + " Terminal Buffer Rule: " ); System.out.println(vConstructParts.elementAt(i).toString() ); } } } System.out.println("\n\t" + idCurrentAdj.toString() + " has " + pi + " part(s) " ); System.out.println("\twith " + pti + " terminal part(s). "); vConstructParts.removeAllElements(); // Empty the vector. } public boolean IsTerminal(Ident o) { return !vNonTerminals.contains(o); } }