import java.io.*; class SimpleNumExpr { public static void main(String arg[]) { Scanner.readNext(); if (arg.length>0 && arg[0].equals("-testscanner")) { while (true) { System.out.print("Scanner: "+Scanner.curToken); if (Scanner.curToken == Token.numberToken) System.out.print(" "+Scanner.curNumber); System.out.println(); if (Scanner.curToken == Token.eofToken) break; Scanner.readNext(); } } else { while (true) { if (Scanner.curToken == Token.eofToken) break; Scanner.check(Token.numberToken); System.out.println(Scanner.curNumber); Scanner.readNext(); Scanner.check(Token.semicolonToken); Scanner.readNext(); } } } } enum Token { eofToken, noToken, numberToken, semicolonToken; } class Scanner { public static Token curToken = Token.noToken; public static long curNumber = 0; public static int curLineNum = 0; private static LineNumberReader stdIn = new LineNumberReader(new InputStreamReader(System.in)); private static String curLine = ""; private static int curPos = 0; public static void readNext() { curToken = Token.noToken; while (curToken == Token.noToken) { if (curPos >= curLine.length()) { try { curLine = stdIn.readLine(); ++curLineNum; } catch (IOException e) { Error.error("Read error!"); } if (curLine == null) { curToken = Token.eofToken; return; } curLine += " "; curPos = 0; } else { char curC = curLine.charAt(curPos++); if (curC=='+' || curC=='-' || Character.isDigit(curC)) { curNumber = readNumber(); curToken = Token.numberToken; return; } if (curC == ';') { curToken = Token.semicolonToken; return; } if (Character.isWhitespace(curC)) { // Ignore white space. } else { Error.error("line "+curLineNum, "Illegal character ("+curC+")"); } } } } private static long readNumber() { String n = ""+curLine.charAt(curPos-1); while (Character.isDigit(curLine.charAt(curPos))) n += curLine.charAt(curPos++); try { return Long.parseLong(n.startsWith("+") ? n.substring(1) : n); } catch (NumberFormatException e) { Error.error("line "+Scanner.curLineNum, "Illegal number: `"+n+"?!"); } return 0; // Will never be run! } static void check(Token t1) { if (curToken != t1) Error.error("line "+curLineNum, "Expected a "+t1+" but found a "+curToken); } } class Error { static public void error(String where, String message) { System.out.println("Error" + (where.equals("") ? "" : " in "+where) + ": " + message); System.exit(1); } static public void error(String message) { error("", message); } }