C #: Wie parsen wir beliebige Zeichenfolgen in Ausdrucksbäume?

.net c# expression-trees parsing

Frage

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:

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 es alle Standard-Sachen (boolesche Operatoren, Klammern, einige Funktionen usw.), aber die Syntax zum Schreiben ist ziemlich ausführlich und unbequem 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 vorhandenen 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.

Akzeptierte Antwort

Probieren Sie Ironie aus . Obwohl die Dokumentation fehlt, werden Sie die Proben sehr schnell in Betrieb nehmen. Irony ist ein Projekt zum Parsen von Code und zum Erstellen von abstrakten Syntaxbäumen, aber Sie müssen möglicherweise ein wenig Logik schreiben, um ein Formular zu erstellen, das Ihren Anforderungen entspricht. Die DLR kann die Ergänzung dafür sein, da sie Code aus abstrakten Syntaxbäumen dynamisch erzeugen / ausführen kann (sie wird für IronPython und IronRuby verwendet). Die beiden sollten ein gutes Paar bilden.

Oh, und sie sind beide erstklassige .NET-Lösungen und Open Source.


Beliebte Antwort

Ich habe einen Parser genau für diesen Gebrauch und Schwierigkeitsgrad von Hand geschrieben. Es hat ungefähr 2 Tage gedauert. Ich bin froh, dass ich es getan habe, aber ich würde es nicht noch einmal tun. Ich würde ANTLR oder F # 's Fslex verwenden.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum