Вы упомянули ANTLR в своих темах: вам понравилось? Вы можете создать полную логическую грамматику в ANTLR, но она становится намного сложнее, когда вы достигаете уровня оценки глаголов.
Если существует небольшой фиксированный набор глаголов, которые могут быть запрошены, вы можете легко создать сопоставление между глаголами и функциями.
Если существует более широкий список глаголов, вы можете использовать отражение для вызова определенных методов для их оценки.
Если ваши глаголы могут включать в себя математические сравнения, все это становится немного сложнее, когда вы создаете математический лексер и парсер.
Без особого вопроса и знаний о том, что вы пробовали в ANTLR Я не уверен, что могу дать вам гораздо больше советов.
EDIT: На основе ваших комментариев я добавлю еще несколько. Вы можете добавить правила синтаксического анализа для вашей грамматики:
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) {
}
это не учитывает ваше требование о возвращении рано, но я уверен, что вы можете выяснить, как сделать это.
Возможно, это не лучший способ сделать что-то, но это то, как я работал в прошлом. Надеюсь это поможет.
У вас пробовал правила, такие как Drools, http://openrules.com/ и т. д.? Или другой альтернативой является использование Ognl или MVEL или Spring EL (http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html). –
Мы кратко рассмотрели Drools, но не другие. Мы чувствовали, что Drools может быть излишним, чтобы представить в нашем проекте и не были ясны, если он решит эту проблему. – dsatish