Home > Informatik > Formale Sprachen > Folge 22: Codebuffer

22.2 Testen des Codebuffers

22.1 - 22.2 - 22.3

Ein primitiver Interpreter

Auf der letzten Seite haben wir einen einfachen Codebuffer implementiert. Ein Lesen des Stackcodes aus einer Textdatei findet hier noch nicht statt. Auf dieser Seite wollen wir diesen Codebuffer nun testen. Natürlich könnte man wieder eine Testklasse implementieren, die ein Objekt der Klasse Codebuffer sowie ein Objekt der Klasse Stackmachine enthält und die Zusammenarbeit dieser beiden Klassen testet. Eine solche Testklasse sähe einem "echten" Interpreter aber schon sehr ähnlich. Aus diesem Grund erscheint es sinnvoll, gleich einen einfachen Interpreter zu implementieren, allerdings ohne eine Variablenliste.

Das konkretere Entwurfsdiagramm

Hier ein möglicher Quelltext eines solchen einfachen Interpreters:

public class Interpreter
{
    Stackmachine SM;
    Codebuffer   CB;
    int          cmd;
    double       arg;
    
    public Interpreter()
    {
       SM = new Stackmachine();
       CB = new Codebuffer();
       CB.fill();
    }
    
    public void run()
    {
       while (! CB.EOF())
       {
          cmd = CB.getNextCmd();
          arg = CB.getNextArg();
          
          if (cmd == 1)            
             SM.push(arg);
          else if (cmd == 2)
             SM.add();
          else if (cmd == 3)
             SM.sub();
          else if (cmd == 4)
             SM.mul();
          else if (cmd == 5)
             SM.div();
             
          SM.show();
       }
    }
}

Die run-Methode überprüft zunächst, ob überhaupt noch Befehle im Codebuffer abzuarbeiten sind. Dazu wird die EOF-Methode aufgerufen. Wenn der Programcounter des Codebuffers am Ende angekommen ist, liefert EOF den Wert TRUE zurück. Solange das nicht der Fall ist, macht run-Methode weiter. Diese Methode müssen Sie übrigens noch für die Klasse Codebuffer implementieren.

Dann wird getNextCmd sowie getNextArg aufgerufen; die erhaltenen Werte werden dann in lokalen Variablen gespeichert. In dem obigen Beispiel liefert getNextCmd keinen String zurück, sondern eine Zahl. Sie müssen Ihren Interpreter entsprechend anpassen.

 
Übung 22.2-1
  1. Implementieren Sie den einfachen Interpreter.
  2. Ergänzen Sie die Klasse Stackmachine um eine show-Methode. Diese soll den Inhalt des Stacks in der Konsole ausgeben.
  3. Übersetzen Sie den folgenden Ausdruck in Stackcode:
    5 + (3.14 -2)*7 - 18/(3.14+2)
  4. Bauen Sie den Stackcode in die fill-Methode desCodebuffers ein.
  5. Lassen Sie den Interpreter diesen Stackcode abarbeiten.

Weiter mit 22.3 Ein besserer Codebuffer...