Ich brauche einen schnellen Laufzeit-Ausdrucksparser

Ich muss einen schnellen, leichten Ausdrucksparser finden.

Im Idealfall möchte ich eine Liste von Name / Wert-Paaren (z. B. Variablen) und eine Zeichenfolge, die den auszuwertenden Ausdruck enthält, übergeben. Alles was ich brauche, ist ein wahrer / falscher Wert.

Die Arten von Ausdrücken sollten wie folgt aussehen:

varA == "xyz" and varB==123 

Im Grunde nur eine einfache Logik-Engine, deren Ausdruck zur Laufzeit bereitgestellt wird.

AKTUALISIEREN
Zumindest muss es ==,! =,>,> =, <, <= Unterstützen

Was die Geschwindigkeit betrifft, erwarte ich, dass ungefähr 5 Ausdrücke pro Anfrage ausgeführt werden. Wir werden irgendwo in der Nähe von 100 / Anfragen eine Sekunde sehen. Unsere aktuellen Seiten neigen dazu, in weniger als 50ms ausgeführt zu werden. Normalerweise sind nur 2 oder 3 Variablen an einem Ausdruck beteiligt. Allerdings muss ich vor der Ausführung ungefähr 30 in den Parser laden.

UPDATE 2012/11/5
Update über die performance Wir haben nCalc vor fast 2 Jahren implementiert. Seither haben wir den Einsatz so erweitert, dass wir durchschnittlich 40+ Ausdrücke mit mehr als 300 Variablen auf Post-Backs verwenden. Es gibt jetzt Tausende von Post-Backs pro Sekunde mit absolut null performanceseinbußen.

Wir haben es auch um eine Handvoll zusätzlicher functionen erweitert, wiederum ohne performancesverlust. Kurz gesagt, nCalc hat alle unsere Bedürfnisse erfüllt und unsere Erwartungen übertroffen.

Hast du https://ncalc.codeplex.com/ und https://github.com/sheetsync/NCalc gesehen ?

Es ist erweiterbar, schnell (zB hat seinen eigenen Cache) ermöglicht es Ihnen, benutzerdefinierte functionen und functionen zur Laufzeit bereitzustellen, indem Sie EvaluateFunction / EvaluateParameter-Ereignisse behandeln. Beispielausdrücke, die es analysieren kann:

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

Es behandelt auch Unicode und viele Datentypen nativ. Es kommt mit einer Geweihdatei, wenn Sie die Grammatik ändern möchten. Es gibt auch eine Gabel, die MEF unterstützt, um neue functionen zu laden.

Es unterstützt auch logische Operatoren, Strings für Datum und Uhrzeit und if-statementen.

Wie wäre es mit dem Fast Lightweight Expression Evaluator ? Sie können Variablen festlegen und logische Operatoren unterstützen.

Wenn Sie etwas härteres brauchen und Zeit haben, können Sie mit Irony auch Ihre eigene Ausdruckssprache entcasting.

Hisystems ‘Interpreter unterstützt benutzerdefinierte functionen, Operatoren und Literale, ist leichter, reiner c # portabler Code. Läuft derzeit auf iOS über MonoTouch und sollte auf jeder anderen Mono-Umgebung sowie Windows laufen. Frei für kommerzielle Nutzung. Verfügbar auf GitHub unter https://github.com/hisystems/Interpreter .

Ich weiß zu schätzen, wie spät diese Antwort ist, aber ich würde gerne meine Lösung einbringen, weil ich glaube, dass sie mehr als die akzeptierte Antwort von NCalc hinzufügen kann, wenn jemand die Ausdrücke über mehrere Plattformen hinweg verwenden möchte.

Ich habe einen Parser für C # erstellt und möchte ihn in den nächsten Monaten auch für Java und Swift implementieren. Dies würde bedeuten, dass Sie die Ausdrücke auf Multi-Plattformen auswerten können, ohne dass Sie pro Plattform Änderungen vornehmen müssen.

Expressiv ist das Werkzeug und es ist verfügbar unter: GitHub oder Nuget .

Die Seite hat eine Menge an Dokumentation darüber, aber Link-Verrottung zu verhindern, ist ein Beispiel dafür, wie man es benutzt:

Variable Unterstützung

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

functionen

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

Es wurde entwickelt, um NCalc so gut wie möglich anzupassen, aber es hat Unterstützung für Dinge wie ein “Null” -Schlüsselwort hinzugefügt.

Selbst-Promotion hier schrieb ich einen generischen Parser-Generator für c # https://github.com/b3b00/csly Sie können einen Ausdruck parseras Beispiel auf meinem GitHub finden. Sie müssen es möglicherweise an Ihre Bedürfnisse anpassen