package calculette; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.io.StreamTokenizer; import java.io.StringReader; public class Calculettes { public static final Calculette QUATRE_OPERATIONS = new Calculette( Operateurs.QUATRE_OPERATIONS); private Calculettes() { } private static void evaluer(Calculette calculette, Reader entree, PrintWriter sortie, boolean finDeLigne) throws ErreurSyntaxiqueException, IOException { StreamTokenizer st = new StreamTokenizer(entree); parametrageTokenizer(st); st.eolIsSignificant(finDeLigne); st.nextToken(); while (st.ttype != StreamTokenizer.TT_EOF) { double valeur = calculette.evaluerExpression(st); st.nextToken(); if (st.ttype != (finDeLigne ? StreamTokenizer.TT_EOL : StreamTokenizer.TT_EOF)) { throw new ErreurSyntaxiqueException(st); } sortie.println(valeur); if (finDeLigne) { st.nextToken(); } } } private static void parametrageTokenizer(StreamTokenizer st) { st.wordChars('!', '~'); } public static double evaluerExpression(Calculette calculette, String expression) throws IOException, ErreurSyntaxiqueException { StreamTokenizer st = new StreamTokenizer(new StringReader(expression)); parametrageTokenizer(st); st.eolIsSignificant(false); st.nextToken(); double valeur = calculette.evaluerExpression(st); st.nextToken(); if (st.ttype != StreamTokenizer.TT_EOF) { throw new ErreurSyntaxiqueException(st); } return valeur; } public static void evaluer(Calculette calculette, String entree, String sortie) throws IOException, ErreurSyntaxiqueException { Reader reader = new BufferedReader(new FileReader(entree)); PrintWriter writer = new PrintWriter(new FileWriter(sortie)); // autoflush evaluer(calculette, reader, writer, true); reader.close(); writer.close(); } public static void evaluer(Calculette calculette) throws IOException { PrintWriter writer = new PrintWriter(System.out, true); BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); for (String s = reader.readLine(); s != null; s = reader.readLine()) { try { evaluer(calculette, new StringReader(s), writer, false); } catch (ErreurSyntaxiqueException e) { System.err.println(e.getMessage()); } } reader.close(); writer.close(); } }