2010-06-07 1 views
4

Я хотел бы быть в состоянии оценить в логическое выражение, хранящуюся в виде строки, как следующее:Могу ли я строго оценить булевское выражение, хранящееся как строка в Java?

"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 или что-то, давая мне знать, что были несогласованные операнды.

+0

В чем проблема с кодом, который вы используете? –

+0

«Кто-нибудь знает о парсере FOSS» == вне темы вопрос – Raedwald

ответ

0

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

+0

eval довольно милый, но мне нужна строка = функции – DLaw

+1

Ссылка дает мне ошибку DNS. –

2

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

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

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

+0

Вау, это была потрясающая ссылка. Я кое-что узнал. – Justin

+0

Это была потрясающая ссылка. К сожалению, мне нужно что-то, что работает с java 1.5. – DLaw

0

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

http://mvel.codehaus.org/

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

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

"rootObj" может быть нулевым, но если он предоставлен, вы можете ссылаться на свойства и методы на нем без квалификации. то есть. «id» или «calculateSomething()».

 Смежные вопросы

  • Нет связанных вопросов^_^