Potrzebuję szybkiego parsera wyrażeń runtime

Muszę znaleźć szybki, lekki parser wyrażeń.

Najlepiej przekazać mu listę par nazwa / wartość (np. zmienne) i łańcuch zawierający wyrażenie do oceny. Wszystko, czego potrzebuję, to wartość true / false.

Typy wyrażeń powinny być następujące:

varA == "xyz" and varB==123

Zasadniczo, tylko prosty silnik logiczny, którego wyrażenie jest dostarczane w czasie wykonywania.

UPDATE
Co najmniej musi wspierać ==,!=, >, >=,

Jeśli chodzi o szybkość, oczekuję około 5 wyrażeń do wykonania na żądanie. Zobaczymy gdzieś w okolicach 100 / 200m. Nasze obecne strony zwykle wykonują się w mniej niż 50ms. zwykle w wyrażeniu będą tylko 2 lub 3 zmienne. Jednak muszę załadować około 30 do parsera przed wykonaniem.

Aktualizacja 2012/11/5
Aktualizacja o wydajności. NCalc wdrożyliśmy prawie 2 lata temu. Od tego czasu rozszerzyliśmy jest to użycie takie, że średnio 40 + wyrażenia obejmujące 300 + zmienne na plecach postów. Obecnie występują tysiące kopii postów na sekundę przy absolutnie zerowej degradacji wydajności.

Rozszerzyliśmy go również o kilka dodatkowych funkcji, ponownie bez utraty wydajności. W skrócie, nCalc spełniło wszystkie nasze potrzeby i przekroczyło nasze oczekiwania.

Author: NotMe, 2010-12-08

5 answers

Czy widziałeś https://ncalc.codeplex.com/ i https://github.com/sheetsync/NCalc ?

Jest rozszerzalny, szybki (np. posiada własny cache) pozwala na dostarczanie niestandardowych funkcji i zmiennych w czasie wykonywania przez obsługę EvaluateFunction / EvaluateParameter zdarzeń. Przykładowe wyrażenia, które może analizować:

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());

Obsługuje również Unicode i wiele typów danych natywnie. Jest wyposażony w plik poroża, jeśli chcesz zmienić grammer. Istnieje również widelec, który obsługuje MEF aby załadować nowe funkcje.

Obsługuje również operatory logiczne, ciągi daty/czasu i polecenia if.

 31
Author: GreyCloud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-06 16:24:58

A co powiesz na Fast Lightweight Expression Evaluator ? Pozwala ustawić zmienne i obsługuje operatory logiczne .

Jeśli potrzebujesz czegoś mocniejszego i masz czas, możesz również zaprojektować swój własny język wyrażeń za pomocą ironii.

 12
Author: Corbin March,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-16 12:53:09

Interpreter Hisystems obsługuje niestandardowe funkcje, operatory i literały, jest lekkim, czystym, przenośnym kodem c#. Obecnie działa na iOS przez MonoTouch i powinien działać na każdym innym środowisku Mono, a także windows. Bezpłatne do użytku komercyjnego. Dostępne na Githubie pod adresem https://github.com/hisystems/Interpreter .

 5
Author: Toby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-23 10:58:34

W pełni doceniam, jak późna jest ta odpowiedź, jednak chciałbym dorzucić moje rozwiązanie, ponieważ wierzę, że może dodać więcej ponad akceptowaną odpowiedź za pomocą NCalc jeśli ktoś chce używać wyrażeń na wielu platformach.

-- Update --

stworzyłem parser dla C# z planami wdrożenia go również dla Javy i Swift w ciągu najbliższych kilku miesięcy. Oznaczałoby to, że można oceniać wyrażenia na wielu platformach bez potrzeba dostosowania na platformę.

Chociaż Java i Swift były planowane, nigdy nie dotarły do pełnoprawnego wydania. Zamiast tego istnieje teraz wsparcie dla .NET Standard, umożliwiając obsługę Xamarin aplikacji.

-- End update --

Expressive jest narzędziem i jest dostępne na: GitHub lub Nuget .

Strona ma sporą ilość dokumentacji na jej temat, ale aby zapobiec gniciu linków, oto przykład, jak z niej korzystać:

Zmienna wsparcie

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

Funkcje

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

Został zaprojektowany tak, aby jak najlepiej pasował do NCalc, jednak dodano obsługę takich rzeczy, jak słowo kluczowe "null".

 1
Author: Bijington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 08:26:01

Autopromocja tutaj napisałem aa generic parser generator dla c # https://github.com/b3b00/csly przykład wyrażenia parseras znajdziesz na moim GitHubie. może być konieczne dostosowanie go do swoich potrzeb

 -1
Author: Olivier Duhart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-30 09:01:11