Parser für den Abfragefilter-Ausdrucksbaum

c# expression-trees parsing tsql

Frage

Ich suche nach einem Parser, der auf einem Abfragefilter operieren kann. Allerdings bin ich mir der Terminologie nicht ganz sicher, also ist es harte Arbeit. Ich hoffe, dass mir jemand helfen kann. Ich habe über 'Recursive-Descent-Parser' gelesen, aber ich frage mich, ob diese für vollwertige Sprach-Parser sind und nicht für die logische Ausdruck-Auswertung, nach der ich suche.

Idealerweise suche ich nach .NET-Code (C #), aber auch nach einem ähnlichen Parser, der in T-SQL funktioniert.

Was ich möchte, ist etwas zu analysieren, zB:

((a = b) | (e = 1)) & (c <= d)

Im Idealfall können die Operatoren definierbar sein (zB '<' vs 'lt', '=' vs '==' vs 'eq', usw.) und wir können Funktionstyp-Labels angeben (zB (links (x, 1) =) "e")). Der Parser lädt dies, folgt der Rangfolge der Reihenfolge (und behandelt im Idealfall das Fehlen jeglicher Klammern) und ruft dann zu meinem Code mit Ausdrücken auf, um ein boolesches Ergebnis auszuwerten - zB 'a = b'?). Ich würde nicht erwarten, dass der Parser die benutzerdefinierten Funktionen im Ausdruck versteht (obwohl einige grundlegende nützlich wären, wie das Teilen von Strings). Den Ausdruck (in linke und rechte Teile) zu teilen wäre schön.

Es ist vorzuziehen, dass der Parser die minimale Anzahl von Fragen stellt, um das Endergebnis zu berechnen - zB wenn eine Seite eines ANDs falsch ist, gibt es keinen Punkt, der die andere Seite bewertet und die einfachste Seite zuerst bewertet (dh in der obige Ausdruck, c <= d 'sollte als schneller angenommen und somit zuerst ausgewertet werden.

Ich kann mir vorstellen, dass dies viel Arbeit ist, aber ziemlich häufig. Kann mir jemand irgendwelche Hinweise geben? Wenn es keine Parser gibt, die so flexibel sind wie oben, gibt es irgendwelche grundlegenden Parser, die ich als Anfang verwenden kann?

Danke vielmals

Lee

Beliebte Antwort

Du könntest dir Ironie ansehen . Damit definieren Sie Ihre Grammatik im C # -Code mit einer Syntax, die nicht zu weit von bnf entfernt ist. Sie haben sogar ein einfaches Beispiel auf ihrer Website (Expressions-Evaluator), das ziemlich nah an dem zu sein scheint, was Sie erreichen wollen.

Edit: Auf dem diesjährigen Lang.Net-Symposium wurde über Irony gesprochen.

Hoffe das hilft!




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