Могу ли я строго оценить логическое выражение, хранящееся в Java в виде строки? - PullRequest
4 голосов
/ 07 июня 2010

Я хотел бы иметь возможность оценить логическое выражение, хранящееся в виде строки, например:

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

Edit:

Код, который у меня сейчас есть, возвращает этот вывод

result: false

без ошибок. То, что я хотел бы сделать, это выдать EvalError или что-то , сообщающее мне, что там были несовпадающие операнды.

Ответы [ 5 ]

2 голосов
/ 07 июня 2010

В Java 6 вы можете динамически вызывать компилятор, как описано в этой статье:

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

Вы можете использовать это для динамической компиляции вашего выражения в класс Java, который будет выдавать ошибки типа, если вы попытаетесь сравнить строку с числом.

0 голосов
/ 15 октября 2013

Вы можете попробовать с http://groovy.codehaus.org/api/groovy/util/Eval.html, если Groovy является опцией.

0 голосов
/ 18 октября 2012

MVEL также будет полезно

http://mvel.codehaus.org/

одна строка кода для выполнения оценки в большинстве случаев:

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

"rootObj" может быть нулевым, но если он указан, вы можете ссылаться на свойства и методы в нем без уточнения.то есть."id" или "CalculateSomething ()".

0 голосов
/ 18 октября 2012

Используйте Янино! http://docs.codehaus.org/display/JANINO/Home

Это как eval для Java

0 голосов
/ 07 июня 2010

Попробуйте eval project

...