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