Come valuti espressioni matematiche arbitrarie usando variabili temporanee invece di uno stack? Quello di cui sto parlando è tradurre un'espressione in una serie di semplici operazioni, ognuna delle quali modifica una variabile in base al secondo argomento.
Un esempio di elenco di operazioni potrebbe essere:
=
+=
-=
*=
/=
Si noti come ogni operazione cambia il primo argomento. (nessuno di loro "restituisce" nulla)
Ecco una semplice espressione: (ho postfix con la profondità scritta anche sotto)
x=2+a*(b+c)
x 2 a b c + * + =
0 1 2 3 4 3 2 1 0
x=c
x+=b
x*=a
x+=2
Nota come non hai bisogno di variabili temporanee.
Ecco un'espressione che richiede una variabile temporanea:
x=a*(b+c)+d*(e+f)
x a b c + * d e f + * + =
0 1 2 3 2 1 2 3 4 3 2 1 0
x=b
x+=c
x*=a
tmp=e
tmp+=f
tmp*=d
x+=tmp
Non riesco a capire una soluzione algoritmica per ottenere questi gruppi di operazioni. La necessità di variabili temporanee sembra avere qualcosa a che fare con gli operatori con precedenza inferiore che hanno come risultato gli operatori con precedenza più alta come argomenti, ma non posso dirlo.
Mi sento stupido ... Il modo mi sembra giusto ma non riesco a vederlo. Ovviamente si potrebbe fare il modo "facile"; AKA, crea una variabile temporanea per archiviare il risultato di ogni operazione in modo che nessuna operazione sia distruttiva per qualsiasi cosa eccetto ciò che hai messo prima del =
, ma questo è male e non mi piace. Come puoi ottenere "l'algoritmo" per un'espressione nella forma più semplice?
EDIT: A causa della mia stessa ambiguità, devo chiarire che uno stack è permesso in translation , ma non nel linguaggio psuedo di fine che sto producendo.