评估包含java中函数的表达式

时间:2014-12-05 15:28:29

标签: java expression evaluator

我编写了一个项目来计算不同的函数,如sine,MCM等,而不使用像java中的math这样的现有包 现在我想以字符串的形式从用户那里得到一个表达式,然后打印出结果
喜欢:

import java.util.Scanner;

public class Phase2main {

public static void main(String[] args) {

    Scanner s = new Scanner(System.in);
    String expression   ;
    double result = 0 ;

    System.out.println(" Enter your desired expression from the available functions ");

    expression = s.nextLine();


    System.out.println("Result is : " + result);                
 }
}

那么它应该像这样运行:   输入表达式:ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10))   结果是:1.94

如何让程序识别我的功能,如CEIL及其输入? 我已经检查了许多类似的问题,但我找到的那些是相当复杂的库,我无法理解或执行基本算法而无需识别函数及其输入

那么如何为这个特定问题编写一个简单的求值器呢?

3 个答案:

答案 0 :(得分:1)

可以使用JavaScript解释器吗?

首先创建引擎实例并初始化:

// Manager creates engines by mime/language names.
// It has own global scope for engiges created by it.
ScriptEngineManager manager = new ScriptEngineManager();
// Create JavaScript interpreter instance.
// (Nashorn is bundled JavaScript interpreter)
ScriptEngine scope = manager.getEngineByName("JavaScript");
// Define functions you need
String initialScript = "cos = Math.cos;" // ; or \n
    + "sin = Math.sin;"
    + "tg  = Math.tan;"
    + "PI  = Math.PI;"
// Any other function
    + "ctg = function (x) { return cos(x)/sin(x); };";
// ...

try {
    // Add these functions to scope
    scope.eval(initialScript);
} catch(ScriptException ex) {
    // Evaluating exceptions, syntax errors are thrown here
}

然后你可以多次评估“范围”中的表达式:

try {
    double d = (double)scope.eval("sin(PI/2) + cos(PI/2)");
    System.out.println("Calculated: " + d);
} catch(ScriptException e) {
    // ...
}

警告:

  1. 有语言口译 - 用户可以传递任何脚本......
  2. ......它可以降低应用程序的性能。
  3. 您也可以使用JythonJRuby作为翻译。

答案 1 :(得分:0)

您可以使用Java Scripting API, and for instance use JavaScript, or BeanShell (java like).

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByMimeType("text/javascript");
    try {
        engine.eval("print('Result: ' + java.lang.Math.sin(0.8))");
        double y = ((Number) engine.eval("java.lang.Math.sin(0.8)")).doubleValue();
    } catch (ScriptException ex) {
        Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }

JavaScript可以使用导入。如您所见,调用java非常简单。

答案 2 :(得分:0)

我不确定是否有任何简单的方法来识别和评估通用的输入表达式而不使用库。

如果你想开发自己的方法来评估数学表达式,请看看这个页面,它应该指明你要走的路:http://cogitolearning.co.uk/?p=565

如果您改变主意并希望使用图书馆,请查看以下链接:Evaluating a math expression given in string form

我在构建java编译器时已经这样做了,这样我就可以读取和评估任何表达式,但这并不简单...