# Automaten implementieren



## Hecke (9. Sep 2010)

Hey Leute,
Ich stehe leider momentan mit dem Rücken zur Wand.

Ich soll als Hausaufgabe einen Automaten implementieren.

Folgende Klassen habe ich bis jetzt:

Automat:

```
//  Klasse zur Syntaxanalyse mit einem endlichen Automaten



public class Automat1   
{   
   String parseStrg;
   boolean ok = true;
   char zeichen;

    // Konstruktor 
   
    public Automat1 (String s)   
    {   
        parseStrg = s;
    }
    
    char cutFirst ()   
    {    
       if (parseStrg.length() == 0)
            return '$';
       else    
       {        
            char first =parseStrg.charAt(0);
            parseStrg=parseStrg.substring (1);
            return first;
       }
    }
    
    public boolean sagtJa ()
    {
        final int z0 = 0, z1 = 1, z2 = 2, z3 = 3, err = 4;
        zeichen = cutFirst ();
        int zustand = z0;
        while (zeichen != '$')
        {
            switch(zustand)
            {
                case z0: if(zeichen >= '0' && zeichen <= '9')
                             zustand = z1;
                         else
                             zustand = err;
                         break;
                case z1 :

                    break;
                default:

            }
        }
        return (ok & (zeichen =='$'));
    }
}
```

EinAus:

```
//  Einfache graphische Benutzeroberfläche für Programme zur Syntaxanalyse.

//

import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 

public class EinAus extends JFrame implements ActionListener 
{  
  
  private JTextField EingabeFeld, AusgabeFeld;
               
   public EinAus()   
   {  
     super("Syntaxanalyse durch Automaten");
      this.getContentPane().setBackground(Color.lightGray);
      this.getContentPane().setLayout(new FlowLayout());
      //Dialog-Button
      JButton button = new JButton("Analyse");
      button.setBackground(Color.red);
      button.addActionListener(this);
      this.getContentPane().add(button);
      //Ende-Button
      button = new JButton("Ende");
      button.setBackground(Color.red);
      button.addActionListener(this);
      this.getContentPane().add(button);
      //Eingabe-Textfeld
      EingabeFeld = new JTextField (20);
      this.getContentPane().add (EingabeFeld);
      //Ausgabe-Textfeld
      AusgabeFeld = new JTextField (20);
      this.getContentPane().add (AusgabeFeld);
   }

   public void actionPerformed(ActionEvent event)   
   {  
      String cmd = event.getActionCommand();
      String antwort, quelltext;
      if (cmd.equals("Analyse")) 
      {   
        String zeile = EingabeFeld.getText();
         //Erzeugen und Initialisieren des Automaten
         Automat1 meinAutomat = new Automat1 (zeile);
         if (meinAutomat.sagtJa())   
            AusgabeFeld.setText ("Ja");
        else
            AusgabeFeld.setText ("Nein");
      } 
      else if (cmd.equals("Ende")) 
      { 
        setVisible(false);
         dispose();
         System.exit(0);
      }
   }
}
```

Starter:

```
//  Starter für Programme zur Syntaxanalyse.

//

public class Starter   
{
   public static void main(String[] args)   
   {  
     EinAus wnd = new EinAus();
      wnd.setSize(600,400);
      wnd.setVisible(true);
   }  
}
```


Die Aufgabe lautet folgendermaßen:

```
Terminale Symbole sind die Ziffern 0-9, . , + , - und E.
Ein String über T gehört dann zur formalen Sprache L. wenn er eine Dezimalzahl 
in der üblichen Gleitkommaform mit maximal 2 Ziffern im Exponentialteil darstellt.
```



In "Automat1" muss ich doch jetzt wohl etwas bei dem switch und case verändern, damit der Automat überhaupt erst einmal funktioniert.
Wie ich dann aber zusätzlich noch das aufgabenspezifische erledigen soll, bleibt mir ein Rätsel!?


Vielen Dank!


----------



## Marcinek (9. Sep 2010)

```
zustand = 1;
error = false;
do {
  zeichen = nextZeichen();

   if(zustand == 1) {
       if(zeichen 1..9) {
          zustand = 1; // also kann man das weglassen
       }
       if(zeichen == "+") {
         zustand = 2;
       }
   } else if(zustand = 2) {
     if(zeichen 1..9) {
          zustand = 3;
       }
   } else if(zustand = 3)
    
   } else if(zustand = 4)

   }
while(zeichen != '$' && !error);

if(zustand == 5)

return true; // Wort akzeptiert else false
else false;
```


----------



## Marco13 (9. Sep 2010)

Kannst du die Frage irgendwie präzisieren? Ich denke, du wirst den String zerlegen und durch die Zustände wandern müssen...

```
while (zeichen != '$')
   switch (zeichen) { ... }

   if (zustant == err) break;
   zeichen = cutFirst();
}
```


----------



## XHelp (9. Sep 2010)

Naja, in deinem Automaten fehlen ein paar Zustände. Mal ihn dir erstmal auf, dann wirst du sehen was du noch machen musst.
Generell könntest du dir überlegen 
	
	
	
	





```
DFA
```
 Klasse zu machen, die allgemein ist und dann die mit Übergängen füttern, so dass du deinen gewünschten DFA bekommst.


----------



## Hecke (9. Sep 2010)

Ganz vielen Dank für eure Antworten.

Aber ich bin leider einfach zu dämlich dazu :'(

Ich probiere es die ganze Zeit mal so, mal so...

...läuft morgen wieder darauf hinaus, dass ich nichts vorweisen kann und mir wieder eine Sschlechte Note einhandel


----------



## Marcinek (9. Sep 2010)

ohh =(

Such mal die 7 Phasen des Bettlns um Hausaufgaben ^^


----------



## Hecke (9. Sep 2010)

Naja, stimmt auf mich doch aber nicht wirklich, finde ich.

Ich war doch nicht dreist, womit der erste Punkt schon widerlegt wäre


----------



## Marcinek (9. Sep 2010)

Möglicherweise überspringst du einige Phasen direkt ;D

Hast du den Automaten schon gezeichnet?

Uploade mal.

Ich kann dir Anbieten das in einem TS3 zu klären, habe gerade ehh nix zu tun


----------



## Hecke (9. Sep 2010)

Probiere geradfe zu zeichnen. Ja, TS3 wäre natürlich klasse, wenn du wirklich strapazierfähige Nerven hast


----------



## Gast2 (9. Sep 2010)

Schau mal hier:
http://www.java-forum.org/java-basics-anfaenger-themen/96832-dea-eingabewort.html


----------

