Разбор логического выражения

Рейтинг: 1Ответов: 2Опубликовано: 02.03.2025

Дано логическое выражение в виде строки. Например, такое:

a = 1 and (b = 2 and (c = 3 or c = 4) or d = 8 and s = 7)

Как его разложить на составляющие, чтобы в массиве строк были следующие элементы:

a = 1 and b = 2 and c = 3
a = 1 and b = 2 and c = 4
a = 1 and b = 2 and d = 8 and s = 7

Ответы

▲ 1
  1. Алгоритмом сортировочной станции разберите выражение из строки и постройте абстрактное синтаксическое дерево выражения.

  2. Дерево выражения преобразуйте к дизъюнктивной нормальной форме. Раздел Построение ДНФ прямо посвящён преобразованию.

  3. Дерево, с которым вы работали, скорее всего двоичное. Выполните объединение однотипных операций: если аргументом конъюнкции является конъюнкция, объедините их в один общий узел (у которого теперь будет больше двух аргументов). Тоже сделайте с дизъюнкциями.

  4. После преобразования в корне дерева оказывается дизъюнкция. Каждое её поддерево описывает нужное вам выражение – конъюнкцию. Преобразуйте поддеревья в текст.

▲ 0

Я могу предложить свой алгоритм. Не код. Алгоритм.

  1. Ищешь первую ).
  2. Затем от этого индекса двигаешься влево до первой (.
  3. Выражение внутри скобок проверяешь на наличие or. И разбиваешь его по or. В твоём примере - на c=3 и c=4.
  4. Добавляешь в список с=3 и c=4.
  5. Удаляешь из своей строки (c=3 и c=4).

И то разбивать надо, если перед ( стоит and. Иначе в список добавляется один элемент c=3 or c=4.

Плюс ты неправильно разложил на составляющие.