/* RPN.java: use parser to convert to RPN * grammar: * P ---> E '#' * E ---> T {('+'|'-') T} * T ---> S {('*'|'/') S} * S ---> F '^' S | F * F ---> char | '(' E ')' */ class RPN { private int level = 0; private GetChar getChar = new GetChar(); private char next; private void P() { scan(); E(); if (next != '#') error(1); else System.out.println(); } private void E() { T(); while (next == '+' || next == '-') { char save = next; scan(); T(); gen(save); } } private void T() { S(); while (next == '*' || next == '/') { char save = next; scan(); S(); gen(save); } } private void S() { F(); if (next == '^') { scan(); S(); gen('^'); } } private void F() { if (Character.isLetter(next)) { gen(next); scan(); } else if (next == '(') { scan(); E(); if (next == ')') scan(); else error(2); } else { error(3); } } private void scan() { while (Character.isWhitespace(next = getChar.getNextChar())) ; } private void error(int n) { System.out.println("\n*** ERROR: " + n); System.exit(1); } private void gen(char ch) { System.out.print(ch); } public static void main(String[] args) { RPN rpn = new RPN(); rpn.P(); } }