Suche Home Einstellungen Anmelden Hilfe  

Zur Ordnungswirkung fundamentaler Ideen der Informatik am Beispiel der theoretischen Schulinformatik

Beispiel 3: LOGO für Arme

Eckart Modrow

Max-Planck-Gymnasium
Theaterplatz 10
37073 Göttingen
emodrow@astro.physik.uni-goettingen.de





Der Turtleinterpreter

Im Interpreter kann man ohne weitere Überprüfung davon ausgehen, dass alle erforderlichen Parameter etc. vorhanden sind. Die übergebene Programmzeile wird deshalb zeichenweise abgearbeitet, wobei bei Bedarf erforderliche Zahlen ermittelt werden. Danach wird der erkannte Befehl in den Aufruf einer Turtlemethode umgesetzt. Für diesen Zweck ist es erforderlich, dass dem Interpreter bei seiner Erzeugung mitgeteilt wird, welche Turtle die Anweisungen erhält. Ein einziger Interpreter kann also abwechselnd unterschiedliche Turtles steuern.

class Turtleinterpreter
{
  public Turtleinterpreter() //leerer Konstruktor
  {
  }

  public void fuehreAus(String s, Turtle t) //hier wird die Turtle festgelegt
  {
    int z;
    char c;
    while (s.length() != 0) //Befehl abarbeiten
    {
      c = s.charAt(0);
      s = s.substring(1);
      if (c == 'U') // das wird penUp
      {
        t.penUp();
        s = s.substring(1);
      }
      else if (c == 'D') // das wird penDown
           {
             t.penDown();
             s = s.substring(1);
           }
           else if (c == 'H') // das wird home
                {
                  t.home();
                  s = s.substring(1);
                }
                else if (c == 'C') // das wird clear
                     {
                       t.clear();
                       s = s.substring(1);
                     }
                     else if (c == 'M') // das wird move
                          {
                            z = 0; // Parameter zusammensuchen
                            do
                            {
                              c = s.charAt(0);
                              s = s.substring(1);
                              z = 10 * z + (int) c - (int) '0';
                            }
                              while ( (c >= '0') && (s.charAt(0) <= '9'));
                            t.move(z);
                            s = s.substring(1);
                          }
                          else if (c == 'T') // das wird turn
                               {
                                 z = 0;
                                 do
                                 {
                                   c = s.charAt(0);
                                   s = s.substring(1);
                                   z = 10 * z + (int) c - (int) '0';
                                 }
                                   while ( (c >= '0') && (s.charAt(0) <= '9'));
                                 t.turn(z);
                                 s = s.substring(1);
                               }
                               else if (c == 'R') // das wird repeat
                                    {
                                      z = 0;
                                      do
                                      {
                                        c = s.charAt(0);
                                        s = s.substring(1);
                                        z = 10 * z + (int) c - (int) '0';
                                      }
                                        while ( (c >= '0') && (s.charAt(0) <= '9'));
                                      s = s.substring(1);
                                      String h = "";
                                      while (s.charAt(0) != '}')
                                      {
                                        h = h + s.charAt(0);
                                        s = s.substring(1);
                                      }
                                      s = s.substring(1);
                                      for (int i = 0; i < z; i++)
                                      {
                                        fuehreAus(h, t); // siehe Kommentar!!!
                                      }
                                    }
    }
  }

}

Bei der Ausführung der Schleife wurde ein bisschen "gemogelt". Hier wird von den Rekursionsmöglichkeiten blockorientierter Sprachen Gebrauch gemacht - also ein Kellerautomat (der Stack) benutzt - obwohl wir die damit geschachtelten Strukturen eigentlich vermeiden wollten. Der Interpreter kann damit durchaus geschachtelte Schleifen ausführen. Der vorgeschaltete Parser verhindert (hier) aber noch, dass dieses geschieht.

Benutzer: gast • Besitzer: schwill • Zuletzt geändert am: