Для достижения цели необходимо выполнить 4 шага:
1) проанализировать выражение, используя «стандартные» (не связанные с вашей терминологией) методы синтаксического анализа, и получить то, что составляет дерево логических выражений, представляющее (проанализированный)) выражение.
2) применить правила булевой алгебры к дереву выражений, чтобы преобразовать его из представления, которое вам не нужно, в представление, которое вы делаете.Ваша «стандартная форма», по-видимому, является конъюнктивной нормальной формой (CNF), поэтому вам нужны правила алгебры дистрибутивного права, чтобы «умножать» продукты на суммы (например, a * (b + c)), чтобы «избавиться от скобок»
3) Затем вам нужно применить некоторые упрощающие правила (например, подстановка, отмена), чтобы избавиться от лишних терминов, например, a * b + a * b + c ==> a * b [a * b* c определили], и a * b * a '+ b * c ==> b * c [a * .. a' отменяется].Это всего лишь несколько правил алгебры.
4) PrettyПечать полученный термин алгебры в удобочитаемом формате.
Вы можете написать все это с помощью A) специального анализа рекурсивного спуска с ручным кодированием и специального анализаприменение правила и prettyprinting, или B) вы можете получить генератор синтаксического анализатора (ANTLR хорошо), чтобы выполнить синтаксический анализ, и выполнить манипулирование правилом специальными методами, и prettyprint, используя некоторую помощь, такую как строковые шаблоны, или C), вы можете получитьинструмент, который выполняет синтаксический анализ, строит деревья, применяет заданные вами правила алгебры и имеет встроенную функцию печати.
Наш инструментарий реинжиниринга программного обеспечения DMS может хорошо подойти к случаю C.Вы можете увидеть пример применения стандартных правил алгебры, который является прямым аналогом вашей проблемы .
Одна из проблем, которую действительно трудно решить, - это обработка ассоциативности и коммутативности в алгебре.Например, знание того, что A * B * A 'равно "false", является следствием правила алгебры X * X' => false, но вы не можете просто проверить шаблон в правиле алгебры напрямую.Вы должны применять правила алгебры, учитывающие коммутативность.Тот же аргумент в пользу ассоциативности.Одна из вещей, которые DMS делает хорошо, это обрабатывает это для вас, если вы объявляете соответствующие операторы, чтобы иметь эти свойства.Вы можете увидеть это в примере.
Увы, не закодировано в Java.