/* Legge un'espressione aritmetica che puo' contenere identificatori. Genera il codice, corrispondente all'espressione, eseguibile dalla macchina a stack. Autore: Giovanni Pighizzini - Maggio 2006 */ import lt2.calc.*; import java.io.*; import lt2.macchina.Codice; import static lt2.macchina.Macchina.*; public class Compilatore { public static void main(String[] args) throws IOException { //creazione del canale di input BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //lettura della stringa da esaminare System.out.print("Espressione? "); String s = in.readLine(); //creazione dell'analizzatore lessicale: la stringa riferita da s //e' vista come file di input Scanner scanner = new Scanner(new StringReader(s)); //creazione dell'analizzatore sintattico che utilizza come sorgente //di token l'analizzatore lessicale creato all'istruzione precedente ParserEspressioni parser = new ParserEspressioni(scanner); try { Expr e = parser.parse(); //costruzione dell'albero //generazione del codice SymbolTable tabella = parser.getSymbolTable(); Codice c = new Codice("eseguibile"); /* 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 */ e.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); c.fineCodice(); } catch (EspressioneException e) { System.err.println(e.toString()); } } }