Hallo allerseits Ich implementiere derzeit eine einfache Programmiersprache für Lernerfahrung, aber ich brauche einen Rat. Momentan entwerfe ich meinen Interpreter und ich habe ein Problem.Implementieren einer stack-basierten virtuellen Maschine für eine Untergruppe von C
Meine Sprache ist eine Teilmenge von C und ich habe ein Problem in Bezug auf die Stack-Interpreter-Implementierung. In der Sprache wird die folgenden kompilieren:
somefunc()
{
1 + 2;
}
main()
{
somefunc();
}
Nun ist dies in Ordnung, aber wenn „1 + 2“ das Ergebnis berechnet wird, wird auf einen Stapel geschoben und dann die Funktion zurück, aber es gibt immer noch eine Reihe auf dem Stapel, und es sollte nicht sein. Wie kann ich dieses Problem umgehen?
Ich habe darüber nachgedacht, einen "state" des Stacks vor einem Funktionsaufruf zu speichern und den "state" nach dem Funktionsaufruf wiederherzustellen. Speichern Sie zum Beispiel die Anzahl der Elemente auf dem Stapel, führen Sie dann den Funktionscode aus, geben Sie zurück und dann aus dem Stapel, bis wir die gleiche Anzahl von Elementen wie zuvor haben (oder vielleicht +1, wenn die Funktion etwas zurückgibt).
Irgendwelche Ideen? Danke für irgendwelche Tipps!
Es ist lustig, dass Sie, weil In meiner AST-Darstellung habe ich einen Knoten namens "ASTStmtExpr" nur dafür! Ich glaube, ich beginne zu verstehen, irgendwie ... Hier ist, was ich unsicher bin: Aufgrund der Einschränkungen dieser Kommentar Antworten habe ich eine snipplet einzufügen: \t Leere Compiler :: Besuch (const ASTStmtExpr & expr_stmt, std :: shared_ptr func) \t \t { \t \t \t expr_stmt.expr() -> akzeptieren (* this, func); \t Sie sagen, ich sollte ein OP_POP danach hinzufügen, und für Dinge wie Zuweisungen würde ich ein dummy "Nil" -Objekt drücken, so dass es dann geknallt würde? –
Entschuldigung, ich wusste nicht, dass die Kommentare nicht formatiert sind. –
Für Zuweisungen nein, drücken Sie keinen Dummy-Wert, weil Sie das Ergebnis der Zuweisung bereits auf dem Stapel haben. Eine Zuweisung ist nur ein Ausdruck, der den Operator '=' verwendet, der sich nicht von '+' oder '-' unterscheidet, außer' = 'hat einen Nebeneffekt der Zuweisung zu einer Variablen. Ansonsten verhält es sich wie alle anderen Operatoren. –