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