ten42% cat -n RPN.java 1 /* RPN.java: use parser to convert to RPN 2 * grammar: 3 * P ---> E '#' 4 * E ---> T {('+'|'-') T} 5 * T ---> S {('*'|'/') S} 6 * S ---> F '^' S | F 7 * F ---> char | '(' E ')' 8 */ 9 class RPN { 10 private int level = 0; 11 private GetChar getChar = new GetChar(); 12 private char next; 13 14 private void P() { 15 scan(); 16 E(); 17 if (next != '#') error(1); 18 else System.out.println(); 19 } 20 21 private void E() { 22 T(); 23 while (next == '+' || next == '-') { 24 char save = next; 25 scan(); 26 T(); 27 gen(save); 28 } 29 } 30 31 private void T() { 32 S(); 33 while (next == '*' || next == '/') { 34 char save = next; 35 scan(); 36 S(); 37 gen(save); 38 } 39 } 40 41 private void S() { 42 F(); 43 if (next == '^') { 44 scan(); 45 S(); 46 gen('^'); 47 } 48 } 49 50 private void F() { 51 if (Character.isLetter(next)) { 52 gen(next); 53 scan(); 54 } 55 else if (next == '(') { 56 scan(); 57 E(); 58 if (next == ')') scan(); 59 else error(2); 60 } 61 else { 62 error(3); 63 } 64 } 65 66 private void scan() { 67 while (Character.isWhitespace(next = getChar.getNextChar())) 68 ; 69 } 70 71 private void error(int n) { 72 System.out.println("\n*** ERROR: " + n); 73 System.exit(1); 74 } 75 76 private void gen(char ch) { 77 System.out.print(ch); 78 } 79 80 public static void main(String[] args) { 81 RPN rpn = new RPN(); 82 rpn.P(); 83 } 84 } ten42% cat -n GetChar.java 1 // GetChar: fetch next char 2 import java.io.*; 3 public class GetChar { 4 private Reader in; // name for input stream 5 6 // GetChar: constructor 7 public GetChar () { 8 in = new InputStreamReader(System.in); 9 } 10 11 // getNextChar: fetches next char 12 public char getNextChar() { 13 char ch = ' '; // keep compiler happy 14 try { 15 ch = (char)in.read(); 16 } catch (IOException e) { 17 System.out.println("Reading char"); 18 } 19 return ch; 20 } 21 } ten42% java RPN a + b + c + d # ab+c+d+ ten42% java RPN a^b^c^d# abcd^^^ ten42% java RPN (a + b*c)^(d/e - f)*g# abc*+de/f-^g* ten42% java RPN a + b c # ab+ *** ERROR: 1 ten42% java RPN ( (a + b)*c # ab+c* *** ERROR: 2 ten42% java RPN a + b ) # ab+ *** ERROR: 1 ten42% java RPN ((a)+(((b))))*((((c))))# ab+c* ten42% java RPN a + b*c^d + e# abcd^*+e+ ten42% java RPN a+b*c^d*e+f# abcd^*e*+f+ ten42% java RPN a^b*c+d*e^f# ab^c*def^*+