From fff8ff423077257548f78b954cf6695e45ab2ca9 Mon Sep 17 00:00:00 2001
From: niklasBr <104077966+bretzNiklas@users.noreply.github.com>
Date: Fri, 6 Jan 2023 20:21:29 +0100
Subject: [PATCH] Parser now supports brackets

---
 Aufgabe4/Parser.java               |  56 +++++++++++++++++++++++------
 Aufgabe4/main.java                 |  39 ++++++++++++++++++--
 Aufgabe4/test.java                 |  40 +++++++++++++++++++++
 out/production/inf3_git/main.class | Bin 2976 -> 2906 bytes
 4 files changed, 121 insertions(+), 14 deletions(-)

diff --git a/Aufgabe4/Parser.java b/Aufgabe4/Parser.java
index c230d25..f97b661 100644
--- a/Aufgabe4/Parser.java
+++ b/Aufgabe4/Parser.java
@@ -1,6 +1,8 @@
 import java.sql.Array;
 import java.sql.SQLOutput;
 import java.util.ArrayList;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public class Parser {
 
@@ -19,17 +21,16 @@ public class Parser {
 
         // If tokenList contains one item: Expression is a value
 
-
         boolean isValue = false;
 
         if(tokenList.size() == 1 ) {
 
             toReturn.astValue = parseValue(tokenList);
-            //return toReturn;
-            isValue = true;
+            return toReturn;
 
         }
 
+        // If tokenList contains a dot and not operators (+ - * /): Expression is a value
         for (Token t : tokenList) {
 
 
@@ -45,17 +46,50 @@ public class Parser {
 
         }
 
-
         if(isValue) {
             toReturn.astValue = parseValue(tokenList);
             return toReturn;
         }
 
 
-        // If tokenList only contains more than one item: Expression must be expression in brackets or binary operation
+        // If method reaches this point: Expression must be expression in brackets or binary operation
+
+        // Check if first and last tokens have "(" and ")" strings
+
+        if(tokenList.get(0).tokenString.equals("(") && tokenList.get(tokenList.size() - 1).tokenString.equals(")")) {
+
 
-        // ( 3+4 ) * 5
+            // Check if "false alarm", e.g. ( 1 + 2 ) + ( 1 + 2 ) <- starts and ends with ( and ) but is to be treated as binaryOp
 
+            boolean falseAlarm = false;
+
+            for(int i = tokenList.size() - 2; i > 0; i--) {
+
+                if(tokenList.get(i).tokenString.equals(")") || tokenList.get(i).tokenString.equals("(")) {
+
+                    if(tokenList.get(i).tokenString.equals(")")) {
+                        falseAlarm = false;
+
+                    } else {
+                        falseAlarm = true;
+                    }
+                    break;
+                }
+            }
+
+            // Parse tokenList without first and last object and save it in toReturns astExpression
+
+            if(!falseAlarm) {
+
+                toReturn.astExpression = parseAstExpression(
+                        (ArrayList<Token>) IntStream.range(1, tokenList.size() - 1)
+                                .mapToObj(i -> tokenList.get(i))
+                                .collect(Collectors.toList()) // https://www.baeldung.com/java-stream-indices
+                );
+                return toReturn;
+            }
+
+        }
 
         toReturn.astBinaryOp = parseBinaryOp(tokenList);
 
@@ -66,7 +100,6 @@ public class Parser {
     private AstBinaryOp parseBinaryOp (ArrayList<Token> tokenList) {
 
 
-
         AstBinaryOp toReturn = new AstBinaryOp();
 
         int positionOfFirstTopLevelOperator = 0;
@@ -100,15 +133,15 @@ public class Parser {
         toReturn.astExpression2 = parseAstExpression(new ArrayList<>(tokenList.subList(positionOfFirstTopLevelOperator + 1, tokenList.size())));
 
 
-        return toReturn ;
+        return toReturn;
     }
 
     private AstOperator parseOperator (Token operator) {
 
-        AstOperator astOperator = new AstOperator();
-        astOperator.astOperator = operator.tokenString;
+        AstOperator toReturn = new AstOperator();
+        toReturn.astOperator = operator.tokenString;
 
-        return astOperator;
+        return toReturn;
     }
 
     private AstValue parseValue (ArrayList<Token> valueTokens) {
@@ -240,6 +273,7 @@ public class Parser {
         int tokenContentAsString;
 
 
+
         try {
             tokenContentAsString = Integer.parseInt(digit.tokenString);
         } catch (NumberFormatException error) {
diff --git a/Aufgabe4/main.java b/Aufgabe4/main.java
index f463392..057cd27 100644
--- a/Aufgabe4/main.java
+++ b/Aufgabe4/main.java
@@ -1,5 +1,3 @@
-import java.util.Arrays;
-
 public class main {
 
     public static void main(String[] args) {
@@ -7,7 +5,7 @@ public class main {
 
         // values above integer space will produce errors
 
-        String ausdruck = "0032.00555 * 2.5 + 2.1";
+        String ausdruck = "((5 + 1) + (3+4))";
 
         Lexer lexer = new Lexer();
 
@@ -26,6 +24,9 @@ public class main {
         AstExpression result = p.parse(lexer.lex(ausdruck));
 
 
+        printAst(result);
+
+/*
         do {
 
             try {
@@ -62,5 +63,37 @@ public class main {
 
         } while (true);
 
+ */
+
+    }
+
+    public static void printAst(AstExpression astExpression) {
+
+        if(astExpression.astExpression != null) {
+            System.out.print("(");
+            printAst(astExpression.astExpression);
+            System.out.print( ")");
+            return;
+        }
+
+        if(astExpression.astValue != null) {
+
+            if(astExpression.astValue.astNumber != null) {
+
+                System.out.print(astExpression.astValue.astNumber.astDigitWoz.astDigitWozContent);
+
+            } else {
+                System.out.println(astExpression.astValue.astDecimal.astDigitBeforeComma.astDigitWoz.astDigitWozContent
+                        + "."
+                        + astExpression.astValue.astDecimal.astDigitAfterComma.astDigitWoz.astDigitWozContent);
+            }
+            return;
+        }
+
+        printAst(astExpression.astBinaryOp.astExpression1);
+        System.out.print(astExpression.astBinaryOp.astOperator.astOperator);
+        printAst(astExpression.astBinaryOp.astExpression2);
+
     }
+
 }
diff --git a/Aufgabe4/test.java b/Aufgabe4/test.java
index 91a6c9b..cdf56ab 100644
--- a/Aufgabe4/test.java
+++ b/Aufgabe4/test.java
@@ -1,8 +1,11 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public class test {
+    /*
     public static void main(String[] args) {
 
         String ausdruck = "((3 * 5 * ( 4 +  3)) + ((5  + 4 ( 4*4 )) + 4))";
@@ -78,6 +81,43 @@ public class test {
 
 
 
+    }
+
+     */
+
+    public static void main(String[] args) {
+
+        String ausdruck = "((1+2) + (3+5))";
+        String ausdruck2 = "(1+2) ()+ (3+5)";
+
+        Lexer lexer = new Lexer();
+
+        ArrayList<Token> test = lexer.lex(ausdruck);
+        ArrayList<Token> test2 = lexer.lex(ausdruck2);
+
+        System.out.println(testmethode(test));
+        System.out.println(testmethode(test2));
+
+
+
+    }
+    public static boolean testmethode(ArrayList<Token> arrList) {
+
+        boolean bracketsAroundEverything = false;
+
+        for(int i = arrList.size() - 2; i > 0; i--) {
+            if(arrList.get(i).tokenString.equals(")") || arrList.get(i).tokenString.equals("(")) {
+                if (arrList.get(i).tokenString.equals(")")) {
+                    return true;
+                }
+                return false;
+            }
+        }
+
+        System.out.println("geht hier rein");
+        return false;
+
+
     }
 }
 
diff --git a/out/production/inf3_git/main.class b/out/production/inf3_git/main.class
index a8d74f180113e2cc6f580bdfdbf5bb8c5d6f4518..ef5c641e7481d83366e656c310a54d13a9807d7d 100644
GIT binary patch
delta 1246
zcmY+DdsmcI6vlsNZtu)Hrx8aGNQ3bL%)kVKKn2}EL{XB+qP#m9+7vV33?-R0mR(IN
zJQWpXb~U@B(@3;dt3O(_R%`VI`Vg)90<HGTu#*0G_c_nr`|Q1+=bZOK`5!Co-~O5V
z3Fzd<NxL<?JQ{6_G(?(XVxk)xT4S-99XF^}o3*U7Sg)y}R^dq{l4*s1ER#%+cV)*F
z;b_0Cn<vIH!`W<dG~F2+GM7|!=(@yGuPJer1{-Oz*q~{q#Z0K?Qa`N<6}4&SCX1Uj
zx6on!bX5er3*{AMlSfO#Lw;_Rv{-;Bw`=a;P7`-sAM9q6MUQ4Py=Kr=7u-sp#Wu}$
z`pqd<Jh+1ai@P<0++*fkvF>*6bsF3!9HM=(p#a_7uX%u73R_0)89tOuB}Nq5p|glO
z1MFe1#Xik`X*1%ksoTRrO@dw_?wm><Nsf0N9v{wZ8cn4VVHAfn4>4?J-EFJeIih)(
z4u!QqXe8}$ctrCkBW7Mjf@wxA#xzHXo4-}H9Ux6sGtOhC+!F~NW5VJI2Ol@xo|@V;
zCp1qHSA_m2Zi`KhlNQftp5>G|>uK@lcwX}YFPdLHYy9oJ?96f6{N<@IVec+;&U?@V
zefvWn*?i0=7N2T9<KmTLK95>=dYO+eoLm1=^DfgROpD_in{WBfV#XnN*_^k2S)Et7
zRihHY`qF9PKa$91hqD$}6*Z>IDmOp-E%Uq2@>%?#s9JQb*t-^&JUZ}*R$hE!UlG(K
ztCH1Qe-$+&8y9E9I$`8HD^?d1c$L=#1z6AP;&Bd7<Cap;Y?=ZMxk}G0Yp#{3!jh0*
zQfz{hP{B$fVjEb+26`4sw-%2x$vMe&(}>}?6c19%8@wsQL|D#SOi8RkhI*U0%pY)m
ziQ)(%gL`4Tsrp==x_MSz=Em^G0&VpIWgZ813Y-yq+dKo#lBa8)N{K9jJX`YIRbb~u
z8vpYS<=I^f6te^$DB?LDgaU`1lF2-&Vi%{spiG{}i`@l0xhRNxLDLRGLUOCf(#JBk
zi5%OhqMvF8gwCLdvXfqh<WcS>!#+;P+dsnrp`TcC4^tvUT<W|dpAS!UZ9OHn^I&p|
zm$F4vb1tvUp;F*!nY6fjuE0yzt|uhIA>!JEDP_fy4rRQ@`x0|=UaX4`xFBm-b{~rG
Xb1v}}UrUQCd@p`mb_Hgcb5Z#(I&b+#

delta 1343
zcmaKsZBUd|6vuye-|p_S7a@rPrx3+e1Y>2DN<a&Z0wSO^$|7>Ljn<Y0cNfEap|Tfy
zv+UA)DfUKXZ|DxqIE{@nO*8eWul1?#O<(%hOxbzZ5Ve`+nK}2IbN}a_bN=Vv=a(xc
zuXKL=`}7&0nfwuFZAtN(`o^l-s+h<+kqy(mSF55BOR3f@GelT!e^(9mxLRy4^HqlH
ziE36G8i?5@-{Mw9aaU_L*ETkiNo2Fh;dFC|8rB*bxmFR3XLEh=)M!HCxUgAW5ZAL#
z(`2NE7JJmQBD{ecG&dSr*=T?AtP0;mo91T2Ewo$hUAe83TQyyV+vrx5?u_q_N0Y<R
z-b^x`+nmcJ;zJ5O;##S+!dKI=vQN{isGLQn;_1O?_h>5BJ1mGqrfqCTVk9S}x^>)P
z*vuB&;jIk!ahK+9!&WIO<BbISxYy7x#xZY2V8C!c+w2){W3ZF$ZY4Wxucy2*L_G<^
zgA6Ld(rwR3A`{OIXB0(l!*izeoMflwVHcXRhkcRd^`s5M#1so8Zl1uH!!9zKtRcs!
z{n-}_?&1-{7<+7~e~F~u>!#mlTm0pY=72Oj6i=q@7XQ|WlJ={*{=e&Hd&0lHLUTy-
zilSs5EKDZTgSIFzu;6WncX(HG)NqW+Q+onFRlTn`!21sS`M_YAC}BbzQw|^ViRM$6
zo)dObe|OdA3a_eH3e%BJCo-E-@oYAc)qJIh*y%tdpgAd{5w+6(5H$V!@yKliFA6^a
zk>g@TWmU5JYrjTKi{jxik?yt&eO#m|0C<9fVud)slj4zJ^@kt=vW9I#sBZiuODcSM
zR^+)R&zd~f<yoI+(+nL`Y-sXdx_x_|I}3=5qQreq!F`(hV21d7-~)Lc634&zA<6PR
z19RKsd0fxMdAl#nTiE_j-t+ED@=j4Qm#N7&b#B?Ta8pMc?ey>--|(%h-dVP~DMbiz
z#59CiNV$AfEE4!q38;~fYC7eOAEcHER!MkN4rr7kR&$mZf65E_ix#EXs2t+6w6~)r
zW*txQw9M=5c}?i%84kJQQ9+(1CBq2Iw8o#~d8x39-*|x+rIb2;<**#?<0S!C6F4U>
zzvgAl5lu+5NK0w-YkHdYidb(-9QVc*hAaOB&+OpKgy7m4MhcS<ZTAe1&fk;;k_qYG
y>Ev?x$}YGvWxUF3Zk@a?(!(3PDeFSf-V)z&Vc|nQk{qA$h4>xOzGRwHRQv-OS|i;6

-- 
GitLab