4

次のように、文字列として保存されたブール式を評価できるようにしたいと思います。

"hello" == "goodbye" && 100 < 101

SO にはすでにこのような質問がたくさんあることは知っていますが、この質問に対する最も一般的な回答であるBeanShellを試したので、これを質問しています。これにより、このようなステートメントの評価が可能になります

"hello" == 100

まったく問題なく。オペランドの不一致などでエラーをスローする FOSS パーサーを知っている人はいますか? または、私を助ける BeanShell の設定はありますか? 私はすでに Interpreter.setStrictJava(true) を試しました。

完全を期すために、現在使用しているコードは次のとおりです。

Interpreter interpreter = new Interpreter();
interpreter.setStrictJava(true);    
String testableCondition = "100 == \"hello\"";
try {
    interpreter.eval("boolean result = ("+ testableCondition + ")");
    System.out.println("result: "+interpreter.get("result"));
    if(interpreter.get("result") == null){
        throw new ValidationFailure("Result was null");
    }
} catch (EvalError e) {
    e.printStackTrace();
    throw new ValidationFailure("Eval error while parsing the condition");
}

編集:

私が現在持っているコードは、この出力を返します

result: false

エラーなし。私がやりたいことは、EvalError をスローするか、不一致のオペランドがあったことを知らせる何かをスローすることです。

4

5 に答える 5

2

Java 6では、この記事で説明されているように、コンパイラを動的に呼び出すことができます。

http://www.ibm.com/developerworks/java/library/j-jcomp/index.html

これを使用して、式を動的にJavaクラスにコンパイルできます。これにより、文字列を数値と比較しようとすると、型エラーがスローされます。

于 2010-06-07T18:49:17.240 に答える
0

評価プロジェクトを試してください

于 2010-06-07T18:45:45.733 に答える
0

ジャニーノを使おう!http://docs.codehaus.org/display/JANINO/Home

Javaのevalに似ています

于 2012-10-18T00:39:51.037 に答える
0

groovy がオプションである場合は、 http: //groovy.codehaus.org/api/groovy/util/Eval.htmlで試すことができます。

于 2013-10-15T14:56:03.403 に答える
0

MVELも役に立ちます

http://mvel.codehaus.org/

ほとんどの場合、評価を行う 1 行のコード:

Object result = MVEL.eval(expression, rootObj);

「rootObj」は null の可能性がありますが、提供されている場合は、修飾なしでプロパティとメソッドを参照できます。すなわち。「id」または「calculateSomething()」。

于 2012-10-18T01:19:24.047 に答える