Sto provando a scrivere un compilatore per una CPU auto-progettata con un set di istruzioni di accompagnamento. La CPU ha 3 registri, 2 registri di ingresso (B e C) e un registro di uscita (D). Quando ad esempio viene eseguita un'istruzione ADD, la somma di B e C viene calcolata e memorizzata in D.
Sto cercando di scrivere il compilatore con il modello di progettazione dei visitatori: ho un sacco di classi di corsi di lingue come "IfStatement", "Addition", "Integer" e un visitatore "Compiler". Il visitatore guarderebbe ciascun nodo dell'albero e aggiungerà bytecode alla fine dell'elenco di byte. Non riesco a capire come gestire in modo pulito le sostituzioni del registro: durante la valutazione dell'espressione
2*(7+3)
il codice byte generato è
PUTb 2
PUTb 7
PUTc 3
ADD
MOVE D C
MUL
Come puoi vedere il 2 è sovrascritto dal 7. Voglio che il compilatore capisca che può invertire l'ordine in
(7+3)*2
o che può memorizzare un risultato temporaneo è RAM, usando alcune altre istruzioni, questo sarà certamente necessario per espressioni più complesse come
(7-5)*(8+3)
Esiste un modo pulito / orientato agli oggetti per gestirlo? Il pattern Visitor non è appropriato qui? Devo osservare alcune tecniche avanzate come la colorazione della registrazione? Il compilatore sarà scritto in Java, ma non credo che importi davvero.