Ciao a tutti Attualmente sto implementando un semplice linguaggio di programmazione per l'esperienza di apprendimento ma ho bisogno di qualche consiglio. Attualmente sto progettando il mio interprete e ho avuto un problema.Implementazione di una macchina virtuale basata su stack per un sottoinsieme di C
La mia lingua è un sottoinsieme di C e sto riscontrando un problema relativo all'implementazione dello stack stack. Nel linguaggio del seguente compilerà:
somefunc()
{
1 + 2;
}
main()
{
somefunc();
}
Ora, questo va bene, ma quando "1 + 2" viene calcolato il risultato è spinto su una pila e quindi la funzione ritorna, ma c'è ancora un numero sullo stack, e non dovrebbe esserci. Come posso aggirare questo problema?
Ho pensato di salvare uno "stato" dello stack prima di una chiamata di funzione e di ripristinare lo "stato" dopo la chiamata di funzione. Ad esempio, salvando il numero di elementi sullo stack, quindi esegui il codice funzione, restituisci e poi fai un pop dallo stack finché non abbiamo lo stesso numero di elementi di prima (o forse +1 se la funzione ha restituito qualcosa).
Qualche idea? Grazie per eventuali suggerimenti!
È divertente che tu lo chiami perché nella mia rappresentazione AST ho un nodo chiamato "ASTStmtExpr" solo per questo! Penso che sto iniziando a capire, una specie di ... Ecco di cosa non sono sicuro: A causa delle limitazioni di queste risposte di commento ho incollare uno snipplet: \t vuoto Compiler :: visita (const ASTStmtExpr & expr_stmt, std :: shared_ptr func) \t \t { \t \t \t expr_stmt.expr() -> accettare (* questo, func); \t \t} Stai dicendo che dovrei aggiungere un OP_POP dopo questo, e per cose come i compiti spingerei un oggetto "Nil" fittizio in modo che venisse fatto scoppiare? –
Mi spiace non sapevo che i commenti non sono formattati –
Per gli incarichi no, non si preme un valore fittizio, perché si avrà già il risultato del compito sullo stack. Un assegnamento è solo un'espressione usando l'operatore '=', che non è diverso da '+' o '-', tranne' = 'ha un effetto collaterale di assegnazione a una variabile. Altrimenti si comporta come tutti gli altri operatori. –