From 5a3e3f53e0389c44b993e001a07576290edc2e9f Mon Sep 17 00:00:00 2001
From: niklasBr <104077966+bretzNiklas@users.noreply.github.com>
Date: Wed, 4 Jan 2023 19:19:14 +0100
Subject: [PATCH] Added print while to main to print whole ausdruck

---
 Aufgabe4/Ast.java                  |  17 +-
 Aufgabe4/Parser.java               | 242 ++++++++++++++++++++++++-----
 Aufgabe4/main.java                 |  53 +++++--
 Aufgabe4/test.java                 |  83 ++++++++++
 out/production/inf3_git/main.class | Bin 1419 -> 2976 bytes
 5 files changed, 338 insertions(+), 57 deletions(-)
 create mode 100644 Aufgabe4/test.java

diff --git a/Aufgabe4/Ast.java b/Aufgabe4/Ast.java
index 1de8c11..b2b3488 100644
--- a/Aufgabe4/Ast.java
+++ b/Aufgabe4/Ast.java
@@ -1,4 +1,3 @@
-import java.beans.Expression;
 import java.util.ArrayList;
 
 public abstract class Ast {
@@ -20,26 +19,29 @@ class AstExpression extends Ast {
 
 class AstBinaryOp extends Ast {
 
-    Ast[] binaryOp = new Ast[3];
+    AstExpression astExpression1;
+    AstExpression astExpression2;
+    AstOperator astOperator;
+
 
 }
 
 class AstValue extends Ast {
 
     AstNumber astNumber;
-    AstValue astValue;
+    AstDecimal astDecimal;
     boolean isVariable;
 
 }
 
 class AstNumber extends Ast {
 
-    AstDigitWoz astDigitWoz;
+    AstDigitWoZ astDigitWoz;
     ArrayList<AstDigit> astDigits = new ArrayList<>();
 
 }
 
-class AstDigitWoz extends Ast {
+class AstDigitWoZ extends Ast {
 
     int astDigitWozContent;
 
@@ -47,14 +49,15 @@ class AstDigitWoz extends Ast {
 
 class AstDigit extends Ast {
 
+    AstDigitWoZ astDigitWoZ;
     int astDigit;
 
 }
 
 class AstDecimal extends Ast {
 
-    AstDigit astDigitBeforeComma;
-    AstDigit astDigitAfterComma;
+    AstNumber astDigitBeforeComma;
+    AstNumber astDigitAfterComma;
 
 
 }
diff --git a/Aufgabe4/Parser.java b/Aufgabe4/Parser.java
index fe1ccee..57c8728 100644
--- a/Aufgabe4/Parser.java
+++ b/Aufgabe4/Parser.java
@@ -1,7 +1,6 @@
-import java.io.IOError;
-import java.sql.SQLSyntaxErrorException;
+import java.sql.Array;
+import java.sql.SQLOutput;
 import java.util.ArrayList;
-import java.util.Collections;
 
 public class Parser {
 
@@ -9,80 +8,99 @@ public class Parser {
 
         AstExpression root;
 
-        root = (AstExpression) parseAstExpression(tokenList);
+        root = parseAstExpression(tokenList);
 
         return root;
     }
 
-    private Ast parseAstExpression (ArrayList<Token> tokenList) {
+    private AstExpression parseAstExpression (ArrayList<Token> tokenList) {
 
-        if(tokenList.size() == 1) {
-            AstValue astValue = new AstValue();
-            astValue.astNumber = new AstNumber();
-            astValue.astNumber.astDigitWoz = new AstDigitWoz();
+        AstExpression toReturn = new AstExpression();
+
+        // If tokenList contains one item: Expression is a value
+
+
+        boolean isValue = false;
+
+        if(tokenList.size() == 1 ) {
+
+            toReturn.astValue = parseValue(tokenList);
+            //return toReturn;
+            isValue = true;
 
-            astValue.astNumber.astDigitWoz.astDigitWozContent = Integer.parseInt(tokenList.get(0).getTokenString());
-            return astValue;
         }
 
-        AstExpression astExpression = new AstExpression();
+        for (Token t : tokenList) {
 
-        ArrayList<Token> tokensPos3 = new ArrayList<>();
 
-        tokenList.forEach(token -> {
-            if(token != tokenList.get(0) && token != tokenList.get(1)) {
-                tokensPos3.add(token);
+            if(t.getTokenString().equals(".")) {
+                isValue = true;
             }
-        });
 
 
-        astExpression.astBinaryOp = parseBinaryOp(tokenList.get(0), tokenList.get(1), tokensPos3);
+            if(t.getTokenString().equals("+") || t.getTokenString().equals("-") || t.getTokenString().equals("*") || t.getTokenString().equals("/")) {
+                isValue = false;
+                break;
+            }
 
-        return astExpression;
+        }
 
-    }
 
-    private AstBinaryOp parseBinaryOp (Token expression1, Token operator, ArrayList<Token> expression2) {
+        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
 
+        // ( 3+4 ) * 5
 
-        AstBinaryOp astBinaryOp = new AstBinaryOp();
 
+        toReturn.astBinaryOp = parseBinaryOp(tokenList);
 
-        AstValue exp1;
+        return toReturn;
 
-        ArrayList<Token> exp1ArrayList = new ArrayList<>();
-        exp1ArrayList.add(expression1);
-        exp1 = (AstValue) parseAstExpression(exp1ArrayList);
+    }
 
-        astBinaryOp.binaryOp[0] = exp1;
+    private AstBinaryOp parseBinaryOp (ArrayList<Token> tokenList) {
 
 
-        astBinaryOp.binaryOp[1] = parseOperator(operator);
 
+        AstBinaryOp toReturn = new AstBinaryOp();
 
+        int positionOfFirstTopLevelOperator = 0;
+        int numberOfBrackets = 0;
+        int i = 0;
+        String lastBracket = ")";
 
-        // ( 2 + 3 ) + 3
+        for(Token t : tokenList) {
 
 
-        if (expression2.size() > 2) {
+            if(t.getTokenString().equals("(") || t.getTokenString().equals(")")) {
+                numberOfBrackets++;
+                lastBracket = t.tokenString;
+            }
 
-            astBinaryOp.binaryOp[2] = parseAstExpression(expression2);
+            if( ((t.getTokenString().equals("+") || t.getTokenString().equals("-") || t.getTokenString().equals("*")
+                    || t.getTokenString().equals("/")) && (numberOfBrackets % 2 == 0) ) && lastBracket.equals((")") )) {
 
-        } else {
+                positionOfFirstTopLevelOperator = i;
+                break;
 
-            AstValue exp2 = new AstValue();
+            }
+            i++;
 
-            ArrayList<Token> exp2ArrayList = new ArrayList<>();
-            exp2ArrayList.add(expression2.get(0));
-            exp2 = (AstValue) parseAstExpression(exp2ArrayList);
+        }
 
-            astBinaryOp.binaryOp[2] = exp2;
+        // 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())));
 
-        return astBinaryOp ;
+
+        return toReturn ;
     }
 
     private AstOperator parseOperator (Token operator) {
@@ -93,7 +111,153 @@ public class Parser {
         return astOperator;
     }
 
+    private AstValue parseValue (ArrayList<Token> valueTokens) {
+
+        AstValue toReturn = new AstValue();
+
+        boolean containsSpecialToken = false;
+
+        for(Token t : valueTokens) {
+
+            if(t.getTokenType().equals(TokenType.special)) {
+
+                containsSpecialToken = true;
+
+            }
+
+        }
+
+        if(containsSpecialToken) {
+
+            toReturn.astDecimal = parseDecimal(valueTokens);
+
+        } else {
+
+            toReturn.astNumber = parseNumber(valueTokens);
+
+        }
+        return toReturn;
+    }
+
+    private AstDecimal parseDecimal (ArrayList<Token> decimalTokens) {
+
+        AstDecimal toReturn = new AstDecimal();
+
+        int i = 0;
+        int positionOfDecimalPoint = -1;
+
+        for(Token t : decimalTokens) {
+
+            if(t.getTokenType().equals(TokenType.special)) {
+                positionOfDecimalPoint = i;
+                break;
+            }
+
+            i++;
+
+        }
+
+        // parse digits before comma as list and save it into toReturn.before
+
+
+
+        if (positionOfDecimalPoint == 1) {
+
+            ArrayList<Token> temp = new ArrayList<>();
+            temp.add(decimalTokens.get(0));
+            toReturn.astDigitBeforeComma = parseNumber(temp);
+
+        } else {
+
+            toReturn.astDigitBeforeComma = parseNumber(new ArrayList<> (decimalTokens.subList(0, positionOfDecimalPoint - 1)));
+        }
+
+
+        if (positionOfDecimalPoint +  1 - decimalTokens.size() == 0) {
+
+            ArrayList<Token> temp = new ArrayList<>();
+            temp.add(decimalTokens.get(decimalTokens.size() - 1));
+            toReturn.astDigitAfterComma = parseNumber(temp);
+
+        } else {
+
+            toReturn.astDigitAfterComma = parseNumber(new ArrayList<> (decimalTokens.subList(positionOfDecimalPoint +  1, decimalTokens.size())));
+
+        }
+        
+
+
+
+        return toReturn;
+    }
+
+    private AstNumber parseNumber (ArrayList<Token> numberTokens) {
+
+        AstNumber toReturn = new AstNumber();
+
+        // take first Token from list and parse as digit without zero
+
+        toReturn.astDigitWoz = parseDigitWoZ(numberTokens.get(0));
+
+        if(numberTokens.size() == 1) {
+            return toReturn;
+        }
+
+        numberTokens.stream()
+                .skip(1)
+                .forEach(token -> {
+                    AstDigit temp = parseAstDigit(token);
+                    toReturn.astDigits.add(temp);
+                });
+
+        return toReturn;
 
+    }
+
+    private AstDigitWoZ parseDigitWoZ (Token digitWoZ) {
+
+        AstDigitWoZ toReturn = new AstDigitWoZ();
+
+        int tokenContentAsString;
+
+        try {
+            tokenContentAsString = Integer.parseInt(digitWoZ.tokenString);
+        } catch (NumberFormatException error) {
+            System.out.println("Can't parse string in AstDigitWoZ");
+            throw error;
+        }
+
+
+        toReturn.astDigitWozContent = tokenContentAsString;
+
+        return toReturn;
+    }
+
+    private AstDigit parseAstDigit (Token digit) {
+
+        AstDigit toReturn = new AstDigit();
+
+        int tokenContentAsString;
+
+
+        try {
+            tokenContentAsString = Integer.parseInt(digit.tokenString);
+        } catch (NumberFormatException error) {
+            System.out.println("Can't parse string in AstDigit");
+            throw error;
+        }
+
+
+
+        if(tokenContentAsString == 0) {
+            toReturn.astDigit = 0;
+            return toReturn;
+        }
+
+        toReturn.astDigitWoZ = parseDigitWoZ(digit);
+
+        return toReturn;
+    }
 
 
 }
diff --git a/Aufgabe4/main.java b/Aufgabe4/main.java
index c31295b..935ae50 100644
--- a/Aufgabe4/main.java
+++ b/Aufgabe4/main.java
@@ -4,35 +4,60 @@ public class main {
 
     public static void main(String[] args){
 
-        // 23, x, +, (,0, 5, x,), ^, 2, -, 1
-        String ausdruck = "230lkjhx  +(2  5x) ^2,jhff  3−1gf ";
-        String ausdruck2 = "0x  +(2 5x) ^2−1f ";
+
+        // values above integer space will produce errors
+
+        String ausdruck = "3.5 * 2.5 + 2.1";
 
         Lexer lexer = new Lexer();
 
+
         // [23x] + [0,5x^2 - 1]
 
 
-        //lexer.lex(ausdruck).forEach(token -> System.out.println(token.getTokenString()));
+        lexer.lex(ausdruck).forEach(token -> {
+            System.out.println(token.getTokenString());
+            System.out.println(token.getTokenType());
+        });
+
 
         Parser p = new Parser();
 
         AstExpression result =  p.parse(lexer.lex(ausdruck));
 
 
+
+
         do {
 
-            System.out.println( ((AstValue) result.astBinaryOp.binaryOp[0]).astNumber.astDigitWoz.astDigitWozContent );
-            System.out.println( ((AstOperator) result.astBinaryOp.binaryOp[1]).astOperator );
+            try {
+                System.out.println(result.astBinaryOp.astExpression1.astValue.astNumber.astDigitWoz.astDigitWozContent);
+            } catch (NullPointerException n) {
+
+                System.out.println(result.astBinaryOp.astExpression1.astValue.astDecimal.astDigitBeforeComma.astDigitWoz.astDigitWozContent
+                        + "."
+                        + result.astBinaryOp.astExpression1.astValue.astDecimal.astDigitAfterComma.astDigitWoz.astDigitWozContent);
+            }
+
+            System.out.println(result.astBinaryOp.astOperator.astOperator);
+
+            if(result.astBinaryOp.astExpression2.astValue != null) {
+
+                try {
+                    System.out.println(result.astBinaryOp.astExpression2.astValue.astNumber.astDigitWoz.astDigitWozContent);
+                } catch (NullPointerException n) {
+
+                    System.out.println(result.astBinaryOp.astExpression2.astValue.astDecimal.astDigitBeforeComma.astDigitWoz.astDigitWozContent
+                            + "."
+                            + result.astBinaryOp.astExpression2.astValue.astDecimal.astDigitAfterComma.astDigitWoz.astDigitWozContent);
+                }
 
-            if(result.astBinaryOp.binaryOp[2].getClass() == AstValue.class) {
 
-                System.out.println( ((AstValue) result.astBinaryOp.binaryOp[2]).astNumber.astDigitWoz.astDigitWozContent );
                 break;
 
             } else {
 
-                result = (AstExpression) result.astBinaryOp.binaryOp[2];
+                result = result.astBinaryOp.astExpression2;
 
             }
 
@@ -40,7 +65,6 @@ public class main {
 
         } while ( true );
 
-
 /*
 
         System.out.println( ((AstValue) result.astBinaryOp.binaryOp[0]).astNumber.astDigitWoz.astDigitWozContent );
@@ -71,5 +95,12 @@ public class main {
 */
 
     }
-}
+    /*
+    void printAst (AstExpression astE) {
 
+        if(astE.)
+
+    }
+
+     */
+}
diff --git a/Aufgabe4/test.java b/Aufgabe4/test.java
new file mode 100644
index 0000000..91a6c9b
--- /dev/null
+++ b/Aufgabe4/test.java
@@ -0,0 +1,83 @@
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public class test {
+    public static void main(String[] args) {
+
+        String ausdruck = "((3 * 5 * ( 4 +  3)) + ((5  + 4 ( 4*4 )) + 4))";
+
+        Lexer lexer = new Lexer();
+
+
+        // [23x] + [0,5x^2 - 1]
+
+
+
+
+
+        Parser p = new Parser();
+
+        ArrayList<Token> tokenList = lexer.lex(ausdruck);
+
+
+        int positionOfFirstOperator = 0;
+        int numberOfBrackets = 0;
+        int i = 0;
+        String lastBracket = ")";
+
+        for(Token t : tokenList) {
+
+            if(t.getTokenString().equals("(") || t.getTokenString().equals(")")) {
+                numberOfBrackets++;
+                lastBracket = t.tokenString;
+            }
+
+            if( ((t.getTokenString().equals("+") || t.getTokenString().equals("-") || t.getTokenString().equals("*")
+                    || t.getTokenString().equals("/")) && (numberOfBrackets % 2 == 0) ) && lastBracket.equals((")") )) {
+
+                positionOfFirstOperator = i;
+                break;
+
+            }
+            i++;
+
+        }
+
+        int j = 0;
+
+        System.out.println(positionOfFirstOperator);
+
+        for(Token t : tokenList) {
+            System.out.print(t.getTokenString() + " index=");
+            System.out.println(j);
+            j++;
+        }
+
+
+
+        List<Token> davor;
+
+        List<Token> danach;
+
+        davor = tokenList.subList(0, positionOfFirstOperator);
+        danach = tokenList.subList(positionOfFirstOperator + 1 , tokenList.size());
+
+
+        for(Token t : davor) {
+            System.out.println(t.getTokenString());
+        }
+
+        System.out.println("---------------------------------");
+
+        for(Token t : danach) {
+            System.out.println(t.getTokenString());
+        }
+
+
+
+
+
+    }
+}
+
diff --git a/out/production/inf3_git/main.class b/out/production/inf3_git/main.class
index 34f015961d234aada263f437f97ce1152c741a42..a8d74f180113e2cc6f580bdfdbf5bb8c5d6f4518 100644
GIT binary patch
literal 2976
zcmcImS#uOs6#j0uP9_b+gs`a)AYc|?SVScQXb8ashXhRwvWVVHI!TkB?xDK}6F}S*
z_YD>IUECF%3RPff@#2H!kMP|$AFWdSZud-PhT+L7YpQPFd-n64bMD+<|GDrJfEY3n
zl%ZThg^o&83Dg~uM`YBJ_E@xk_>htC1*$fiw&`ybC~s*Usz$ZIoDFL>Hnlaa=i1J7
zorZ`&W!#uF+z4t=u9jIkW@8SOEMrojwI!Z6Jm9;gJr-*XNon7-qMfcQr{bpP$Lbl@
zH9G3iK+iIfFj5R*NlT&dXxdKrrejCD9NSAL4L24+Bj#zCuVVog3N!@1iVX{BqmJ7x
z6XOC+*=PcZQfsY48m^`H-O}|`MvGKNi?CS75;QT<l%fl)EVPnOpf%p<`Q4K#*YG?B
z8LPoEEZ5MiV+B?g0X#6}`9_iuIcetD7{XyX(cOf{CrE}&Qo9AM8rpQUW0k<HBHIGB
z((|{OwsfcZQ{*bwxg%BAAgW=lj&)d1(E^^pY%1o1T*sQ0gx!K0b!@~<0@V~Al2)2Y
zN0eBwr~O;7NkfOuHrh;~97CXn@_p&#u;J3JQV0*!*os><+@_-w+bA}}2@~0Fj+y=*
z=V&&O>~SB}wxe6a4js3nCrl*A6R4-JoFe<dH*8`ldL!70J2b>~>_T6zBZ{$QN2C<e
zmMu`x(yOYzTVQd%Py5oAwcDYD;dW1|Mr1iv(s$_?z#y?uu8oA5l$L<5^30wX@euZC
zxJSoc1x+N+Vko(Qw;60mqsvJqrIO#T<A4&LNvLy_jstc*1P<!B5BCeqPs#}@*$L_I
zG5v8h0=~3;Pheh4Z*O)?g89vknL=V%!H{5&U2P19RHGO=MllxFp+9A~(sx+AprLX{
zW@X}#h6yFgj8#MBcnrIAz?EHFhoic$xZl=Ca2T!zPlt~*M{3ZSFj$7!V}>7W!`KDp
z<_5nwqr-SW$0Vi*dro6;D#iAkMft#hI`UfBiDN4D<5#2}UTrZ|@)In6Qktp<x||W3
zm=iZ`BW&0~Ic$+qA9oVc8j`N5&RJrGKW-BAs<={)DfIW3BG5X-UZm-!0@l^Kiux7O
z9izR5t5{J3nD$28bYg-~@jg{^rNx8$mYRZ-UmXuGD;}$O@uV#d!K?vaCMI^tR1mR-
zlNw$rzJG#yn1Yr}4v)xYl}Ynjwrfj>A@QL<KP-)wrI9`0q}_zE!&KPRD5W)OW@vhw
z<M^KM%G55yA9qH)IaPQ&f_Lz)hWB*5j}HWv<;TmkkI-~99yq6l9F+-n9gA9<EIj>I
z*tA)t&_R#1M=Zl@jyujoIu$DbIotaMlp@8TJN^?hbXn-C)NtVtX1QI`vIb1wh}GdZ
zQTaH62l0uHS8=Kir${&x!RPow!<TBxzY=IJfho)=9Q++Qpick)&}5M;Y|GsAlma-D
zW;MRy|C(4MIHA3^&3nv}o@aO(z86?glHAqGso`AFZCr$Nw(@HJg4$y#0WIUx0VwBX
z$)^n0hj@zeEBLK!I}dS|n=(AiRk4-mBV6@R0FUA^o@#IckCQ@W@h2s!_^qwi;ule~
z_dIHMt!kf!egSpBH0EB!A`-9bTOClRaeYU{IV@dRk--fatj=IV1~+H0C4;VM^q#@i
zj>;?9cV=*RC{d(E^1hIK0rx6bGOsw2!8i$7`6Rvkf`fUsA{4vrD|8#OOWe+ouW)+?
zbvZ{J6=yCtpCy3p=td9v@ezK+&-|7LkoKX0@I`piQOoz+0{)u#Y-;EGr<<>s9xUf|
zyn-ON;S^R;J4*eHw6GSJupWQ$pY?D40cw02L?DCG^gyG|COm;BS<_21JC+1b;iM{|
zsK(Q<Sg=}F^cg(M_?qwsp2PEuq#eKG1=_B_i<DiCs>>u*YIsS*%NlAlEYcVm4ru7_
zIL2j*UKdeA8P=cAjk2IO8i{V(G*V$1xH~e9qxoi<O;2F<5zOVUv7o6M@fu!NQQ{4*
iWjKvD`K{;fEz&+D2A|?Hy7(I3k{;piJDkN2Sokln*cjIU

literal 1419
zcmZuxU2_vv7=BLkakA-RA*E;qYOIP`N{Oabu|c#HD%EXM4W?rKI!Slp!Zw@P-7u{e
z&UopKqa(jTu5~hD24)zp{Y%b>&)IFDEhIC0@_s$<^S<ZV{PW-ahXAT@@)$u%B5fjr
ztiaKm>b5F-s?#plnm3(RB#^!6cHHQaK&oUla>xlBuM}sCbH$nBJkJZo*-EiEGbfQ3
z$k@(~6XaoN%p<H_S3#&9CQ{ma)Wk6q2<16D0#?a>+O8f2Zl_(f5?3#Bz4BrZs9oC)
zqpAitZeju_*rTg41<veMA4;|C#W1?M(+!+3bp1}%z)P5vc-h2BoH{UIeK(ApZIbbO
z9CIRR?E2+(5{XF1QQNGZ!YdL*6R%=g;K%`Nfl(Dkm)(vEc57Wmb?c$Y(%12Z#2FKB
zqQumFF@aq3NmX`JmsKUs(#>BD<@Fo`7S5TN#d!fkh0$7XyXgc((YcAi25;eQiHeCi
z%rostB;j?%ZM)Hi|KlF7p~<p$@t(v56Ypao;Wdm26xeHME%}|u>2Nh-C69~vK;n{#
z5Al(}czkUKS0y03dU0MyAYEFq8WNWi^jg;mROAN+7IDSIRV*h2hkkZ_RtLJ{HQjE7
zSMxlbG_-O*HDP0wduuz<lBdFu+)8^AibWhdx!W2^Z7WxETk^N4o-y0)ILRWftENX!
z!S-9qYpB50_MS5x{ooQbYwO~wz=_i4vs|qPVO7x9-JcUCJ=F`hf?n$u)l22;i<EZ!
zst{68IXOFdQD|l<+@8m+j~x;+@39`K)~!|5jmb%DNHh;BI(~-)@^!x#w47yE&t+)p
z=k<+I!)sic{)~WBkmYloR+*>ZnK^q8;;%UT8J{`~r0_YPW|Dw9uG2D5!x!|hSj;mc
zL*Jc(v>(8@aSx-b4`A|qVQu!@%m8Bpj4!1B#*35bK2G=XTB`C0Rv$Bcl>2yRfa<<j
znz6+`mInBEn4YN&@JYe?6Vv<hGKVqlV&ZARBTOx%?>_!j&ys?krNRk-9IZS?`6o2a
z?-c(U7BI;vPNIp^_=%pMF^%6)!XLO6&pn^ah6Xlbtl#k^mO1$-e!&fV#YK*@W)oi%
oc?!4j4ZcMh-!b<TQjh7%NPI7$Bn$~t(t&@`JVt~Tb4IZBKeP=(!T<mO

-- 
GitLab