2010-06-07 2 views
4

내가 좋아하는 문자열로 저장된 부울 식을 계산할 수 있도록하고 싶습니다 다음Java에서 문자열로 저장된 부울 표현식을 엄격하게 평가할 수 있습니까?

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

내가 SO 이미이 같은 질문의 톤이 있다는 것을 알고 있지만, 나는이 일을 부탁 해요 이 질문, BeanShell에 대한 가장 일반적인 대답을 시도했습니다, 그것은 전혀 문제가이 일

"hello" == 100 

같은 문장의 평가를 할 수 있기 때문이다. 누구든지 피연산자 불일치 같은 것들을위한 오류를 던질 수있는 OSS 파서를 알고 있습니까? 아니면 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 또는 뭔가를 던져서 피연산자가 일치하지 않는다는 것을 알려주는 것입니다.

+0

현재 가지고있는 코드의 문제점은 무엇입니까? –

+0

"FOSS 파서를 아는 사람이 있습니까?"== 오프 주제 질문 – Raedwald

답변

0

이 문서에 설명 된대로 자바 6에서 eval project

+0

eval은 꽤 다행입니다. 그러나 문자열 = 기능도 필요합니다. – DLaw

+1

링크가 나에게 DNS 오류를줍니다. –

2

, 당신은 동적 컴파일러를 호출 할 수보십시오 : 당신은 동적으로 자바 클래스로 표현을 컴파일하려면이 옵션을 사용할 수

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

문자열을 숫자와 비교하려고하면 형식 오류가 발생합니다.

+0

와우, 멋진 링크였습니다. 나는 뭔가를 배웠다. – Justin

+0

멋진 링크였습니다. 불행히도, 나는 자바 1.5에서 작동하는 무언가가 필요하다. – DLaw

0

이 MVEL도 유용 할 것이다

대부분의 경우에 평가를 할 수있는 코드의 http://mvel.codehaus.org/

한 줄 :

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

"rootObj를" null 일 수 있지만 제공된 경우 자격없이 속성 및 메서드를 참조 할 수 있습니다. 즉. "id"또는 "calculateSomething()".