diff --git a/expressions.txt b/expressions.txt index f46bda32ccf334ee798b2b135980269a6f6628de..2b40ceaf50da3b0bfc6d612b6c9576e312e575a9 100644 --- a/expressions.txt +++ b/expressions.txt @@ -1 +1 @@ -x+2/5223+y+44+4+2^12/222 \ No newline at end of file +40.2+3*x \ No newline at end of file diff --git a/src/Parser.java b/src/Parser.java index 85c780cd9be5f090a934fb42c37d54075032de2e..fcc6fa333dc8dce123c0c474f149f5d35d9e0ee2 100644 --- a/src/Parser.java +++ b/src/Parser.java @@ -101,6 +101,39 @@ public class Parser { if(ts.size()==1) { return null; } + int index; + for(index=0; index<ts.size(); index++) { + if(ts.get(index).getType()== Lexer.TokenType.SPECIAL) { + if(!parseCharacter(ts.get(index).getData(), ".")) { + break; + } + } + } + if(index==ts.size()) { + return null; + } + //0 + //1 + //2 + //3 + //4 * => index=4 + + //5 + //6 + //7 + List<Lexer.Token> leftList = new LinkedList<>(); + for(int i=0; i<index; i++) { + leftList.add(ts.remove(0)); + } + Expression leftExpression = parseExpression(leftList); + String operator = ts.remove(0).getData(); + parseOperator(operator); + Expression rightExpression = parseExpression(ts); + + /* + if(parseCharacter(ts.get(1).getData(), ".")) { + return null; + } BinaryOperation operation; if(ts.get(1).getType()!= Lexer.TokenType.SPECIAL) { throw new ParserException("SyntaxError: unexpected operator: " + ts.get(1).getData()); @@ -111,6 +144,8 @@ public class Parser { String operator = ts.remove(0).getData(); parseOperator(operator); Expression rightExpression = parseExpression(ts); + + */ return new BinaryOperation(leftExpression, operator, rightExpression); } @@ -151,7 +186,7 @@ public class Parser { if (ts.size()>1) { //if the next token is of TokenType.SPECIAL, check if it's a comma //if it is, create a decimal - if(ts.get(0).getType() == Lexer.TokenType.SPECIAL) { + if(ts.get(1).getType() == Lexer.TokenType.SPECIAL) { if(parseComma(ts)) { value = parseDecimal(ts); } @@ -191,8 +226,8 @@ public class Parser { return new Number(data); } - parseDigitWithoutZero(data); - parseDigit(data); + parseDigitWithoutZero(data.substring(0,1)); + parseDigit(data.substring(1)); return new Number(data); } @@ -219,9 +254,9 @@ public class Parser { } private Boolean parseComma(List<Lexer.Token> ts) throws ParserException { - String data = ts.get(0).getData(); + String data = ts.get(1).getData(); if(parseCharacter(data, ".")) { - if(ts.get(1).getType()!= Lexer.TokenType.NUMBER) { + if(ts.get(2).getType()!= Lexer.TokenType.NUMBER) { throw new ParserException("SyntaxError: no number after comma"); } return true;