From d1c43bea2eae591fb55868038f2f08af216dcaba Mon Sep 17 00:00:00 2001
From: niklasBr <104077966+bretzNiklas@users.noreply.github.com>
Date: Sat, 14 Jan 2023 17:32:05 +0100
Subject: [PATCH] Added power before point before line

---
 Aufgabe4/src/Parser.java       | 53 +++++++++++++++++++++++++++-------
 Aufgabe4/tests/ParserTest.java | 44 ++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 10 deletions(-)
 create mode 100644 Aufgabe4/tests/ParserTest.java

diff --git a/Aufgabe4/src/Parser.java b/Aufgabe4/src/Parser.java
index f2fef64..111598d 100644
--- a/Aufgabe4/src/Parser.java
+++ b/Aufgabe4/src/Parser.java
@@ -1,4 +1,3 @@
-import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -34,7 +33,7 @@ public class Parser {
 
         }
 
-        // If tokenList contains a dot and not operators (+ - * /): Expression is a value
+        // If tokenList contains a dot and no operators (+ - * /): Expression is a value
         for (Token t : tokenList) {
 
 
@@ -117,11 +116,17 @@ public class Parser {
 
         AstBinaryOp toReturn = new AstBinaryOp();
 
-        int positionOfFirstTopLevelOperator = 0;
+        int positionOfRelevantOperator = 0;
         int numberOfBrackets = 0;
         int i = 0;
         String lastBracket = ")";
 
+        int positionOfFirstTopLevelAdditionOrSubtraction = 0,
+                positionOfFirstTopLevelMultiplicationOrDivision = 0, positionOfFirstTopLevelPower = 0;
+
+
+        boolean flagAdditionSubtraction = false, flagMultiplicationDivision = false, flagPower = false;
+
         for(Token t : tokenList) {
 
 
@@ -130,22 +135,50 @@ public class Parser {
                 lastBracket = t.tokenString;
             }
 
-            if( ((t.getTokenString().equals("+") || t.getTokenString().equals("-") || t.getTokenString().equals("*")
-                    || t.getTokenString().equals("/") || t.getTokenString().equals("^")) && (numberOfBrackets % 2 == 0) ) && lastBracket.equals((")") )) {
+            if( ((t.getTokenString().equals("+") || t.getTokenString().equals("-") && (numberOfBrackets % 2 == 0) ) && lastBracket.equals((")"))) ) {
 
-                positionOfFirstTopLevelOperator = i;
-                break;
+                if(!flagAdditionSubtraction) {
+                    flagAdditionSubtraction = true;
+                    positionOfFirstTopLevelAdditionOrSubtraction = i;
+                }
+
+            }
+            if( ((t.getTokenString().equals("*") || t.getTokenString().equals("/")) && (numberOfBrackets % 2 == 0) ) && lastBracket.equals((")") )) {
+
+                if(!flagMultiplicationDivision) {
+                    flagMultiplicationDivision = true;
+                    positionOfFirstTopLevelMultiplicationOrDivision = i;
+                }
 
             }
+            if( t.getTokenString().equals("^") && (numberOfBrackets % 2 == 0) && lastBracket.equals((")") )) {
+
+                if(!flagPower) {
+                    flagPower = true;
+                    positionOfFirstTopLevelPower = i;
+                }
+
+            }
+
+
             i++;
 
         }
 
+        if(flagAdditionSubtraction) {
+            positionOfRelevantOperator = positionOfFirstTopLevelAdditionOrSubtraction;
+        } else if (flagMultiplicationDivision){
+            positionOfRelevantOperator = positionOfFirstTopLevelMultiplicationOrDivision;
+        } else if (flagPower) {
+            positionOfRelevantOperator = positionOfFirstTopLevelPower;
+        }
+
+
         // Make two Token lists before and after the expression, parse each as expression
 
-        toReturn.astExpression1 = parseAstExpression(new ArrayList<>(tokenList.subList(0, positionOfFirstTopLevelOperator)));
-        toReturn.astOperator = parseOperator(tokenList.get(positionOfFirstTopLevelOperator));
-        toReturn.astExpression2 = parseAstExpression(new ArrayList<>(tokenList.subList(positionOfFirstTopLevelOperator + 1, tokenList.size())));
+        toReturn.astExpression1 = parseAstExpression(new ArrayList<>(tokenList.subList(0, positionOfRelevantOperator)));
+        toReturn.astOperator = parseOperator(tokenList.get(positionOfRelevantOperator));
+        toReturn.astExpression2 = parseAstExpression(new ArrayList<>(tokenList.subList(positionOfRelevantOperator + 1, tokenList.size())));
 
 
         return toReturn;
diff --git a/Aufgabe4/tests/ParserTest.java b/Aufgabe4/tests/ParserTest.java
new file mode 100644
index 0000000..745b1c6
--- /dev/null
+++ b/Aufgabe4/tests/ParserTest.java
@@ -0,0 +1,44 @@
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class ParserTest {
+
+    @Test
+    public void testPointBeforeLine() throws Exception {
+
+        Lexer lexer = new Lexer();
+
+        ArrayList<Token> tokens = lexer.lex("3*4+5");
+
+        Parser parser = new Parser();
+
+        AstExpression root =  parser.parse(tokens);
+
+        assertEquals(root.astBinaryOp.astExpression1.astBinaryOp.astExpression1.astValue.astNumber.astDigitWoz.astDigitWozContent, 3);
+        assertEquals(root.astBinaryOp.astExpression1.astBinaryOp.astExpression2.astValue.astNumber.astDigitWoz.astDigitWozContent, 4);
+        assertEquals(root.astBinaryOp.astExpression2.astValue.astNumber.astDigitWoz.astDigitWozContent, 5);
+
+    }
+
+    @Test
+    public void testPowerBeforePoint() throws Exception {
+
+        Lexer lexer = new Lexer();
+
+        ArrayList<Token> tokens = lexer.lex("12+3^4*5");
+
+        Parser parser = new Parser();
+
+        AstExpression root =  parser.parse(tokens);
+
+        assertEquals(root.astBinaryOp.astExpression2.astBinaryOp.astExpression1.astBinaryOp.
+                astExpression1.astValue.astNumber.astDigitWoz.astDigitWozContent, 3);
+        assertEquals(root.astBinaryOp.astExpression2.astBinaryOp.astExpression1.astBinaryOp.
+                astExpression2.astValue.astNumber.astDigitWoz.astDigitWozContent, 4);
+
+    }
+
+}
-- 
GitLab