Hola a todos Actualmente estoy implementando un lenguaje de programación simple para la experiencia de aprendizaje, pero necesito algunos consejos. Actualmente estoy diseñando mi intérprete y he tenido un problema.Implementación de una máquina virtual basada en pila para un subconjunto de C
Mi lenguaje es un subconjunto de C y estoy teniendo un problema con respecto a la implementación del intérprete de la pila. En el lenguaje de la siguiente compilará:
somefunc()
{
1 + 2;
}
main()
{
somefunc();
}
Ahora bien, esto está bien, pero cuando "1 + 2" se calcula el resultado es empujado sobre una pila y luego se devuelve la función pero todavía hay un número en la pila, y no debería haber. ¿Cómo puedo evitar este problema?
He pensado en guardar un "estado" de la pila antes de una llamada de función y restaurar el "estado" después de la llamada a la función. Por ejemplo, guardando la cantidad de elementos en la pila, ejecuta el código de la función, regresa y luego sal de la pila hasta que tengamos la misma cantidad de elementos que antes (o quizás +1 si la función devuelve algo).
¿Alguna idea? Gracias por cualquier consejo!
Es curioso que lo nombre porque en mi representación de AST tengo un nodo llamado "ASTStmtExpr" solo para esto. Creo que estoy empezando a entender, más o menos ... Esto es de lo que no estoy seguro: Debido a las limitaciones de estas respuestas de comentarios, tengo para pegar una snipplet: \t vacío Compiler :: visita (const ASTStmtExpr y expr_stmt, std :: shared_ptr func) \t \t { \t \t \t expr_stmt.expr() -> aceptar (* esto, func); \t ¿Estás diciendo que debería agregar un OP_POP después de esto, y para cosas como asignaciones empujaría un objeto "Nil" ficticio para que se salte? –
Lo siento, no sabía que los comentarios no están formateados –
Para las asignaciones no, no inserta un valor ficticio, porque ya tendrá el resultado de la asignación en la pila. Una asignación es solo una expresión usando el operador '=', que no es diferente de '+' o '-' excepto' = 'tiene un efecto secundario de asignación a una variable. De lo contrario, se comporta como todos los demás operadores. –