оценить логическое выражение в java, генерировать во время выполнения
-
27-10-2019 - |
Вопрос
Как оценить сложные логические выражения, сгенерированные во время выполнения в программе Java?
Пример:
(x и y или z) и s
с логическими переменными x, y, z ...
Спасибо
Решение
Используйте http://docs.codehaus.org/display/JANINO/Home .за минимум работы.Я умею гораздо больше, чем простые выражения.
Другие советы
Вкратце, вам нужно «промежуточное представление» логических выражений. Это дерево, состоящее из объектов сгенерированного кода. Node
имеет подклассы Node
, AndNode
, OrNode
и NotNode
. VariableNode
имеет два дочерних кода AndNode
, код Node
имеет два дочерних кода OrNode
, а код Node
имеет один дочерний код NotNode
.
Генеракодический код кода имеет только имя переменной String, например, «x». У вас будет общий кодовый код, в котором каждый ключ имени переменной имеет связанное логическое значение.
Каждый класс Node имеет метод Node
, который оценивает его выражение и возвращает код VariableNode
. Метод HashMap<String, Boolean>
ищет значение переменной в вашем коде eval()
и возвращает его. boolean
возвращает код VariableNode.eval()
. HashMap
возвращает код NotNode.eval()
, а !child.eval()
возвращает код AndNode.evaluate()
. Чтобы оценить все дерево логического выражения, просто вызовите метод child1.eval() && child2.eval()
корневого узла.
Вы можете построить эти деревья логических выражений программно, используя конструкторы Java и т. д.
Если вы хотите построить дерево выражений из строк, вам необходимо написать синтаксический анализатор, который создает дерево из строки. Шаблоны реализации языка Теренса Парра - очень простое и понятное введение в это.
Как оценить логическое выражение?Логические выражения, подобные этим, можно оценить как синтаксическое дерево, и я думаю, что в этом связанном вопросе есть полезная информация Логикапарсер выражений
Еще одна вещь, которая приходит на ум, - это то, что вы хотите иметь возможность обрабатывать логические выражения как данные, что кажется более подходящим для языка сценариев, например, Jython, JRuby, Groovy или Scala (при условии, что вы ограниченыJVM).Хотя я сомневаюсь, что было бы очень сложно написать парсер для обработки основных и / или / не логических выражений.
Вам нужно будет сгенерировать дерево выражений и привязать каждый лист к логическому значению.Для синтаксического анализа этого выражения и создания AST взгляните на алгоритм Дейкстры маневрового двора .Там все объяснено и довольно просто реализовать.