1  /**
  2     A class that can compute the value of an arithmetic expression.
  3  */
  4  public class Evaluator
  5  {
  6     private ExpressionTokenizer tokenizer;
  7  
  8     /**
  9        Constructs an evaluator.
 10        @param anExpression a string containing the expression
 11        to be evaluated
 12     */
 13     public Evaluator(String anExpression)
 14     {
 15        tokenizer = new ExpressionTokenizer(anExpression);
 16     }
 17  
 18     /**
 19        Evaluates the expression.
 20        @return the value of the expression.
 21     */
 22     public int getExpressionValue()
 23     {
 24        int value = getTermValue();
 25        boolean done = false;
 26        while (!done)
 27        {
 28           String next = tokenizer.peekToken();
 29           if ("+".equals(next) || "-".equals(next))
 30           {
 31              tokenizer.nextToken(); // Discard "+" or "-"
 32              int value2 = getTermValue();
 33              if ("+".equals(next)) { value = value + value2; }
 34              else { value = value - value2; }
 35           }
 36           else 
 37           {
 38              done = true;
 39           }
 40        }
 41        return value;
 42     }
 43  
 44     /**
 45        Evaluates the next term found in the expression.
 46        @return the value of the term
 47     */
 48     public int getTermValue()
 49     {
 50        int value = getFactorValue();
 51        boolean done = false;
 52        while (!done)
 53        {
 54           String next = tokenizer.peekToken();
 55           if ("*".equals(next) || "/".equals(next))
 56           {
 57              tokenizer.nextToken();
 58              int value2 = getFactorValue();
 59              if ("*".equals(next)) { value = value * value2; }
 60              else { value = value / value2; }
 61           }
 62           else 
 63           {
 64              done = true;
 65           }
 66        }
 67        return value;
 68     }
 69  
 70     /**
 71        Evaluates the next factor found in the expression.
 72        @return the value of the factor
 73     */
 74     public int getFactorValue()
 75     {
 76        int value;
 77        String next = tokenizer.peekToken();
 78        if ("(".equals(next))
 79        {
 80           tokenizer.nextToken(); // Discard "("
 81           value = getExpressionValue();
 82           tokenizer.nextToken(); // Discard ")"
 83        }
 84        else
 85        {
 86           value = Integer.parseInt(tokenizer.nextToken());
 87        }
 88        return value;
 89     }
 90  }