/*
 * SyntaxOperand.java	01.07.99
 *
 *
 * Beilage zum Buch "Software-Entwurf mit UML"
 * von J.Seemann & J. Wolff von Gudenberg,
 * Springer-Verlag, 1999
 * 
 */

/** <i>Syntaxregel f&uuml;r Operanden (Details siehe Klasses SyntaxRegel)</i> */
 
public class SyntaxOperand extends SyntaxRegel 
{
   public SyntaxOperand(FormelParser p)  
   {
      super(p);
   }

   public void initProduktion()  {Produktion = parser.startRegel; }

   public Knoten parse() 
   {
      Knoten k = null;

      if (scanner.Symbol == scanner.TT_NUMBER)
      {
         // Aktion  
         k = new Konstante(scanner.nval);

         // naechstes Symbol
         scanner.nextSymbol();
      }

      else if (scanner.Symbol == scanner.TT_ADDRESS)
      {
         // Aktion  

         // Zelle heraussuchen
         //Zelle Referenz = Tabkalk.Tabelle().getZelle(scanner.sval); 
         k = new ZellenAdresse(scanner.sval);

         // naechstes Symbol
         scanner.nextSymbol();
      }

      else if (scanner.Symbol == scanner.TT_LPAREN)
      {
         scanner.nextSymbol();
         k = Produktion.parse();
         if (scanner.Symbol == scanner.TT_RPAREN)
         {
            scanner.nextSymbol();
         }
         else parser.errorOccured();
      }
      else if (scanner.Symbol == scanner.TT_FUNKTION)
      {
         Funktion f = (Funktion)FunktionManager.getFunktion(scanner.sval).fclone();
         k = f;
         scanner.nextSymbol();
         if (scanner.Symbol == scanner.TT_LPAREN)
         {
            scanner.nextSymbol();
            f.argument = Produktion.parse();
         }
         if (scanner.Symbol == scanner.TT_RPAREN)
         {
            scanner.nextSymbol();
         }
         else parser.errorOccured();
      }
      else 
      {
         parser.errorOccured();
         k = null;
      }   
      return k;
   }
   void aktion() {}
}