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