태그에 ANTLR을 언급했습니다.이 기능을 사용 했습니까? ANTLR에서 완전한 부울 문법을 만들 수는 있지만 동사를 평가하는 방법의 수준까지 내려 가면 훨씬 더 어려워진다.
쿼리 할 수있는 작고 고정 된 동사 세트가있는 경우 동사와 함수 간의 매핑을 쉽게 만들 수 있습니다.
동사의 목록이 더 큰 경우 리플렉션을 사용하여 특정 방법을 호출하여이를 평가할 수 있습니다.
동사가 수학적 비교를 포함 할 수있는 경우 수학 어휘 분석기와 구문 분석기를 만들 때이 모든 것이 조금 더 어려워집니다.
ANTLR에서 시도한 것에 대해 더 구체적인 질문이나 지식이 없으면 나는 더 많은 조언을 드릴 수 있을지 확신하지 못합니다.
편집 : 귀하의 의견을 토대로 좀 더 추가하겠습니다. 당신은 당신의 문법 구문 분석 규칙을 추가 할 수 있습니다
boolean_or returns [boolean b]
: b1=boolean_and {$b = $b1.b;}
(OR b2=boolean_and {$b = $b || $b2.b;})*
;
boolean_atom returns [boolean b]
:
((numeric_comparison)=> b1=numeric_comparison {$b = $b1.b;}
| TRUE {$b = true;} | FALSE {$b = false;}
| s1=VERB {$b = evalVerb($s1.s);}
| LPAREN b1=boolean_expr RPAREN {$b = $b1.b;}
)
;
을 내가 현재 사용하고 부울 파서의 작은 부분 이잖아. 공란을 채울 수 있습니다.
그리고 조기 반환 귀하의 요구 사항을 고려하지 않는
ANTLRStringStream in = new ANTLRStringStream(booleanString);
ActionLexer lexer = new ActionLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
BooleanParser parser = new BooleanParser(tokens);
try {
return parser.eval();
} catch (Exception e) {
}
이 같은 것을 사용하여 파서를 호출,하지만 난 당신이 그렇게하는 방법을 알아낼 수 있습니다 확신합니다.
이것은 일을하는 가장 좋은 방법은 아니지만 과거에 나를 위해 일하는 방법이었습니다. 희망이 도움이됩니다. 당신이 AND
및 OR
대신에 ||
및 &&
를 사용할 수있는 경우
당신을 가지고 Drools, http://openrules.com/ 등의 규칙 엔진을 사용해 보셨습니까? 또 다른 대안은 Ognl 또는 MVEL 또는 Spring EL (http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html)을 활용하는 것입니다. –
Drools를 간략하게 살펴 보았지만 다른 것은 아닙니다. 우리는 Drools가 우리 프로젝트에 소개 할 과잉 인 것 같았고 이것이이 문제를 해결할 지 명확하지 않았습니다. – dsatish