diff options
Diffstat (limited to 'Parser.java')
| -rw-r--r-- | Parser.java | 158 |
1 files changed, 0 insertions, 158 deletions
diff --git a/Parser.java b/Parser.java deleted file mode 100644 index bd2cde9..0000000 --- a/Parser.java +++ /dev/null @@ -1,158 +0,0 @@ -/* Todo -* - Add support for trigonometric functions -* - Remove all edge cases -*/ - -import java.util.Stack; -import java.util.StringJoiner; - -public class Parser { - private String expr; - private String postfix; - private Stack<Character> operatorStack; - - public Parser(String infixExpr) { - expr = infixExpr.trim().replaceAll("\\s", ""); // remove whitespaces - postfix = toPostFix(); - } - - private boolean isOperand(char c) { - switch (c) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - return true; - default: - return false; - } - } - - private boolean isOperand(String c) { - return isOperand(c.charAt(0)); - } - - private int getPresedence(char c) { - switch (c) { - case '^': - return 3; - case '/': - return 2; - case '*': - return 2; - case '+': - return 1; - case '-': - return 1; - default: - return -1; - } - } - - private boolean hasLeftAssociativity(char c) { - if (c == '^') { - return false; - } else { - return true; - } - } - - private String toPostFix() { - operatorStack = new Stack<>(); - StringJoiner output = new StringJoiner(" "); - StringBuilder operand = new StringBuilder(); - char[] infix = expr.replaceAll(" ", "").toCharArray(); - - // Main Expression Iteration - for (int i = 0; i < infix.length; i++) { - char c = infix[i]; - - // Keep appending digits to the operand StringBuilder and skip iterations till - // we find a operator. - if (isOperand(c)) { - operand.append(infix[i]); - if (i < infix.length - 1) { - continue; - } - } - - if (operand.length() > 0) { - output.add(operand.toString()); - operand = new StringBuilder(); - } - - if (c == '(') { - operatorStack.push(c); - } else if (c == ')') { - while (!operatorStack.isEmpty() && operatorStack.peek() != '(') { - output.add(operatorStack.pop().toString()); - } - operatorStack.pop(); - } else { - // Manage precedence order of operatorStack operators - while (!operatorStack.isEmpty() && getPresedence(c) <= getPresedence((char) operatorStack.peek()) - && hasLeftAssociativity(c)) { - output.add(operatorStack.pop().toString()); - } - - // For whatever reason, the last digit gets added to the operatorStack, leading - // to a duplicate of last digit in the expression - // To fix this, we again make sure that the current char is not a operand. - if (!isOperand(c)) { - operatorStack.push(c); - } - } - } - - // pop all the operators left in the operatorStack after the loop is done. - while (!operatorStack.isEmpty()) { - if (operatorStack.peek() == '(') { - return "This expression is invalid"; - } - output.add(operatorStack.pop().toString()); - } - - return output.toString(); - } - - private Double evaluate(String operator, Double op1, Double op2) { - switch (operator.charAt(0)) { - case '+': - return op2 + op1; - case '-': - return op1 - op2; - case '*': - return op2 * op1; - case '/': - return op1 / op2; - case '^': - return (Math.pow(op2, op1)); - default: - return 0.0; - } - } - - public double eval() { - Stack<Double> stack = new Stack<Double>(); - for (String c : postfix.split(" ")) { - if (isOperand(c)) { - stack.push(Double.parseDouble(c)); - } else { - Double op1 = (Double) (stack.pop()); - Double op2 = (Double) (stack.pop()); - stack.push(evaluate(c, op2, op1)); - } - } - return stack.pop(); - } - - public String getPostfix() { - return postfix; - } -} |
