Break, continue, return nachbauen

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:

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

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

ich hoffe es wurde irgendwie klar :smile:

Gruß
Bruno

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

Du bist ein Genie, das mit der Exception ist genial einfach und einfach genial :wink:

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