оценивать логическое выражение в Java-генерации во время выполнения - PullRequest
2 голосов
/ 31 января 2011

Как оценить сложные логические выражения, сгенерированные во время выполнения в Java-программе?

Пример:

(x и y или z) и s

с x, y, z логические переменные ...

Спасибо

Ответы [ 4 ]

1 голос
/ 31 января 2011

Используйте http://docs.codehaus.org/display/JANINO/Home для минимальной работы. Я могу сделать гораздо больше, чем простые выражения.

1 голос
/ 31 января 2011

Очень коротко, вам нужно "промежуточное представление" булевых выражений.Это дерево, состоящее из Node объектов.Node имеет подклассы AndNode, OrNode, NotNode и VariableNode.AndNode имеет двух дочерних Node s, OrNode имеет двух дочерних Node s, а NotNode имеет одного дочернего Node.

A VariableNode имеет только переменнуюИмя Строка, например, "х".У вас будет HashMap<String, Boolean>, где каждый ключ имени переменной имеет соответствующее логическое значение.

Каждый класс Node имеет метод eval(), который оценивает свое выражение и возвращает boolean.Метод VariableNode.eval() ищет значение переменной в вашем HashMap и возвращает его.NotNode.eval() возвращает !child.eval().AndNode.evaluate() возвращает child1.eval() && child2.eval(), а OrNode.evaluate() возвращает child1.eval() || child2.eval().Чтобы оценить все дерево логических выражений, просто вызовите метод eval() корневого узла.

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

Если вы хотите создатьваши деревья выражений из строк, вам нужно написать синтаксический анализатор, который создает дерево из строки. Шаблоны языковой реализации Terence Parr - очень простое и понятное введение в это.

0 голосов
/ 31 января 2011

Вам нужно будет сгенерировать дерево выражений и связать каждый лист с логическим значением.Для анализа этого выражения и генерации AST взгляните на алгоритм Дейкстры Shunting Yard .Там все объяснено и довольно просто реализовать.

0 голосов
/ 31 января 2011

Как оценить логическое выражение?Логические выражения, подобные этим, можно оценивать как синтаксическое дерево, и я думаю, что в этом связанном вопросе есть некоторая полезная информация Анализатор логических выражений

Другая вещь, которая приходит на ум, заключается в том, что выхотите иметь возможность обрабатывать логические выражения как данные, что кажется более подходящим для языка сценариев, например, Jython, JRuby, Groovy или Scala (при условии, что вы ограничены JVM).Хотя я сомневаюсь, что было бы очень сложно написать синтаксический анализатор для обработки базовых и / или / не логических выражений.

...