Парсер для дерева выражений фильтра запросов - PullRequest
2 голосов
/ 17 сентября 2009

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

В идеале я ищу код .NET (C #), но также похожий синтаксический анализатор, который работает в T-SQL.

Я хочу, чтобы что-то было проанализировано, например:

((а = Ь) | (е = 1)) & (с <= г) </p>

В идеале операторы могут быть определяемыми (например, '<' vs 'lt', '=' vs '==' vs 'eq' и т. Д.), И мы можем указать метки функционального типа (например, (left (x, 1) = 'е')). Синтаксический анализатор загружает это, подчиняется порядку приоритета (и в идеале обрабатывает отсутствие каких-либо скобок), а затем вызывает мой код с помощью выражений для вычисления логического результата - например, 'А = Ь'?). Я не ожидал бы, что анализатор поймет пользовательские функции в выражении (хотя некоторые основные из них будут полезны, например, разбиение строк). Разделение выражения (на левую и правую части) было бы неплохо. </p>

Предпочтительно, чтобы синтаксический анализатор задавал минимальное количество вопросов, чтобы получить окончательный результат - например, если одна сторона AND ложна, нет смысла оценивать другую сторону, и сначала оценивать самую простую сторону (т. е. в вышеприведенном выражении 'c <= d' следует считать более быстрым и, следовательно, оценивать первым. </p>

Я могу себе представить, что это большая работа, однако довольно распространенная. Кто-нибудь может дать мне какие-нибудь указатели? Если нет парсеров, которые были бы такими же гибкими, как указано выше, есть ли какие-нибудь базовые парсеры, которые я могу использовать для начала?

Большое спасибо

Lee

Ответы [ 5 ]

1 голос
/ 01 ноября 2009

Вы можете проверить Ирония . С его помощью вы определяете свою грамматику в коде C #, используя синтаксис, который не далеко от BNF. У них даже есть простой пример на их сайте (оценщик выражений), который, кажется, довольно близок к тому, чего вы хотите достичь.

Редактировать: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * На этой конференции в этом году Lang.Net.

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

1 голос
/ 17 сентября 2009

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

0 голосов
/ 02 ноября 2009

Для этого вы можете использовать деревья выражений .NET. И пример на самом деле довольно прост.

Expression<Func<int, int, int, int, bool>> test = (int a, int b, int c, int d) => ((a == b) | (c == 1)) & (c <= d);

А затем просто посмотрите на «тест» в отладчике. Все уже проанализировано для вас, вы можете просто использовать его.

Единственная проблема в том, что в .NET 3.5 у вас может быть только 4 аргумента в Func. Итак, я изменил «е» на «с» в одном месте. В 4.0 этот лимит изменен на 16.

0 голосов
/ 17 сентября 2009

Если это возможно, используйте выражения .Net 3.5.

Компилятор анализирует ваше выражение для вас и выдает дерево выражений, которое вы можете анализировать и использовать по мере необходимости. Не очень просто, но выполнимо (фактически все реализации интерфейса IQueryable делают именно это).

0 голосов
/ 17 сентября 2009

Попробуйте Vici.Parser: скачайте его здесь (бесплатно) , это самый гибкий анализатор / оценщик выражений, который я когда-либо встречал.

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