синтаксический анализатор строковое логическое выражение - PullRequest
0 голосов
/ 28 марта 2011


Я должен создать поисковую систему, которая позволяет любому вводить любое логическое выражение, например (word1 + word2) - !word3 - где + означает and, - означает or, а ! означает not.

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

  Dictionary<string, List<int>> WordsAndDoc = new Dictionary<string, List<int>>();

и я искал каждое слово в базе данных, затем добавил его со списком идентификаторов документов в словаре
Я объявил два метода.
сначала объединить два списка:

public List<int> Intersect(List<int> P1, List<int> P2)

второй после объединения два Список:

public List<int> Union(List<int> P1, List<int> P2)

проблема в следующем: как мне разобрать логическое выражение в TextBox, где, если есть +, объединить два списка слов. если есть -, тогда объединение два списка наконец создать один список необходимых документов id ...
Пожалуйста, помогите мне и большое спасибо.

Ответы [ 2 ]

0 голосов
/ 28 марта 2011

Не совсем уверен, что понимаю вопрос, но не проще ли это сделать с помощью запроса к базе данных?например, преобразовать вводимый текст в:

(word1 + word2) -! word3

SELECT id FROM table WHERE (field like '% word1 %' and field like '% word2 %') 
  and not (field like '% word3 %')

Существует множество других способов выполнить запрос, например, если у вас есть полный текст или что-то ещев зависимости от базы данных, но это больше похоже на то, что лучше всего сделать, построив правильный запрос, а не работая с ним по факту.

0 голосов
/ 28 марта 2011

Я думаю, что вам нужно написать некую грамматику. Проект ANTLR может помочь вам сгенерировать код C #, встроенный в грамматику, как вы можете это сделать в LEX и YACC . Сообщество важно, я надеюсь, что вы можете найти свою грамматику еще не сделано.

Надеюсь, это поможет

JP

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