import java.util.*;

public class For {

/*
*
* FOR - Anweisung
*
*/	

public static Stack for_stack;

Anzeige anzeige;

	public void For(Anzeige anzeige,String teil){
	
	this.anzeige = anzeige;
	
	/*
	*	Variablen bzgl. der Laufavriable aus der FOR-Schleife
	*/
	
	String  varname	=	""; 	// Name
	String  varist	=	""; 	// aktueller Wert der Laufvariablen
	String  varsoll	=	""; 	// angestrebter Endwert
	String  varstep	= 	""; 	// Schrittweite

	/*
	*	Schleifenvariablen
	*/
		
	int 	z		=	0;
	int 	i		=	0;
	
	Berechne_zahl zahl = new Berechne_zahl();
	
	
	try {
	
	/*
	*	feststellen, an welcher Position das = steht
	*/
	
	z = teil.indexOf("=");
	
	/*
	*	Test, ob = vorhanden ist
	*	muss vorhanden sein
	*/
	
	if (z==-1){
		
		Aus.Aus();
		anzeige.schreiben("?SN ERROR"); 
		return;
	}
	
	while ( i < z) {
	
	
		switch (teil.charAt(i)){
	
	/*
	*	Variablenname einlesen
	*/
			case 'a': case 'b':	case 'c': case 'd': case 'e': case 'f':
			case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
			case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
			case 's': case 't': case 'u': case 'v': case 'w': case 'x':
			case 'y': case 'z': 
			case 'A': case 'B':	case 'C': case 'D': case 'E': case 'F':
			case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
			case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
			case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
			case 'Y': case 'Z':	
	
				varname = teil.charAt(i)+"";
						i++;
						while ( i<z
								&&
								teil.charAt(i)!=' '){
						
							varname += teil.charAt(i);
							i++;
						}
						
						break;
						
			default :	i++;
			break;
	
		}
		
	}
	
	/*
	*	feststellen, an welcher Position das TO steht
	*/
	
	z = teil.indexOf("to");
	
	i++;  		// = ueberlesen
	
	/*
	*	Test, ob TO vorhanden ist
	*	muss vorhanden sein
	*/
	
	if (z==-1){
		
		Aus.Aus();
		anzeige.schreiben("?SN ERROR"); 
		return;
	}
	
	/*
	*	Startwert einlesen
	*/
	
	while (i < z ) {
	
		varist += teil.charAt(i) + "";
		i++; 
		
	}
	
	varist = zahl.Berechnez(varist, anzeige, "0");
	
	// Sollberechnung
	
	z = teil.indexOf("step");
	
	/*
	*	Test, ob ein STEP vorhanden ist
	*	STEP ist optional
	*
	*	Endwert varsoll einlesen
	*	gegebenenfalls Schrittweite einlesen
	*/
	
	if (z==-1) { 						// es gibt kein STEP
	
		z=teil.length();
	
		i+=2;		// to ueberlesen
		
		/*
		*	Leerzeichen ueberlesen
		*/
		
		while ( i < z 
				&&
				teil.charAt(i)==' '){
		i++;
		}

		while ( i < z 
				&&
				teil.charAt(i)!=' '
				&&
				teil.charAt(i)!=':') {
	
			varsoll += teil.charAt(i);// + "";
			i++; 
		}
	
		varsoll = zahl.Berechnez(varsoll, anzeige,"0");
		varstep = "1";
		
	} else {							// es gibt ein STEP
		
		i+=2;		// to ueberlesen
		
		/*
		*	Leerzeichen ueberlesen
		*/
		
		while ( i < z 
				&&
				teil.charAt(i)==' '){
		i++;
		}

		while ( i < z 
				&&
				teil.charAt(i)!=' '
				&&
				teil.charAt(i)!=':') {
	
			varsoll += teil.charAt(i);// + "";
			i++; 
		}
		
		varsoll = zahl.Berechnez(varsoll, anzeige,"0");
		
			while ( i < z 
					&&
					teil.charAt(i)==' '){
				i++;
			}
		
		z = teil.length();
		i+=4;		//STEP ueberlesen

			while ( i < z 
					&&
					teil.charAt(i)==' '){
				i++;
			}

		while (i < z 
				&&
				teil.charAt(i)!=' '
				&&
				teil.charAt(i)!=':') {
	
			varstep += teil.charAt(i) + "";
			
			i++; 
	
		}
	
		varstep = zahl.Berechnez(varstep, anzeige, "0");
		
	} // ende else	
	
	/*
	*
	*	Variable in Variablen-Hash-Tabelle vermerken
	*/
	
	Ausfuehren.vartab.put(varname,varist);
	
	
	/*
	*	Leerzeichen bis zum moeglichen Doppelpunkt 
	*	(oder Zeilenende) ueberlesen
	*/
		while ( i < z 
				&&
				teil.charAt(i)==' '
				) {
			i++;
		}
		
	/*
	*	Zaehlerpositionen fuer NEXT vermerken
	*	und Zeiger des Teilstrings hochsetzen
	*/
	
	if (i<z
		&&
		teil.charAt(i)==':'){//i++;
		
		for_stack.push(String.valueOf(Ausfuehren.zaehler_teilstring+=i));

		for_stack.push(String.valueOf(Ausfuehren.z_zaehler-1));
		
	} else if (i>=z){
		
		Ausfuehren.zaehler_teilstring=Ausfuehren.teil_string.length();
		
		for_stack.push(String.valueOf(0));

		for_stack.push(String.valueOf(Ausfuehren.z_zaehler));
		
	} else {
		
		Aus.Aus();
		anzeige.schreiben("?SN ERROR"); 
		return;
	} // ende else
	
		for_stack.push(varname);
		for_stack.push(varsoll);
		for_stack.push(varstep);
	
	} 	catch (Exception e) {
			
			Aus.Aus();
			anzeige.schreiben("?SN ERROR"); 
			return;
	
	} // ende catch
	
	} // ende for

} // ende class For

