diff --git a/src/Parser.java b/src/Parser.java
index 3ed712932826d1928422376f4b977d8879db25a1..ed584c4e8046e6fcffc6c80af8ab8ed26d5a2219 100644
--- a/src/Parser.java
+++ b/src/Parser.java
@@ -4,36 +4,42 @@ import java.util.List;
 public class Parser {
 
     private abstract class Expression {
-
+        boolean capsuled;
+        public Expression(boolean capsuled) {
+            this.capsuled = capsuled;
+        }
     }
 
     private class BinaryOperation extends Expression {
         Expression leftExpression;
         String operator;
         Expression rightExpression;
-        Boolean capseled;
-        public BinaryOperation(Expression leftExpression, String operator, Expression rightExpression, Boolean capseled) {
+        public BinaryOperation(Expression leftExpression, String operator, Expression rightExpression, boolean capsuled) {
+            super(capsuled);
             this.leftExpression = leftExpression;
             this.operator = operator;
             this.rightExpression = rightExpression;
-            this.capseled = capseled;
         }
     }
 
     private class Variable extends Expression {
         String variableName;
-        public Variable(String i) {
+        public Variable(String i, Boolean capsuled) {
+            super(capsuled);
             this.variableName = i;
         }
     }
 
     private abstract class Value extends Expression {
-
+        public Value(boolean capsuled) {
+            super(capsuled);
+        }
     }
 
     private class Number extends Value {
         public String digits;
-        public Number(String i) {
+        public Number(String i, boolean capsuled) {
+            super(capsuled);
             this.digits = i;
         }
     }
@@ -42,7 +48,8 @@ public class Parser {
         public Number beforeDot;
         public Number afterDot;
 
-        public Decimal(Number i1, Number i2) {
+        public Decimal(Number i1, Number i2, boolean capsuled) {
+            super(capsuled);
             this.beforeDot = i1;
             this.afterDot = i2;
         }
@@ -59,7 +66,7 @@ public class Parser {
         Expression ast = parseExpression(ts);
 
         if(!ts.isEmpty()) {
-            throw new ParserException("RuntimeError: " + ts.size() + " token(s) left");
+            throw new ParserException("SyntaxError: " + ts.size() + " token(s) left");
         }
         return ast;
     }
@@ -70,22 +77,21 @@ public class Parser {
         if(ts.isEmpty()) {
             throw new ParserException("SyntaxError: empty token list");
         }
-        Expression ast;
-        ast = parseBinaryOperation(ts);
-        if(ast==null) {
-            ast = parseVariable(ts);
+        Expression ast = parseBinaryOperation(ts);
             if(ast==null) {
-                ast = parseValue(ts);
-            }
-            if(ast==null) {
-                throw new ParserException("SyntaxError: invalid character");
+                ast = parseVariable(ts);
+                if(ast==null) {
+                    ast = parseValue(ts);
+                }
+                if(ast==null) {
+                    throw new ParserException("SyntaxError: invalid character");
+                }
             }
-        }
         return ast;
     }
 
     //checks if a String only contains an allowed operator with parseCharacter(...)
-    private Boolean parseOperator(String operator) throws ParserException {
+    private boolean parseOperator(String operator) throws ParserException {
         if(operator.length()>1) {
             throw new ParserException("SyntaxError: invalid length for an operator: " + operator);
         }
@@ -95,6 +101,35 @@ public class Parser {
         return true;
     }
 
+    private int parseBrackets(List<Lexer.Token> ts) throws ParserException{
+        if(parseCharacter(ts.get(0).getData(), "(")) {
+            int index;
+            int lBrackets = 0;
+            int rBrackets = 0;
+            boolean found = false;
+            for(index=1; index<ts.size(); index++) {
+                if(parseCharacter(ts.get(index).getData(), "(")) {
+                    lBrackets += 1;
+                }
+                else if(parseCharacter(ts.get(index).getData(), ")")) {
+                    rBrackets += 1;
+                    if(rBrackets>lBrackets) {
+                        found = true;
+                        break;
+                    }
+                }
+            }
+            if(!found) {
+                throw new ParserException("SyntaxError: brackets never got closed");
+            }
+            if(index==1) {
+                throw new ParserException("SyntaxError: no value inside brackets");
+            }
+            return index;
+        }
+        return -1;
+    }
+
     private BinaryOperation parseBinaryOperation(List<Lexer.Token> ts) throws ParserException {
         if(ts.isEmpty()) {
             throw new ParserException("SyntaxError: empty token list");
@@ -102,26 +137,32 @@ public class Parser {
         if(ts.size()==1) {
             return null;
         }
-        int index;
-        for(index=0; index<ts.size(); index++) {
-            if(ts.get(index).getType()== Lexer.TokenType.SPECIAL) {
-                if(!parseCharacter(ts.get(index).getData(), ".")) {
-                    break;
-                }
-            }
+        int index = 0;
+        int tokensInBracket = parseBrackets(ts);
+        boolean capsuled;
+        if(tokensInBracket+1==ts.size()) {
+            ts.remove(tokensInBracket);
+            ts.remove(0);
+            capsuled = true;
+            index = 1;
         }
-        if(index==ts.size()) {
-            return null;
+        else if (tokensInBracket==-1) {
+            capsuled = false;
+            parseOperator(ts.get(1).getData());
+            index = 1;
+        }
+        else {
+            capsuled = false;
+            index = tokensInBracket+1;
         }
         List<Lexer.Token> leftList = new LinkedList<>();
-        for(int i=0; i<index; i++) {
+        for(int iterator = 0; iterator<index; iterator++) {
             leftList.add(ts.remove(0));
         }
         Expression leftExpression = parseExpression(leftList);
         String operator = ts.remove(0).getData();
-        parseOperator(operator);
         Expression rightExpression = parseExpression(ts);
-        return new BinaryOperation(leftExpression, operator, rightExpression, false);
+        return new BinaryOperation(leftExpression, operator, rightExpression, capsuled);
     }
 
     private Variable parseVariable(List<Lexer.Token> ts) throws ParserException {
@@ -140,7 +181,7 @@ public class Parser {
         if(!parseCharacter(data,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")) {
             throw new ParserException("Invalid variable character: " + data);
         }
-        return new Variable(data);
+        return new Variable(data, false);
     }
 
     //called by method parseException(...)
@@ -187,7 +228,7 @@ public class Parser {
         ts.remove(0);
         data = ts.remove(0).getData();
         Number afterDot = (Number) parseNumber(data);
-        return new Decimal(beforeDot, afterDot);
+        return new Decimal(beforeDot, afterDot, false);
     }
 
     //called by method parseValue(...)
@@ -198,12 +239,12 @@ public class Parser {
         }
 
         if (data.startsWith("0") && data.length() == 1) {
-            return new Number(data);
+            return new Number(data, false);
         }
 
         parseDigitWithoutZero(data.substring(0,1));
         parseDigit(data.substring(1));
-        return new Number(data);
+        return new Number(data, false);
     }
 
     //called by method parseNumber(...)
@@ -228,7 +269,7 @@ public class Parser {
         }
     }
 
-    private Boolean parseComma(List<Lexer.Token> ts) throws ParserException {
+    private boolean parseComma(List<Lexer.Token> ts) throws ParserException {
         String data = ts.get(1).getData();
         if(parseCharacter(data, ".")) {
             if(ts.get(2).getType()!= Lexer.TokenType.NUMBER) {
@@ -239,19 +280,9 @@ public class Parser {
         return false;
     }
 
-    private Boolean parseBracket(List<Lexer.Token> ts) throws ParserException {
-        String data = ts.get(0).getData();
-        if(parseCharacter(data, "(")) {
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
     //called by methods parseOperator(...), parseDigit(...), parseDigitWithoutZero(...)
     //checks if a certain string can be found in a string of allowed character
-    private Boolean parseCharacter(String data, String allowedCharacters) throws ParserException {
+    private boolean parseCharacter(String data, String allowedCharacters) throws ParserException {
         if(data.isEmpty()) {
             throw new ParserException("RuntimeError: empty String");
         }