import java.io.*; import java.util.*; class NumExpr { public static void main(String arg[]) { Map nameTab = new HashMap(); Scanner.readNext(); if (arg.length>0 && arg[0].equals("-testscanner")) { while (true) { System.out.print("Scanner: "+Scanner.curToken); if (Scanner.curToken == Token.nameToken) System.out.print(" '"+Scanner.curName+"'"); 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.nameToken, Token.numberToken); if (Scanner.curToken == Token.nameToken) { String name = Scanner.curName; Scanner.readNext(); if (Scanner.curToken == Token.assignToken) { // Expression is: = Scanner.readNext(); Scanner.check(Token.numberToken); nameTab.put(name, Scanner.curNumber); Scanner.readNext(); } else { // Expression is: if (! nameTab.containsKey(name)) Error.error("line "+Scanner.curLineNum, "Unknown name `"+name+"?!"); System.out.println(nameTab.get(name)); } } else { // Expression is: System.out.println(Scanner.curNumber); Scanner.readNext(); } Scanner.check(Token.semicolonToken); Scanner.readNext(); } } } } enum Token { assignToken, eofToken, nameToken, noToken, numberToken, semicolonToken; } class Scanner { public static Token curToken = Token.noToken; public static String curName = ""; 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 (isLetterAZ(curC)) { curName = readName(); curToken = Token.nameToken; return; } if (curC=='+' || curC=='-' || Character.isDigit(curC)) { curNumber = readNumber(); curToken = Token.numberToken; return; } if (curC == '=') { curToken = Token.assignToken; return; } if (curC == ';') { curToken = Token.semicolonToken; return; } if (Character.isWhitespace(curC)) { // Ignore white space. } else { Error.error("line "+curLineNum, "Illegal character ("+curC+")"); } } } } private static boolean isLetterAZ(char c) { return ('a'<=c && c<='z') || ('A'<=c && c<='Z'); } private static boolean isNameChar(char c) { return isLetterAZ(c) || Character.isDigit(c); } private static String readName() { int startPos = curPos-1; while (curPos