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);
	}
}

