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

StackOverflow https://stackoverflow.com/questions/4845920

Вопрос

Как оценить сложные логические выражения, сгенерированные во время выполнения в программе 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 взгляните на алгоритм Дейкстры маневрового двора .Там все объяснено и довольно просто реализовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top