KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > expr > tree > Calculator


1 package expr.tree;
2
3 import java.io.IOException JavaDoc;
4 import java.io.StringReader JavaDoc;
5
6 import beaver.Symbol;
7 import beaver.Parser;
8
9 import expr.tree.ast.*;
10
11 class Calculator
12 {
13     static class Accumulator extends TreeWalker
14     {
15         double[] stack = new double[16]; // it's an example only!
16
int top = -1;
17
18         public void visit(ErrExpr expr)
19         {
20             stack[++top] = 0.0; // treat discarded expression as 0
21
}
22         
23         public void visit(NumExpr expr)
24         {
25             stack[++top] = (double) expr.value;
26 // System.out.println(stack[top]);
27
}
28
29         public void visit(NegExpr expr)
30         {
31             super.visit(expr);
32             double v = stack[top--];
33             stack[++top] = -v;
34 // System.out.println("+/-");
35
// System.out.println(stack[top]);
36
}
37
38         public void visit(MultExpr expr)
39         {
40             super.visit(expr);
41             double r = stack[top--];
42             double l = stack[top--];
43             stack[++top] = l * r;
44 // System.out.println("*");
45
// System.out.println(stack[top]);
46
}
47
48         public void visit(DivExpr expr)
49         {
50             super.visit(expr);
51             double r = stack[top--];
52             double l = stack[top--];
53             stack[++top] = l / r;
54 // System.out.println("/");
55
// System.out.println(stack[top]);
56
}
57
58         public void visit(PlusExpr expr)
59         {
60             super.visit(expr);
61             double r = stack[top--];
62             double l = stack[top--];
63             stack[++top] = l + r;
64 // System.out.println("+");
65
// System.out.println(stack[top]);
66
}
67
68         public void visit(MinusExpr expr)
69         {
70             super.visit(expr);
71             double r = stack[top--];
72             double l = stack[top--];
73             stack[++top] = l - r;
74 // System.out.println("-");
75
// System.out.println(stack[top]);
76
}
77
78         double getResult()
79         {
80             return stack[top];
81         }
82     }
83
84     static public void main(String JavaDoc[] args) throws IOException JavaDoc, Parser.Exception
85     {
86         ExpressionParser parser = new ExpressionParser();
87         ExpressionScanner input = new ExpressionScanner(new StringReader JavaDoc(args[0]));
88         Expr expr = (Expr) parser.parse(input);
89         Accumulator acc = new Accumulator();
90         expr.accept(acc);
91         System.out.println("= " + acc.getResult());
92     }
93 }
Popular Tags