Разбор нестандартной формы в стандартную форму в Java - PullRequest
2 голосов
/ 23 марта 2012

Я хочу написать анализатор Java, который преобразует логическую функцию нестандартной формы (NSF) в стандартную форму (SF).

Пример NSF:

A * B + D (A + B) C + A * B (A * B '+ A + B) D

Чтобы получить NSF для SF, вы должны умножить скобки.SF из приведенной выше функции выглядит так: A*B + D*A*C + D*B*C + A*B*A*B'*D + A*B*A*D + A*B*B*D

Кто-нибудь знает, как я могу это реализовать?

спасибо

1 Ответ

2 голосов
/ 26 марта 2012

Для достижения цели необходимо выполнить 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...