2009-04-22 6 views
4

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.

Antwort

7

Probieren Sie Irony. 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 könnte die Ergänzung dafür sein, da sie Code aus abstrakten Syntaxbäumen dynamisch generieren/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.

+0

Sieht riesig aus. Mein Bedürfnis ist winzig. : P –

+0

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

0

Bison oder JavaCC oder dergleichen erzeugt einen Parser aus einer Grammatik. Sie können dann die Knoten des Baums mit Ihrem eigenen Code erweitern, um den Ausdruck zu transformieren.

OP-Kommentare: Ich möchte nicht wirklich ausführbare Dateien von Drittanbietern mit meinem weichen. Ich möchte, dass es in meinem Code kompiliert wird.

Beide Tools generieren Quellcode, mit denen Sie verknüpfen.

+0

Ich möchte wirklich keine ausführbaren Dateien von Drittanbietern mit meinem Soft ausliefern. Ich möchte, dass es in meinem Code kompiliert wird. –

0

ich einen Parser für exaclty dieser Nutzung und Komplexitätsniveau 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.

Verwandte Themen