Мне нужен быстрый анализатор выражений во время выполнения - PullRequest
28 голосов
/ 08 декабря 2010

Мне нужно найти быстрый, легкий анализатор выражений.

В идеале я хочу передать ему список пар имя / значение (например, переменные) и строку, содержащую выражение для оценки.Все, что мне нужно, это истинное / ложное значение.

Типы выражений должны быть такими:

varA == "xyz" and varB==123

По сути, это простой логический движок, выражение которого предоставляется во время выполнения.

ОБНОВЛЕНИЕ
Как минимум, он должен поддерживать ==,! =,>,> =, <, <= </p>

Что касается скорости, я ожидаю, что примерно 5 выражений будут выполняться за запрос.Мы увидим где-то в районе 100 / запросов в секунду.Наши текущие страницы, как правило, выполняются менее чем за 50 мс.Обычно в любом выражении участвуют только 2 или 3 переменные.Однако перед выполнением мне потребуется загрузить в анализатор приблизительно 30 единиц.

ОБНОВЛЕНИЕ 2012/11/5
Обновление о производительности.Мы внедрили nCalc почти 2 года назад.С тех пор мы расширили его использование так, что мы усредняем более 40 выражений, охватывающих более 300 переменных на постах.В настоящее время происходят тысячи обратных запросов в секунду с абсолютно нулевым снижением производительности.

Мы также расширили его, включив в него несколько дополнительных функций, опять же без потери производительности.Короче говоря, nCalc удовлетворил все наши потребности и превзошел наши ожидания.

Ответы [ 5 ]

33 голосов
/ 09 декабря 2010

Вы видели https://ncalc.codeplex.com/ и https://github.com/sheetsync/NCalc?

Это расширяемое, быстрое (например, имеет собственный кэш) позволяет вам предоставлять пользовательские функции и переменные во время выполнения путем обработки событий EvaluateFunction / EvaluateParameter. Примеры выражений, которые он может анализировать:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");

  e.Parameters["Pi2"] = new Expression("Pi * Pi");
  e.Parameters["X"] = 10;

  e.EvaluateParameter += delegate(string name, ParameterArgs args)
    {
      if (name == "Pi")
      args.Result = 3.14;
    };

  Debug.Assert(117.07 == e.Evaluate());

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

Он также поддерживает логические операторы, строки даты / времени и операторы if.

14 голосов
/ 09 декабря 2010

Как насчет Быстрого и легкого средства оценки выражений ? Он позволяет устанавливать переменные и поддерживает логические операторы .

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

6 голосов
/ 23 ноября 2012

Интерпретатор Hisystems поддерживает пользовательские функции, операторы и литералы, это легкий чистый код на C #.В настоящее время работает на iOS через MonoTouch и должен работать в любой другой среде Mono, а также в Windows.Бесплатно для коммерческого использования.Доступно на GitHub на https://github.com/hisystems/Interpreter.

3 голосов
/ 29 июня 2016

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

- Обновление -

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

Несмотря на то, что Java и Swift были запланированы, он так и не попал в полную версию. Вместо этого теперь есть поддержка .NET Standard, включающая поддержку Xamarin приложений.

- Конец обновления -

Expressive - это инструмент, который доступен по адресу: GitHub или Nuget .

На сайте имеется достаточное количество документации, но для предотвращения гниения ссылок вот пример того, как его использовать:

Переменная поддержка

var expression = new Expression("1 * [variable]");
var result = expression.Evaluate(new Dictionary<string, object> { ["variable"] = 2);

Функция

var expression = new Expression("sum(1,2,3,4)");
var result = expression.Evaluate();

Он был разработан так, чтобы максимально соответствовать NCalc, однако в него добавлена ​​поддержка таких вещей, как ключевое слово 'null'.

0 голосов
/ 30 сентября 2017

самореклама здесь я написал универсальный генератор парсера для c # https://github.com/b3b00/csly Вы можете найти пример выражения parseras на моем github. вам может понадобиться настроить его под свои нужды

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