import lt2.macchina.Macchina; import lt2.macchina.Codice; import static lt2.macchina.Macchina.*; class ExprConTab { private SymbolTable tabella; private Expr espressione; public ExprConTab(Expr e, SymbolTable t) { tabella = t; espressione = e; } public void generaCodice(Codice c) { /* PRIMA PARTE: assegna gli indirizzi alle variabili */ int proxIndirizzo = 0; for (Descrittore d : tabella) proxIndirizzo = d.assegnaIndirizzo(proxIndirizzo); /* SECONDA PARTE: genera il codice per riservare lo spazio per le variabili Per la costruzione della calcolatrice le variabili vengono inizializzate leggendo i valori da input. Nella parte commentata (che si adatta anche ad array) sono invece inizializzate a zero */ for (Descrittore d : tabella) { //for (int j = 0; i < d.getLunghezza(); j++) // c.genera(PUSHIMM, 0); String id = d.getIdentificatore(); //genera le istruzioni per stampare il nome //della variabile e leggerne il valore for (int k = 0; k < id.length(); k++) { c.genera(PUSHIMM, id.charAt(k)); c.genera(OUTPUTCH); } c.genera(PUSHIMM, '?'); c.genera(OUTPUTCH); c.genera(PUSHIMM, ' '); c.genera(OUTPUTCH); c.genera(INPUT); } /* TERZA PARTE: genera il codice per valutare l'espressione */ espressione.generaCodice(c); /* QUARTA PARTE: genera il codice per stampare il risultato e termina l'esecuzione */ c.genera(OUTPUT); c.genera(PUSHIMM, '\n'); //ritorno a capo c.genera(OUTPUTCH); c.genera(HALT); } public String toString() { return espressione.toString(); } }