Очень коротко, вам нужно "промежуточное представление" булевых выражений.Это дерево, состоящее из 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 - очень простое и понятное введение в это.