1 package expr.tree; 2 3 import java.io.IOException ; 4 import java.io.StringReader ; 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]; int top = -1; 17 18 public void visit(ErrExpr expr) 19 { 20 stack[++top] = 0.0; } 22 23 public void visit(NumExpr expr) 24 { 25 stack[++top] = (double) expr.value; 26 } 28 29 public void visit(NegExpr expr) 30 { 31 super.visit(expr); 32 double v = stack[top--]; 33 stack[++top] = -v; 34 } 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 } 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 } 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 } 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 } 77 78 double getResult() 79 { 80 return stack[top]; 81 } 82 } 83 84 static public void main(String [] args) throws IOException , Parser.Exception 85 { 86 ExpressionParser parser = new ExpressionParser(); 87 ExpressionScanner input = new ExpressionScanner(new StringReader (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 |