/**
  *
  * Programmieraufgabe P-24 (arithmetik.jar)
  * Leonhard Fellermayr
  *
  * @author Leonhard Fellermayr
  * @version 1.0
  *
  */

/** Benoetigte Packages */

import java.util.Set;
import java.util.HashSet;

/** Implementierung der Klasse SetVisitor (implementiert ArithmeticVisitor) */

public class SetVisitor implements ArithmeticVisitor
{

	/** @param s HashSet, das saemtliche Variablennamen des Ausdrucks aufnimmt. */

	private Set s = new HashSet ();

	/** Object visitPlus (Ausdruck, Ausdruck) : Besuchsmethode fuer Ausdruck "Plus".
	  *
	  * Laesst durch rekursiven Aufruf der accept()-Methode im linken und im rechten Teilausdruck
 	  * nach weiteren Variablen suchen.
	  *
	  * @param left Linker Teilausdruck
	  * @param right Rechter Teilausdruck
	  * @return Ergebnisobjekt nach dem Besuch des Visitors bei den Ausdruecken (= Set von Variablennamen)
	  *
	  */

	public Object visitPlus (Ausdruck left, Ausdruck right)
	{
		left.accept (this);
		right.accept (this);

		return (s);
	}

	/** Object visitMal (Ausdruck, Ausdruck) : Besuchsmethode fuer Ausdruck "Mal".
	  *
	  * Laesst durch rekursiven Aufruf der accept()-Methode im linken und im rechten Teilausdruck
 	  * nach weiteren Variablen suchen.
	  *
	  * @param left Linker Teilausdruck
	  * @param right Rechter Teilausdruck
	  * @return Ergebnisobjekt nach dem Besuch des Visitors bei den Ausdruecken (= Set von Variablennamen)
	  *
	  */

	public Object visitMal (Ausdruck left, Ausdruck right)
	{
		left.accept (this);
		right.accept (this);

		return (s);
	}

	/** Object visitKonstante (int) : Besuchsmethode fuer Ausdruck "Konstante".
	  *
	  * Gibt einfach das bestehende Set zurueck. Die Bearbeitung einer Konstante liefert
	  * keine weitere Variable.
	  *
	  * @param c Wert der Konstanten (int)
	  * @return Ergebnisobjekt nach dem Besuch des Visitors beim Ausdruck (= Set von Variablennamen)
	  *
	  */

	public Object visitKonstante (int c)
	{
		return (s);
	}

	/** Object visitVariable (String) : Besuchsmethode fuer Ausdruck "Variable".
	  *
	  * Fuegt dem Set s den Namen der aktuell bearbeiteten Variable hinzu und gibt
	  * dieses verlaengerte Set anschliessend zurueck.
	  *
	  * @param v Name der Variable (String)
	  * @return Ergebnisobjekt nach dem Besuch des Visitors beim Ausdruck (= Set von Variablennamen)
	  *
	  */

	public Object visitVariable (String v)
	{
		s.add (v);
		return (s);
	}

} // SetVisitor
