/* 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();
   }
}

