Это псевдо домашнее задание (это дополнительный кредит).У меня есть BST, который является индексом слов, которые указывают на строки (хранящиеся где-то еще), которые содержат слова.Мне нужно реализовать способ поиска с использованием s-выражений, чтобы я мог комбинировать и (&) и или (|).
В командной строке пользователь может ввести что-то вроде:
QUERY ((((fire)&(forest))|((ocean)&(boat)))&(water))
По сути, это должно вернуть все строки, содержащие слова огонь, лес и вода, а также все строки, содержащие океан, лодку и воду.
Мне действительно нужна помощь в том, чтобылогика синтаксического анализа и вставки узлов в дерево для правильного представления выражения больше, чем фактический код.Единственная вещь, которую я разработал, которая имеет смысл для меня, это возвращение набора строк для каждого слова в выражении.Затем, в зависимости от того, является ли это операцией «или» или «и», я выполняю операцию типа объединения или пересечения над этими наборами, чтобы создать новый набор и передать его вверх по дереву.
Я отчасти потеряно том, как разобрать строку, содержащую выражение.После некоторых размышлений кажется, что «чем дальше» одно из подвыражений, тем выше оно должно быть в моем дереве s-выражений?Я думаю, что если бы я мог просто получить толчок в правильном направлении, насколько это возможно при разборе и вставке выражений в дерево, у меня все было бы в порядке.
Мое дерево примеров, которое я создал для запроса выше, выглядит примерно так:;
&
/ \
| water
/ \
& &
/ \ / \
fire forest ocean boat
Это имеет смысл, поскольку огонь возвращает набор строк, в которых содержится огонь, а лес возвращает набор строк, в которых содержится лес.Затем на уровне «&» я взял бы эти два набора и создал бы другой набор, который содержал бы только строки, которые были в обоих наборах, таким образом давая мне набор, который имеет только строки, которые содержат и огонь, и лес.
МойДругим камнем преткновения является то, как представить все на дереве после того, как я преодолею препятствие разбора.У меня есть класс ExpTreeNode, который будет служить узлами для моего ExpTree (BST), а затем у меня есть 2 подкласса, оператор и операнд, но я не уверен, что это хороший подход.