CS 3723, Program for Mid-term Exam
/* Paren.java:
 * grammar:
 *   P ---> E '$'
 *   E ---> T {('+'|'-') T}
 *   T ---> S {('*'|'/') S}
 *   S ---> F '^' S | F
 *   F ---> char | '(' E ')'
 */
public class Paren {
   private GetNext getChar = new GetNext();
   private char next;

   public String P() {
      String res;
      scan();
      res = E();
      if (next != '$') return "ERROR";
      else return res;
   }

   private String E() {
      String res;
      char save;
      res = T();
      while (next == '+' || next == '-') {
         save = next;
         scan();
         res = "[" + res + save + T() + "]";
      }
      return res;
   }

   private String T() {
      String res;
      char save;
      res = S();
      while (next == '*' || next == '/') {
         save = next;
         scan();
         res = "[" + res + save + S() + "]";
      }
      return res;
   }

   private String S() {
      String res;
      res = F();
      if (next == '^') {
         scan();
         res = "[" + res + "^" + S() + "]";
      }
      return res;
   }
   private String F() {
      String res = "";
      if (Character.isLetterOrDigit(next)) {
         res = next + "";
         scan();
      }
      else if (next == '(') {
         scan();
         res = E();
         if (next == ')') {
            scan();
         }
         else {
            error(2);
            res = "ERROR";
         }
      }
      else {
         error(3);
         res = "ERROR";
      }
      return res;
   }

   private void scan() {
      while (Character.isWhitespace(next = 
             getChar.getNextChar()))
         ;
   }

   private void error(int n) {
      System.out.println("*** ERROR: " + n);
      System.exit(1);
   }

   public static void main(String[] args) {
      Paren paren = new Paren();
      String res = paren.P();
      System.out.println(res);
   }
}
% javac GetNext.java
% javac Paren.java
% java Paren
1 + 2 * 3 $
[1+[2*3]]
% java Paren
(1 + (2 * 3) )$
[1+[2*3]]
% java Paren
1*(2+3)$
[1*[2+3]]