Как оценить сложные булевы выражения, сгенерированные во время выполнения в Java-программе?Оценить булевское выражение в java-генерации во время выполнения
Пример:
(х и у, г) и ы
с х, у, г булевы переменные ...
Благодарности
Как оценить сложные булевы выражения, сгенерированные во время выполнения в Java-программе?Оценить булевское выражение в java-генерации во время выполнения
Пример:
(х и у, г) и ы
с х, у, г булевы переменные ...
Благодарности
Использовать http://docs.codehaus.org/display/JANINO/Home для минимальной работы. Я могу сделать гораздо больше, чем простые выражения.
Где я могу найти пример? – sdfrevfse
На странице, на которую я указал, http://docs.codehaus.org/display/JANINO/Basic. Самый первый пример должен быть достаточным, просто измените типы на boolean. – maaartinus
спасибо, Это простое и немедленное решение, которое удовлетворяет то, что меня интересует. – sdfrevfse
Как оценить логическое выражение? Логические выражения, такие как те, которые могут быть оценены как дерево синтаксиса, и я думаю, что есть какая-то хорошая информация по этому связанному вопросу. Logic expression parser
Другое, что напоминает, что вы хотите иметь возможность обрабатывать логические выражения как данные , который кажется чем-то более подходящим для языка сценариев, например, Jython, JRuby, Groovy или Scala (если вы ограничены JVM). Хотя я сомневаюсь, что было бы очень сложно написать парсер для обработки основных и/или/не логических выражений.
Вам нужно будет сгенерировать дерево выражений и привязать каждый лист к логическому значению. Для разбора этого выражения и создания AST см. Алгоритм Shunting Yard Dijkstra. Здесь все объяснено и довольно просто реализовать.
Вкратце, вам нужно «промежуточное представление» булевых выражений. Это дерево, образованное из 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 - очень простое и понятное введение в это.
Этот подход отлично подойдёт для меня. Я также реализовал интерфейс редактора визуальных выражений в веб-приложении JSF с помощью элемента управления TreeView Tomahawk для отображения узлов. –
Ваш вопрос непонятен. Что не так с 'if ((x && y || z) && s)'? –
Можете ли вы привести пример кода, показывающий, как вы представляете свои выражения? – sinelaw
Выражения загружаются из XML-файла, но логические переменные принимают разные значения в соответствии с текущим состоянием программы. Поэтому я не могу использовать if, как было предложено выше, потому что это не всегда одно и то же выражение ... – sdfrevfse