Created
December 9, 2016 11:08
-
-
Save codeboy101/04d73edf363eddb19eee2bd0c3dff42c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package com.company; | |
| import javax.script.ScriptEngineManager; | |
| import javax.script.ScriptEngine; | |
| public class Main { | |
| public static void main(String[] args) { | |
| String words = "24.2 + 2 - 1 * 10"; | |
| words = words.replaceAll(" ",""); | |
| double q = eval(words); | |
| System.out.println(q); | |
| } | |
| public static double eval(final String str) { | |
| return new Object() { | |
| int pos = -1, ch; | |
| void nextChar() { | |
| ch = (++pos < str.length()) ? str.charAt(pos) : -1; | |
| } | |
| boolean eat(int charToEat) { | |
| while (ch == ' ') nextChar(); | |
| if (ch == charToEat) { | |
| System.out.println("eating char " + ch); | |
| nextChar(); | |
| return true; | |
| } | |
| return false; | |
| } | |
| double parse() { | |
| nextChar(); | |
| double x = parseExpression(); | |
| if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char)ch); | |
| return x; | |
| } | |
| // Grammar: | |
| // expression = term | expression `+` term | expression `-` term | |
| // term = factor | term `*` factor | term `/` factor | |
| // factor = `+` factor | `-` factor | `(` expression `)` | |
| // | number | functionName factor | factor `^` factor | |
| double parseExpression() { | |
| double x = parseTerm(); | |
| for (;;) { | |
| if (eat('+')) x += parseTerm(); // addition | |
| else if (eat('-')) x -= parseTerm(); // subtraction | |
| else return x; | |
| } | |
| } | |
| double parseTerm() { | |
| double x = parseFactor(); | |
| for (;;) { | |
| if (eat('*')) x *= parseFactor(); // multiplication | |
| else if (eat('/')) x /= parseFactor(); // division | |
| else return x; | |
| } | |
| } | |
| double parseFactor() { | |
| if (eat('+')) return parseFactor(); // unary plus | |
| if (eat('-')) return -parseFactor(); // unary minus | |
| double x; | |
| int startPos = this.pos; | |
| if (eat('(')) { // parentheses | |
| x = parseExpression(); | |
| eat(')'); | |
| } else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers | |
| while ((ch >= '0' && ch <= '9') || ch == '.') nextChar(); | |
| x = Double.parseDouble(str.substring(startPos, this.pos)); | |
| } else if (ch >= 'a' && ch <= 'z') { // functions | |
| while (ch >= 'a' && ch <= 'z') nextChar(); | |
| String func = str.substring(startPos, this.pos); | |
| x = parseFactor(); | |
| if (func.equals("sqrt")) x = Math.sqrt(x); | |
| else if (func.equals("sin")) x = Math.sin(Math.toRadians(x)); | |
| else if (func.equals("cos")) x = Math.cos(Math.toRadians(x)); | |
| else if (func.equals("tan")) x = Math.tan(Math.toRadians(x)); | |
| else throw new RuntimeException("Unknown function: " + func); | |
| } else { | |
| throw new RuntimeException("Unexpected: " + (char)ch); | |
| } | |
| if (eat('^')) x = Math.pow(x, parseFactor()); // exponentiation | |
| return x; | |
| } | |
| }.parse(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment