Pytanie C ++ Analizator wyrażeń reguł biznesowych / ocena [zamknięty]


Szukam sugestii przenośnych lekkich bibliotek napisanych w C++, które wspierają wyrażenie i ocenę reguł matematycznych i biznesowych. rozumiem C++ nie zapewnia takiej funkcjonalności w STL.

Podstawowy wymóg jest następujący:

Wyrażenia, które mają być poddane ewaluacji, będą składać się z liczb i łańcuchów oraz zmiennych reprezentujących liczby lub łańcuchy.

Oczekuje się, że niektóre wyrażenia będą oceniane wielokrotnie na sekundę (1000-2000 razy), w związku z tym istnieje wymóg wysokiej jakości ocen wyrażeń.

Pierwotnie projekt w mojej firmie kodujemy wszystkie reguły biznesowe jako klasy wywodzące się z podstawowej klasy wyrażenia. Problem polega na tym, że podejście to nie jest skalowane, ponieważ rośnie liczba wyrażeń.

Przeszukałem go, ale większość "bibliotek", które udało mi się znaleźć, to całkiem proste przykłady algorytmu manewrowego, większość parserów wyrażeń, wykonujących analizę i analizę w tym samym kroku, co czyni je nieprzydatnymi do ciągłego przewartościowania, a większość obsługuje tylko. liczby.

Czego szukam:

  1. Biblioteka napisana w C ++ (C ++ 03 lub C ++ 11)
  2. Stabilny / produkcja godna
  3. Szybkie oceny
  4. Przenośny (win32 / linux)
  5. Wszelkie sugestie dotyczące budowy mechanizmu reguł biznesowych o wysokiej wydajności.

Przykładowa reguła biznesowa:

"rule_result = (pozostałe_systemy <min_items) i (item ==" piłka plażowa ")"


10
2017-10-06 22:59


pochodzenie


Widzieć Schematron (zastanawiając się, wątpię, czy poradziłby sobie z tymi prędkościami, chyba, że ​​przepisy były zestawione razem) - user2246674
Wygląda interesująco, ale jestem bardziej po tym, co dzieje się z regułą, niekoniecznie jak jest ona przechowywana lub reprezentowana. Z pewnością zajrzę do schemronu, ponieważ wygląda na to, że ma inne fajne pomysły. - Zamfir Kerlukson
Od dłuższego czasu szukałem biblioteki opartej na algorytmie RETE, nigdy nie znalazłem dokładnie tego, czego potrzebuję. Mogę mieć jakieś sugestie, ale nie miałem okazji ich skonfrontować. - Arpegius
możliwy duplikat Czy istnieje jakaś "klasa ekspresji" (C ++) - Macke
tylko z ciekawości, dlaczego nie używasz wbudowanego języka skryptowego, takiego jak [Lua]lua.org? Daje to maksymalną elastyczność bez zbytniego narzutu - Dmitry Ledentsov


Odpowiedzi:


Zobacz C ++ Biblioteka wyrażeń matematycznych przedstawione w ta odpowiedź.

Ale jeśli naprawdę chcesz prędkości, rozważ skompilowanie wyrażeń bezpośrednio jako C / C ++, a następnie załaduj je dynamicznie (obiekty udostępnione / biblioteki DLL).


13
2017-10-07 20:10



Daliśmy bibliotece exprtk szansę, i jest to dobre dopasowanie do wyrażenia eval dzięki za sugestię. - Zamfir Kerlukson
W tej chwili robimy "kompilowanie wyrażeń", problem polega na tym, że takie podejście nie jest skalowane, ponieważ liczba wyrażeń rośnie, a klienci chcą mieć możliwość dodawania nowych wyrażeń lub modyfikowania bieżących wyrażeń. Dlatego dynamiczna biblioteka ekspresji, taka jak ta, którą zasugerowałeś, wydaje się być najlepszym balansem. - Zamfir Kerlukson
@ZamfirKerlukson: Mówię o tym, aby twój framework / app generował i kompilował biblioteki DLL w locie, na podstawie danych wprowadzanych przez klienta. Skalowanie byłoby nieco lepsze, chociaż ładowanie tekstu jest łatwiejsze niż pliki binarne, to na pewno. ;) - Macke


Czy rozważałeś wygenerowanie swojego własnego parsera? Bizon + Zgiąć? Wykorzystuje on implementację parsera LALR opartą na FSM, która jest szybka i łatwa do napisania, a także obsługuje ocenę wyrażeń podczas ich analizowania, a także generowanie AST w celu powtórnej oceny.


1
2017-10-07 20:07