Разбор пользовательского запроса - PullRequest
5 голосов
/ 09 декабря 2008

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

"view all between 1/1/2008 and 1/2/2008"

Это нормально, если синтаксис должен быть достаточно структурированным и ограниченным этим конкретным доменом ... это опытные пользователи, которые будут использовать это.

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

Это в C #: -)

Ответы [ 8 ]

4 голосов
/ 09 декабря 2008

Вы описываете язык программирования. Конечно, это маленький язык (часто называемый небольшим языком, или домен-специфический язык (DSL)). Если вы никогда не слышали термин «синтаксический анализатор рекурсивного спуска», вам, вероятно, лучше следовать совету Пола и использовать выпадающие списки некоторого описания.

Однако, опять же, я должен был бы согласиться с ним, что если вы хотите сделать это, Antlr - это путь. На сайте есть учебники, которые могут помочь вам начать работу. В основном вам нужно будет описать синтаксис с помощью формы Бэкуса-Наура нотации.

Затем вы запустите Antlr над вашим грамматиком, и он сгенерирует ваш парсер. Затем вы можете подать ввод из вашего учебника в абстрактное синтаксическое дерево. Затем вы можете использовать это дерево для генерации вашего запроса. Это не так сложно, как кажется, но в этом есть немного.

Если вы действительно в этом заинтересованы и / или хотите немного растянуть свои крылья программирования, вы можете прочитать больше на эту тему с помощью Книги Дракона, AKA Compilers: Принципы, Методы и Инструменты.

Удачи, мой друг.

3 голосов
/ 09 декабря 2008

Для очень простого языка я бы использовал регулярные выражения. Главное преимущество в том, что вам не нужно заниматься генерацией кода. Отладка сопоставления с образцом в основном равна нулю.

Если ваш язык умеренно сложен (вы не возражаете указать всю вещь в одном файле грамматики), я бы выбрал Coco / R - это быстро, легко и делает чрезвычайно отлаживаемый код.

Для более сложного языка, мой текущий любимый язык - Antlr v3 . Поддерживает многофайловые грамматики (с помощью оператора import), что очень приятно. Сгенерированный код является отлаживаемым, но требует некоторого привыкания, прежде чем отладку можно будет считать «легкой».

2 голосов
/ 09 декабря 2008

Я был в такой ситуации раньше. После долгих обсуждений мы решили, что контекстные выпадающие списки являются лучшим решением, чем просто текстовое поле.

Например, есть 4 выпадающих списка, но последние 3 отключены. Затем, когда пользователь выбирает параметр из первого, он заполняет и включает другие. Таким образом, они выбирали «просмотреть все», затем «между», а затем, возможно, добавили бы текстовое поле или календарь для последних двух.

Вот пример, похожий на то, о чем я говорю

1 голос
/ 12 января 2009

Используйте Осло , он разработан специально для этого ...

1 голос
/ 09 декабря 2008

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

0 голосов
/ 12 января 2009

Генератор паролей GOLD имеет полезный пользовательский интерфейс для разработки и тестирования вашей грамматики, достаточно хорошие учебные пособия и документацию, а также прост в использовании из C #.

0 голосов
/ 09 декабря 2008

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

0 голосов
/ 09 декабря 2008

Попытка разобрать эти вещи была бы катастрофой, и в конечном итоге это очень ограничивало пользователя, таким образом расстраивая их больше, чем помогая им. Я бы предложил использовать предварительно определенные классы запросов с каким-либо инструментом построения запросов, который имеет все доступные параметры в раскрывающемся списке. Вы можете иметь разные логические операторы для разных типов данных (больше чем, меньше, чем для числовых, например, не как для строк и т. Д.), Однако я думаю, что это придало бы черту гораздо больше смысла, чем попытка разобрать, что может ввести пользователь.

...