import java.util.*;

public class Berechne_string {


Anzeige anzeige;

static Stack string_stack;		// Stack zur Ablage der Ergebnisse

static Berechne_string berechnes = new Berechne_string();

	public String Berechnes(String s, Anzeige anzeige){
	
	boolean plus = false;		// Flag um Zusammenfuegen von Strings 
								// zu kennzeichnen
								
	String hilf=""; 			// Hilfs-
	String hilf2="";			// variablen
	
	int i;						// Laufvariable fuer Schleifen
	
	string_stack = new Stack();
	
	this.anzeige = anzeige;
	
	/*
	*	uebergebenen String bearbeiten
	*/
	
		for (i=0; i<s.length(); i++){
		
			switch (s.charAt(i)) {
			
			/*
			*	es ist eine Zeichenkette
			*/
				case '\"': hilf=""; i++;
													
							while ( i < s.length()
									&&
									s.charAt(i)!='\"'){
						
								hilf += s.charAt(i);
										
								i++;
							} // ende while "
								
					/*
					*	soll zusammengefuegt werden ?
					*
					*	ja   -> Zeichenkette auf den Stack, damit sie
					*			bei der Ausgabe zusammengefuegt werden koennen
					*	nein -> Stack leeren und Zeichenkette ablegen
					*/
								
					if (plus==true){
									string_stack.push(hilf);
					} else {
								string_stack.removeAllElements();
								string_stack.push(hilf);
								} // ende else
								
							break;	
						
				case ' ': 	break;
				
				/*
				*	Signal fuer Zusammenfuegen von Strings
				*/
				
				case '+':	plus=true;
							break;
				
			/*
			*	Variable bearbeiten
			*
			*	Test auf Typkorrektheit
			*	Test auf reservierte Woerter
			*/
				
				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':	
					
						hilf2= "";
					
					//Varibalenname einelesen
						
						while(	i < s.length()
								&&
								s.charAt(i)!=' '
								&&
								s.charAt(i)!='+'){
						
							hilf2 += s.charAt(i);
							i++; 
						}
					
					// Schreibweise auf Kleinbuchstaben aendern
					
						hilf2=hilf2.toLowerCase();
						
					// Leerzeichen ueberlesen
					
						while(	i < s.length()
								&&
								s.charAt(i)==' '
								){
						
							i++; 
						}
		
						if (!hilf2.endsWith("$")){
		
							anzeige.schreiben("? TM ERROR");
							Aus.Aus();
							Print.endausgabe="";
		
							return "";
						} // ende if
						
						i--; 
						
					/*
					*	Test, ob Variablenname die nachfolgenden 
					*	reservierte Woerter
					*	enthaelt
					*
					*		- AT
					*		- FN
					*		- IF
					*		- LN
					*		- ON
					*		- OR
					*		- PI
					*		- TO
					*
					*	wenn ja, dann Syntax Error
					*/
		
						if (hilf2.indexOf("at")!=-1
							||
							hilf2.indexOf("fn")!=-1
							||
							hilf2.indexOf("if")!=-1
							||
							hilf2.indexOf("ln")!=-1
							||
							hilf2.indexOf("on")!=-1
							||
							hilf2.indexOf("or")!=-1
							||
							hilf2.indexOf("pi")!=-1
							||
							hilf2.indexOf("to")!=-1) {
			
							anzeige.schreiben("?SN ERROR");
							Aus.Aus();
							return "";
							
						} // ende if
						
					// 	Wert der Variablen holen
						
						hilf = (String)Ausfuehren.vartab.get(hilf2);
						
					// Test, ob Variable ueberhaupt definiert wurde
						
						if (hilf==null){
						
							hilf="";
									
						} // ende if
						
						
					//	Test, ob Strings addiert werden sollen
						
						if (plus==true){	
											// soll zusammengefuegt werden
								string_stack.push(hilf);
									
						} 	else {	// soll nicht zusammengefuegt werden
										
								string_stack.removeAllElements();
								string_stack.push(hilf);
								
							} // ende else
						
						break;
				
			/*
			*	einfache Zahlen (ohne von Anfuehrungsstrichen umgeben 
			*	zu sein) bei Stringoperationen
			*
			*	-> Typ-Error
			*/
				
				case '0': case '1': case '2': case '3': case '4': case '5': 
				case '6': case '7': case '8': case '9': case '-':
						
							anzeige.schreiben("? TM ERROR");
							Aus.Aus();
							Print.endausgabe="";
		
							return "";
				
				/*
				*	da war wohl etwas unbekanntes -> Error
				*/
					
				default:	anzeige.schreiben("? SN ERROR");
							Aus.Aus();
							Print.endausgabe="";
		
							return "";
							
			} // ende switch
			
		} // ende for
	
	return ausgabe();
	
	} // ende berechnes
	
/*
*	Ausgaberoutine
*
* 	der Stack wird leergeraeumt und dabei
*	werden die ausgelesenen Strings miteinander verknuepft
*/
	public String ausgabe(){
	
	String aus = "";
	int laenge,x;
	
	laenge = string_stack.size();
	 
			for (x=0; x<laenge; x++) {
				
				aus = (String)string_stack.pop() + aus;
				
				if (aus==null){aus="";}
			}
	
	return aus;	
	
	} // ende ausgabe

} // end class print


