import java.io.*; import java.util.*; public class Calculette { private final Map operateurs = new HashMap(); public Calculette(Operateur [] ops) { for (int i = 0; i < ops.length; ++i) { operateurs.put(ops[i].symbole(), ops[i]); } } private double expression(StreamTokenizer st) throws IOException, SyntaxErrorException { switch (st.ttype) { case StreamTokenizer.TT_NUMBER: return st.nval; case StreamTokenizer.TT_WORD: Operateur op = (Operateur) operateurs.get(st.sval); if (op == null) { throw new SyntaxErrorException(st, "Opérateur inconnu"); } double [] operandes = new double[op.arite()]; for (int i = 0; i < op.arite(); ++i) { st.nextToken(); operandes[i] = expression(st); } return op.evaluer(operandes); default: throw new SyntaxErrorException(st); } } public void evaluer(Reader entree, PrintWriter sortie, boolean finDeLigne) throws SyntaxErrorException, IOException { StreamTokenizer st = new StreamTokenizer(entree); st.wordChars('!', '~'); st.eolIsSignificant(finDeLigne); st.nextToken(); while (st.ttype != StreamTokenizer.TT_EOF) { double valeur = expression(st); st.nextToken(); if (st.ttype != (finDeLigne? StreamTokenizer.TT_EOL : StreamTokenizer.TT_EOF)) { throw new SyntaxErrorException(st); } sortie.println(valeur); if (finDeLigne) { st.nextToken(); } } } public static final Operateur [] QUATRE_OPERATIONS = { new Operateur() { public String symbole() { return "+"; } public int arite() { return 2; } public double evaluer(double [] operandes) { return operandes[0] + operandes[1]; } }, new Operateur() { public String symbole() { return "-"; } public int arite() { return 2; } public double evaluer(double [] operandes) { return operandes[0] - operandes[1]; } }, new Operateur() { public String symbole() { return "*"; } public int arite() { return 2; } public double evaluer(double [] operandes) { return operandes[0] * operandes[1]; } }, new Operateur() { public String symbole() { return "/"; } public int arite() { return 2; } public double evaluer(double [] operandes) { return operandes[0] / operandes[1]; } } }; private static void usage() { System.err.println("java Calculette "); System.exit(1); } public static void main(String [] args) throws FileNotFoundException, IOException, SyntaxErrorException { if (args.length > 2) usage(); Calculette c = new Calculette(QUATRE_OPERATIONS); PrintWriter sortie = (args.length == 2 ? new PrintWriter(new FileWriter(args[1])) : new PrintWriter(System.out, true)); // autoflush if (args.length >= 1) { c.evaluer(new BufferedReader(new FileReader(args[0])), sortie, true); } else { BufferedReader entree = new BufferedReader(new InputStreamReader(System.in)); for (String s = entree.readLine(); s != null; s = entree.readLine()) { c.evaluer(new StringReader(s), sortie, false); } } sortie.close(); } }