Привет всем Я в настоящее время внедряю простой язык программирования для обучения, но мне нужен совет. В настоящее время я разрабатываю свой интерпретатор, и у меня возникла проблема.Реализация виртуальной машины на основе стека для подмножества C
Мой язык - это подмножество C, и у меня возникла проблема с реализацией стекового интерпретатора. На языке следующее скомпилируется:
somefunc()
{
1 + 2;
}
main()
{
somefunc();
}
Теперь это хорошо, но когда «1 + 2» вычисляется результат помещается в стек, а функция возвращает, но есть еще ряд в стеке, и не должно быть. Как я могу обойти эту проблему?
Я думал о сохранении «состояния» стека перед вызовом функции и восстановлении «состояния» после вызова функции. Например, сохраняя количество элементов в стеке, затем выполните код функции, верните, а затем поместите из стека до тех пор, пока мы не будем иметь такое же количество элементов, как раньше (или, может быть, +1, если функция вернула что-то).
Любые идеи? Спасибо за любые советы!
Забавно, что вы это называете, потому что в моем представлении AST у меня есть узел под названием «ASTStmtExpr» только для этого! Я думаю, что я начинаю понимать, вроде ... Вот о чем я не уверен: Из-за ограничений этих комментариев ответа у меня есть приклеить snipplet: \t аннулируются составители :: визит (Const ASTStmtExpr & expr_stmt, станд :: shared_ptr FUNC) \t \t { \t \t \t expr_stmt.expr() -> принимает (* это, FUNC); \t \t} Вы говорите, что после этого я должен добавить OP_POP, и для таких вещей, как присваивания, я бы нажал на фиктивный объект «Nil», чтобы затем его выскочить? –
Извините, что я не знал, что комментарии не отформатированы –
Для присвоений нет, вы не нажимаете фиктивное значение, потому что у вас уже будет результат назначения в стеке. Назначение - это просто выражение, использующее оператор '=', который ничем не отличается от '+' или '-', кроме' = 'имеет побочный эффект назначения переменной. В противном случае он ведет себя так же, как и все остальные операторы. –