In einem Projekt, an dem ich arbeite, muss ich mit einer ziemlich seltsamen Datenquelle arbeiten. Ich kann es eine "Abfrage" geben und es wird mir eine DataTable zurückgeben. Aber die Abfrage ist keine traditionelle Zeichenfolge. Es ist eher wie ... eine Reihe von Methodenaufrufen, die die Kriterien definieren, die ich möchte. Etwas in dieser Richtung:C#: Wie man willkürliche Zeichenketten in Ausdruckbäume parst?
var tbl = MySource.GetObject("TheTable");
tbl.AddFilterRow(new FilterRow("Column1", 123, FilterRow.Expression.Equals));
tbl.AddFilterRow(new FilterRow("Column2", 456, FilterRow.Expression.LessThan));
var result = tbl.GetDataTable();
Im Wesentlichen unterstützt alle Standard-Sachen (Boolesche Operatoren, Klammern, einige Funktionen, etc.), aber die Syntax für das Schreiben es recht ausführlich ist und unangenehm für den täglichen Gebrauch.
Ich wollte einen kleinen Parser machen, der einen gegebenen Ausdruck parsen würde (wie "Column1 = 123 AND Column2 < 456"
) und ihn in die obigen Funktionsaufrufe konvertieren. Es wäre auch schön, wenn ich dort Parameter hinzufügen könnte, damit ich vor Injektionsangriffen geschützt bin. Das letzte kleine Stück Zucker oben wäre, wenn es die Parse-Ergebnisse zwischenspeichern und wiederverwenden könnte, wenn die gleiche Abfrage an einem anderen Objekt erneut ausgeführt werden soll.
Also habe ich mich gefragt - gibt es irgendwelche existierenden Lösungen, die ich dafür verwenden könnte, oder muss ich meinen eigenen Ausdrucksparser ausrollen? Es ist nicht zu kompliziert, aber wenn ich mir zwei oder drei Tage Code sparen und eine Menge Bugs reparieren kann, wäre es das wert.
Sieht riesig aus. Mein Bedürfnis ist winzig. : P –
Die Irony-Assembly ist 171 KB groß (Debug-Version). Und Sie können es bei Bedarf in Ihre App übersetzen, da der Quellcode verfügbar ist. Für Ihre Bedürfnisse sollte es ziemlich einfach sein (d. H. Nicht viel Code), um es zu verwenden. Ich benutze es in einem Ausdruck Parser/Evaluator-Projekt, und der Code ist nur ein paar hundert Zeilen, obwohl meine Ausdruck Sprache ist viel komplexer als das, was Sie beschrieben. Die DLR hingegen ist wirklich ein bisschen größer, aber für Sie ist das nicht wirklich notwendig :) – OregonGhost