/* * Copyright (c) 2008, Manuel Mausz * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the copyright holders nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ import java.util.Scanner; /** * Implements a simple RPN (UPN) Calculator * - Parses the given input syntax * - passes them to the RPN Calculator * - and prints the specified (tho completely non-informative) error messages * * @version 1.0 * @author Manuel Mausz (manuel at mausz.at) * @author http://manuel.mausz.at/ */ class UpnApplication { private static UpnCalculator calc = new UpnCalculator(); /** * read operands and operator from first line of src * parses RPN syntax; only allows integers as operands * prints "?" to stdout if calculations fails * * @param src input stream * @return boolean true on success, false otherwise */ private static boolean parse(java.io.InputStream src) { Scanner scan; /* get first line only */ scan = new Scanner(src); if (!scan.hasNextLine()) { scan.close(); return false; } String line1 = scan.nextLine(); scan.close(); /* parse first line */ scan = new Scanner(line1); boolean err = false; while(!err && scan.hasNext()) { /* pass operand or operator to UpnCalculator */ if (scan.hasNextInt()) calc.addOperand(scan.nextInt()); else if (scan.hasNext()) { String op = scan.next(); if (!calc.supportsOperator(op)) err = true; else if (!calc.addOperator(op)) System.out.println("?"); } else err = true; } scan.close(); return !err; } /** * main method * * @param args not used */ public static void main(String args[]) { /* try-catch for the sake of safety */ try { /* dump RPN stack of everything was ok */ if (parse(System.in)) System.out.print(calc); else System.out.println("FALSCHE EINGABE"); } catch(Throwable e) { System.out.println("FALSCHE EINGABE"); } } }