/* Questa classe e' l'interfaccia tra il compilatore e il file eseguibile. Per semplicita' il codice viene memorizzato in un array e trascritto alla fine sul file. In realta', poiche' la dimensione dell'eseguibile puo' essere notevole, sarebbe opportuno generare direttamente il codice sul file, utilizzando per il file la classe RandomAccessFile che permette l'accesso diretto. Revisione Maggio 2015 */ package lt.macchina; import java.io.*; public class Codice { private int[] eseguibile; //array destinato a contenere il codice eseguibile private int indProsIstr = 0; //indirizzo della prossima istruzione che verra' generata private String nomeEseguibile;//nome del file in cui verra' posto l'eseguibile private static int MAX = 10000; //lunghezza max eseguibile /* Costruttore: riceve come parametro il nome del file in cui porre l'eseguibile */ public Codice(String s) { eseguibile = new int[MAX]; nomeEseguibile = s; } /* aggiunge all'eseguibile l'istruzione specificata mediante il parametro */ public void genera(int istr) { eseguibile[indProsIstr++] = istr; } /* aggiunge all'eseguibile l'istruzione specificata mediante il primo parametro, con l'operando specificato mediante il secondo */ public void genera(int istr, int oper) { eseguibile[indProsIstr++] = istr; eseguibile[indProsIstr++] = oper; } /* aggiunge all'eseguibile l'istruzione specificata mediante il parametro, lasciando uno spazio contenente zero per l'operando; restituisce come risultato l'indirizzo dell'operando; in questo modo sara' possibile inserire l'operando in un secondo tempo utilizzando il metodo completaIstruzione */ public int generaParziale(int istr) { eseguibile[indProsIstr++] = istr; eseguibile[indProsIstr] = 0; return indProsIstr++; } /* restituisce l'indirizzo a cui verra' generata la prossima istruzione */ public int indirizzoProssimaIstruzione() { return indProsIstr; } /* assegna nella posizione indicata dal primo parametro, il valore del secondo */ public void completaIstruzione(int posizione, int valore) { eseguibile[posizione] = valore; } /* trascrive il codice generato sul file di nome nomeEseguibile */ public void fineCodice() throws IOException { ObjectOutputStream outFile = new ObjectOutputStream(new FileOutputStream(nomeEseguibile)); for (int i = 0; i < indProsIstr; i++) outFile.writeInt(eseguibile[i]); outFile.flush(); outFile.close(); } }