我做了一个字符串数学表达式解析器,如下所示:

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])"));
    }
}

07-24 18:44
查看更多