Разбор логического выражения
Дано логическое выражение в виде строки. Например, такое:
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
Ответы (2 шт):
Алгоритмом сортировочной станции разберите выражение из строки и постройте абстрактное синтаксическое дерево выражения.
Дерево выражения преобразуйте к дизъюнктивной нормальной форме. Раздел Построение ДНФ прямо посвящён преобразованию.
Дерево, с которым вы работали, скорее всего двоичное. Выполните объединение однотипных операций: если аргументом конъюнкции является конъюнкция, объедините их в один общий узел (у которого теперь будет больше двух аргументов). Тоже сделайте с дизъюнкциями.
После преобразования в корне дерева оказывается дизъюнкция. Каждое её поддерево описывает нужное вам выражение – конъюнкцию. Преобразуйте поддеревья в текст.
Я могу предложить свой алгоритм. Не код. Алгоритм.
- Ищешь первую
). - Затем от этого индекса двигаешься влево до первой
(. - Выражение внутри скобок проверяешь на наличие
or. И разбиваешь его поor. В твоём примере - наc=3иc=4. - Добавляешь в список
с=3иc=4. - Удаляешь из своей строки
(c=3иc=4).
И то разбивать надо, если перед ( стоит and. Иначе в список добавляется один элемент c=3 or c=4.
Плюс ты неправильно разложил на составляющие.