Вопрос

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

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

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

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

Это на C# :-)

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top