diff --git a/expressions.txt b/expressions.txt
index 55a3a7cdea25a3ba43c49de00c3db8a30cb5d121..956089d3b8d3ba88c9d22f8958713a1d48b6d3a6 100644
--- a/expressions.txt
+++ b/expressions.txt
@@ -1,4 +1,2 @@
-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
+1+(x^2)-(3*x)
+2*x+0.5*(x^2)-1
\ No newline at end of file
diff --git a/lib/JChart.jar b/lib/JChart.jar
new file mode 100644
index 0000000000000000000000000000000000000000..720f3fe02bcb1a5a9abc66553589b150c10770ec
Binary files /dev/null and b/lib/JChart.jar differ
diff --git a/src/ASTPrinter.java b/src/ASTPrinter.java
index a057d9a4f785a696f8f54321a09256f3e8d2ca83..8983653899e5b1c2c6fe66545fb25a77a9a60614 100644
--- a/src/ASTPrinter.java
+++ b/src/ASTPrinter.java
@@ -5,9 +5,19 @@ public class ASTPrinter implements  Visitor<String>{
         if(binaryOP.capsuled) {
             sb.append("(");
         }
-        sb.append(binaryOP.leftExpression.accept(this));
-        sb.append(binaryOP.operator);
-        sb.append(binaryOP.rightExpression.accept(this));
+        if(binaryOP.operator.contains("^")) {
+            sb.append("Pow(");
+            sb.append(binaryOP.leftExpression.accept(this));
+            sb.append(",");
+            sb.append(binaryOP.rightExpression.accept(this));
+            sb.append(")");
+        }
+        else {
+            sb.append(binaryOP.leftExpression.accept(this));
+            sb.append(binaryOP.operator);
+            sb.append(binaryOP.rightExpression.accept(this));
+        }
+
         if(binaryOP.capsuled) {
             sb.append(")");
         }
diff --git a/src/Application.java b/src/Application.java
index f185a6a8f6ba5b39558371e3fefc57df22e5a822..b25cd9ffc6a1585f394ddb33f6508b39db69ceef 100644
--- a/src/Application.java
+++ b/src/Application.java
@@ -1,14 +1,11 @@
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
 public class Application {
     public static void main(String[] args) {
-        //LinkedList<String> expressions = new LinkedList<>()
-        //LinkedList<String> expressions = new List<>();
         List<String> expressions = new LinkedList<>();
         //Reads the file "expressions.txt" and adds its values to a list
         BufferedReader reader;
@@ -41,7 +38,11 @@ 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) + "'");
+                String s = printer.visit(exp);
+                System.out.println("Evaluating: '" + evaluator.visit(exp) + "'");
+                SwingFunctionPlotter.plotFunction(s);
             }
             catch (ParserException e) {
                 System.out.println(e.getMessage());
diff --git a/src/Evaluator.java b/src/Evaluator.java
index 4599b7036ea36fd5a8825cca321eded9e1a01089..b9979c778266a973dd424cf79e7eea1769dfcd1b 100644
--- a/src/Evaluator.java
+++ b/src/Evaluator.java
@@ -1,2 +1,63 @@
-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);
+        if(rOperand==null) {
+
+
+        }
+        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);
+    }
 }
diff --git a/src/SwingFunctionPlotter.java b/src/SwingFunctionPlotter.java
new file mode 100644
index 0000000000000000000000000000000000000000..110dc614322009d5b95b85ec38246c21fa8c4aba
--- /dev/null
+++ b/src/SwingFunctionPlotter.java
@@ -0,0 +1,44 @@
+import com.mindfusion.charting.FunctionSeries;
+import com.mindfusion.charting.swing.LineChart;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class SwingFunctionPlotter extends JFrame {
+    private static final long serialVersionUID = 1L;
+
+    public static void plotFunction(String function) {
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                try {
+                    new SwingFunctionPlotter(function).setVisible(true);
+                }
+                catch(Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    protected SwingFunctionPlotter(String function) {
+        setDefaultCloseOperation(EXIT_ON_CLOSE);
+        setSize(650, 400);
+        setTitle("Java Swing Library for Charts and Gauges: FunctionSeries");
+
+        getContentPane().add(initializeChart(function), BorderLayout.CENTER);
+    }
+
+    private LineChart initializeChart(String function) {
+        LineChart lineChart = new LineChart();
+        FunctionSeries series1;
+        try {
+            series1 = new FunctionSeries(function,1000, -20, 20);
+            series1.setTitle("Current function");
+            lineChart.getSeries().add(series1);
+        }
+        catch(Exception e) {
+            e.printStackTrace();
+        }
+        return lineChart;
+    }
+}
\ No newline at end of file
diff --git a/to-do.txt b/to-do.txt
deleted file mode 100644
index de2bf44168c2d6f4afc24050f19d24d651e510e4..0000000000000000000000000000000000000000
--- a/to-do.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-2. Testklassen
-
-3. Visitor pattern
-4. plot function
-5. Überarbeiten
--> Dokumentation
--> Exceptions
--> Kommentare
--> Code strukturieren
\ No newline at end of file