/* Legge un'espressione aritmetica che puo' contenere identificatori. Ne mostra la notazione postfissa. Calcola il risultato, dopo avere assegnato un valore agli identificatori presenti. Autore: Giovanni Pighizzini - Maggio 2006 - Aggiornamento: maggio 2014 */ import lt2.calc.*; import java.io.*; public class Calcolatrice { 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 //valutazione dell'albero: notazione postfissa System.out.println("Notazione postfissa : " + e.toString()); SymbolTable tabella = parser.getSymbolTable(); do { for (Descrittore d : tabella) { System.out.print("valore di " + d.getIdentificatore() + "? "); d.modificaValore(Integer.parseInt(in.readLine())); } //calcolo del risultato try { System.out.println("Risultato: " + e.calcola()); } catch (ArithmeticException e1) { System.err.println("Errore: divisione per zero!"); } System.out.print("Vuoi calcolare di nuovo l'espressione? (s/n) "); } while (in.readLine().charAt(0) == 's'); //test un po' rozzo... //...andrebbe raffinato } catch (EspressioneException e) { System.err.println(e.toString()); } } }