我做了一个字符串数学表达式解析器,如下所示:
public class ExpSolver {
public String solve(String s){
try {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
return engine.eval(s).toString();
} catch (ScriptException ex) {
Logger.getLogger(ExpSolver.class.getName()).log(Level.SEVERE, null, ex);
}
return "0";
}
public static void main(String args[]){
System.out.println(new ExpSolver().solve(new java.util.Scanner(System.in).nextLine()));
}
}
现在,我还想向代码中添加代码以解析数学函数,例如sin,cos,tan,^(幂),log等。
做到这一点的最佳,高效代码解决方案是什么?我已经看到过正则表达式,但无法如此大规模地使用它。
最佳答案
如何使用math.js的表达式解析器并通过Java ScriptEngine使用它?
这里有个例子:
package org.mathjs;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class MathJSDemo {
protected static String MATHJS_URL =
"http://cdnjs.cloudflare.com/ajax/libs/mathjs/1.0.1/math.js";
protected ScriptEngine engine;
public MathJSDemo() throws MalformedURLException, ScriptException, IOException {
ScriptEngineManager manager = new ScriptEngineManager ();
engine = manager.getEngineByName ("js");
engine.eval(new InputStreamReader(new URL(MATHJS_URL).openStream()));
engine.eval("var parser = math.parser();");
engine.eval("var precision = 14;");
}
public String eval (String expr) throws ScriptException {
String script = "math.format(parser.eval('" + expr + "'), precision);";
return (String) engine.eval(script);
}
public static void main(String[] args) throws ScriptException, MalformedURLException, IOException {
MathJSUrl math = new MathJSDemo();
System.out.println(math.eval("a = 4.5"));
System.out.println(math.eval("1.2 * (2 + a)"));
System.out.println(math.eval("5.08 cm in inch"));
System.out.println(math.eval("sin(45 deg) ^ 2"));
System.out.println(math.eval("9 / 3 + 2i"));
System.out.println(math.eval("det([-1, 2; 3, 1])"));
}
}