diff --git a/Aufgabe4/src/Parser.java b/Aufgabe4/src/Parser.java index f2fef6424a525d1f4bc08bfb7b7c1f7920d0793f..111598d44acfc055503ed1406f2f1c6f00a9fede 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 0000000000000000000000000000000000000000..745b1c64b1788e98ce94a1f3ccfafa9420e566a3 --- /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); + + } + +}