/** Die Klasse "Postfix" beinhaltet Methoden zum bearbeiten von mathematischen
Ausdrücken im sogenannten "Postfix-Format".
Fabian Wleklinski 1999
**/

class Postfix {
	  /**
	  Parst einen String mit einem mathematischen Ausdruck im Postfix-Format
	  und berechnet das Ergebnis
	  **/
	  static public float valueOf( String src ) {

	  	// Temporärer Stack für Integer-Werte
	  	FloatStack buf = new FloatStack( 10, 10 );

	  	float   op_1;
	  	float   op_2;
	  	char    c;
	  	Operator operator;

	  	// Zeichen für Zeichen des Strings abarbeiten
	  	for (int i=0; i < src.length(); i++) {
	  	  // das nächste Zeichen aus dem Quell-String lesen
 			  c = src.charAt( i );

	  		operator = null;

	  		// Alle Möglichkeiten durchgehen
		  	switch (c) {
			  	case '0' :
		      case '1' :
				  case '2' :
				  case '3' :
				  case '4' :
				  case '5' :
				  case '6' :
				  case '7' :
				  case '8' :
				  case '9' : {
				      String temp = new String();
				      temp = temp + c;

					  buf.push( Float.valueOf( temp ).floatValue() );
					  break;
				  }

				  case '+' : {
				  	operator = new Addition();
				  	break;
				  }
				  case '-' : {
				  	operator = new Subtraction();
				  	break;
				  }
				  case '*' : {
				  	operator = new Multiplication();
				  	break;
				  }
				  case '/' : {
				  	operator = new Division();
				  	break;
				  }

		  	  case ' ' : break;

			    default :
			  	  // Fehler  -->  Exception
			  	  throw new NoPostfixExpressionException();
		    }

	  		// Wenn Operator, dann ausführen ...
	  		if (operator != null) {
	  			// Werte vom Stack lesen
	  			operator.readArguments( buf );
	  			// Ergebnis berechnen
	  			float op_new = operator.valueOf();
	  			// Ergebnis pushen
	  			buf.push( op_new );
	  		}

		  }

	  	// Wenn weniger oder mehr als ein Wert auf dem Stack liegt, ist ein
	  	// Fehler aufgetreten. Hier noch Abfrage hin ..

	  	return buf.pop();
	  }
}

/**
Die Klasse "NoPostfixExpressionException" enthält eine Exception, die ausgelöst wird, wenn
versucht wird, Postfix-Methoden auf einen String anzuwenden, der nicht als Postfix erkannt
werden kann.
Fabian Wleklinski 1999.
**/

class NoPostfixExpressionException extends RuntimeException {
  public NoPostfixExpressionException()	{
  	super();
  }
}