diff --git a/expressions.txt b/expressions.txt
index 55a3a7cdea25a3ba43c49de00c3db8a30cb5d121..ce8c3191ffe8a76591b61e18918ca84ccca458b3 100644
--- a/expressions.txt
+++ b/expressions.txt
@@ -1,4 +1,6 @@
-1 + x*y^2 - (31 * x)-y
-1 + x^2 - (3 * x)
-2-x + 0.5*x^2 - 1
-(5*2-(5^2)+3*(201.01-15))
\ No newline at end of file
+5
+x
+4+2
+3+(2^3)
+2*2*2+3
+(23+2*(2*3))-5
\ No newline at end of file
diff --git a/src/Application.java b/src/Application.java
index f185a6a8f6ba5b39558371e3fefc57df22e5a822..096051b99b3a5c4a4cfc0d1b82f2acabaf3d8ab4 100644
--- a/src/Application.java
+++ b/src/Application.java
@@ -41,7 +41,9 @@ public class Application {
             try {
                 Parser.Expression exp = parser.parse(tokens);
                 ASTPrinter printer = new ASTPrinter();
+                Evaluator evaluator = new Evaluator();
                 System.out.println("Printing: '" + printer.visit(exp) + "'");
+                System.out.println("Evaluating: '" + evaluator.visit(exp) + "'");
             }
             catch (ParserException e) {
                 System.out.println(e.getMessage());
diff --git a/src/Evaluator.java b/src/Evaluator.java
index 4599b7036ea36fd5a8825cca321eded9e1a01089..2c65e1b3215c13fd68f65a2f7277af197c1efc4f 100644
--- a/src/Evaluator.java
+++ b/src/Evaluator.java
@@ -1,2 +1,59 @@
-public class Evaluator {
+public class Evaluator implements Visitor<Double>{
+
+    @Override
+    public Double visit(final Parser.BinaryOperation binaryOP) {
+        double result = binaryOP.leftExpression.accept(this);
+        double rOperand = binaryOP.rightExpression.accept(this);
+        switch (binaryOP.operator.charAt(0)) {
+            case '+':
+                result += rOperand;
+                break;
+            case '-':
+                result -= rOperand;
+                break;
+            case '*':
+                result *= rOperand;
+                break;
+            case '/':
+                if (rOperand != 0) {
+                    result /= rOperand;
+                }
+                else {
+                    result = result;
+                    //throw new ArithmeticException("Arithmetic Error: division by zero detected");
+                }
+                break;
+            case '^':
+                for(int i=1; i<rOperand; i++) {
+                    result = result*result;
+                }
+                break;
+            default:
+                throw new RuntimeException("SematicError: unknown operand found in AST: "
+                + binaryOP.operator);
+        }
+        return result;
+    }
+
+    @Override
+    public Double visit(final Parser.Variable variable) {
+        return 0.0;
+    }
+
+    @Override
+    public Double visit(final Parser.Number number) {
+        return Double.valueOf(number.digits);
+    }
+
+    @Override
+    public Double visit(final Parser.Decimal decimal) {
+        return Double.valueOf(decimal.afterDot.digits + "." + decimal.beforeDot.digits);
+    }
+
+    public double visit(final Parser.Expression ast) {
+        if(ast==null) {
+            return 0.0;
+        }
+        return ast.accept(this);
+    }
 }