break, continue, return nachbauen

Von: , Frage gestellt am Do, 1. Nov 2001

Hallo,

wie schonmal beschrieben, baue ich gerade an einer Art Interpreter für java-ähnlichen Code (den ich zur Visualisierung von Sortieralgorithmen benutze).

Ich komme einigermassen gut voran, habe aber gerade Probleme mit dem abrupten Aussteigen aus einer Funktion oder Schleife durch break, continue, return.

Wie kann man sowas nachbauen?

Im Wesentlichen sieht es so aus, dass ich einen riesigen Syntaxbaum habe, den ich rekursiv durchlaufe...
nur ich kapiere gerade nicht, wie ich wenn ich auf einmal in einer Folge von Statements auf ein return stosse, dann die Kontrolle an den entsprechenden punkt zurückgeben kann und dies kann eben 3-4 Funktionen früher im Callstack gewesen sein, z.b. bei einem return sieht der Code z.b. so aus

funktionsname()
{
if (bla) return;
}


dann habe ich in meinem Baum etwa drei Objekte von diesen Typen

Funktion
|-If
|- Return


und so einen Callstack:

3. Return.execute()
2. If.execute()
1. Function.execute()

nun muss ich irgendwie von 3 nach 1 springen ohne dass 2 weitere Dinge ausführt...

ich hoffe es wurde irgendwie klar :)

Gruß
Bruno

2 Antworten zu dieser Frage

  1. Antwort von nach 5 Stunden 0 hilfreich
    Re: break, continue, return nachbauen

    Mir würden drei Methoden einfallen:

    1) execute() wirft für solche Abbrüche Exceptions, das aufrufende execute() muss die Exception dementsprechend behandeln. Im Falle des returns mußt du den Rückgabewert in der Exception transportieren. Das if würde einfach die weiteren Statements innerhalb des Blocks ignorieren und die Exception weiterwerfen, die Funktion kann die Exception fangen, den Rückgabewert auslesen und zurückgeben.

    2) So wie oben nur über einen Rückgabewert von execute()

    3) Jedes Objekt kennt die anderen Objekte im Callstack, die Objekte für return/break/continue könnten dann die Kontrolle direkt an das entsprechende Objekt weitergeben, in deinem Beispiel wird dann das If übergangen und direkt an die Funktion weitergegeben.

    Grüße, Robert

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: break, continue, return nachbauen

      Du bist ein Genie, das mit der Exception ist genial einfach und einfach genial ;)

      Die 3. Lösung habe ich überhaupt nicht verstanden bzw. denke nicht dass sie geht, aber egal... Nr 1) gefällt mir hervorragend

      Thx
      bru

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!