Как оценить и обработать простое дерево синтаксиса строк в C #?

У меня есть корпус документов на основе индекса токенов, который предлагает метод запроса. Пользователь вручную (!) Вводит строку запроса, которую необходимо проанализировать и оценить. Затем корпус должен вернуть список всех документов, соответствующих данной строке запроса. В языке запросов используются простые логические операторы И, НЕ и ИЛИ, приоритет которых также можно указать с помощью скобок. После некоторого исследования я уже использовал ANTLR для синтаксического анализа заданной строки запроса в синтаксическое дерево.

Например: запрос

"Bill OR (John AND Jim) OR (NOT Simon AND Mike)"

переведен в следующее синтаксическое дерево:

РЕДАКТИРОВАТЬ: Пожалуйста, посмотрите правильный график в Bart Kiers post (скопировано здесь):

enter image description here

Все узлы в дереве представляют собой простые строки, и каждый узел знает своих родителей и потомков, но не знает своих братьев и сестер. Как видите, грамматика ANTLR уже продиктовала порядок, в котором должны выполняться операции: те, что внизу дерева, идут первыми.

Итак, что мне, вероятно, нужно сделать, это повторно (?) Оценить все операнды в дереве. В общем, я могу выполнить простой поиск в моем корпусе, используя метод Get (строковый термин) для каждого листа в дереве (например, «Билл» или «Джон»). Get () возвращает список документов, содержащих термин в листе. Я также могу оценить родителя каждого листа, чтобы распознать возможный оператор NOT, который затем приведет к списку результатов документов, НЕ содержащих термин в листе (с использованием метода Not () вместо Get ()).

Операторы AND и OR должны быть преобразованы в вызовы методов, которым требуются два параметра:

  • AND должен вызывать метод Intersect (list1, list2), который возвращает список документов, которые находятся в list1 AND в list2.
  • OR должен вызывать метод метод Union (list1, list2), который возвращает список документов, которые находятся либо в list1, либо в list2.

Параметры list1 и list2 содержат документы, которые я получил перед использованием Get () или Not ().

Мой вопрос: как я могу - семантически и синтаксически в C # - оценить все необходимые условия поиска и использовать их для вызова правильные методы оператора в правильном порядке? Интуитивно это звучит как рекурсия, но я почему-то не могу это представить - тем более, что не все методы, которые необходимо вызвать, имеют одинаковое количество параметров. Или, может быть, есть другие способы сделать это?

5
задан Bart Kiers 22 March 2011 в 21:16
поделиться