2

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

Пример:

(х и у, г) и ы

с х, у, г булевы переменные ...

Благодарности

+2

Ваш вопрос непонятен. Что не так с 'if ((x && y || z) && s)'? –

+1

Можете ли вы привести пример кода, показывающий, как вы представляете свои выражения? – sinelaw

+0

Выражения загружаются из XML-файла, но логические переменные принимают разные значения в соответствии с текущим состоянием программы. Поэтому я не могу использовать if, как было предложено выше, потому что это не всегда одно и то же выражение ... – sdfrevfse

ответ

1

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

+0

Где я могу найти пример? – sdfrevfse

+0

На странице, на которую я указал, http://docs.codehaus.org/display/JANINO/Basic. Самый первый пример должен быть достаточным, просто измените типы на boolean. – maaartinus

+0

спасибо, Это простое и немедленное решение, которое удовлетворяет то, что меня интересует. – sdfrevfse

0

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

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

0

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

1

Вкратце, вам нужно «промежуточное представление» булевых выражений. Это дерево, образованное из Node объектов. Node имеет подклассы AndNode, OrNode, NotNode и VariableNode. У AndNode есть двое детей Node s, у OrNode есть двое детей Node s, а у NotNode один ребенок Node.

A VariableNode имеет только переменное имя String, например, «x». У вас будет 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's Language Implementation Patterns - очень простое и понятное введение в это.

+0

Этот подход отлично подойдёт для меня. Я также реализовал интерфейс редактора визуальных выражений в веб-приложении JSF с помощью элемента управления TreeView Tomahawk для отображения узлов. –

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