2

クエリフィルターを操作できるパーサーを探しています。ただし、用語がよくわからないので、大変な作業になっています。誰かが私を助けてくれることを願っています。「再帰下降パーサー」について読んだことがありますが、これは私が探している論理式の評価ではなく、本格的な言語パーサー用であるのではないかと思います。

理想的には、.NETコード(C#)だけでなく、T-SQLで機能する同様のパーサーも探しています。

私が欲しいのは何かを解析することです例えば:

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

理想的には、演算子は定義可能であり(たとえば、'<' vs'lt'、'=' vs'==' vs'eq'など)、関数型ラベルを指定できます(たとえば、(left(x、1)= 'e'))。パーサーはこれをロードし、順序の優先順位に従い(理想的には角かっこがないことを処理します)、ブール結果に評価する式を使用してコードにコールバックします(例:'a = b'?)。パーサーが式のカスタム関数を理解することは期待していません(ただし、文字列の分割など、いくつかの基本的な関数は便利です)。式を(左側と右側の部分に)分割すると便利です。

パーサーは、最終結果を計算するために最小限の質問をすることが望ましいです。たとえば、ANDの一方の側が偽の場合、もう一方の側を評価する意味はなく、最も簡単な側を最初に評価します(つまり、上記の式、'c <= d'はより高速であると想定されるため、最初に評価されます。

これはやるべきことがたくさんあると想像できますが、かなり一般的です。誰かが私に何か指針を与えることができますか?上記のように柔軟なパーサーがない場合、最初に使用できる基本的なパーサーはありますか?

どうもありがとう

リー

4

5 に答える 5

1

あなたは皮肉をチェックアウトすることができます. それを使用すると、bnf からそれほど遠くない構文を使用して、C# コードで文法を定義できます。彼らのサイト (expression evaluator) には、あなたが達成したいものに非常に近いと思われる簡単な例さえあります。

編集:今年の Lang.Net シンポジウムでIrony についての話がありました。

お役に立てれば!

于 2009-11-01T11:35:42.460 に答える
1

これを見てください。ANTLR は優れたパーサー ジェネレーターであり、リンク先の記事には、ニーズに合わせて調整できる実用的なコードがあります。

于 2009-09-17T10:19:22.900 に答える
0

Vici.Parser を試してみてください:ダウンロードはこちら (無料)です。これは、私がこれまでに見つけた中で最も柔軟な式パーサー/エバリュエーターです。

于 2009-09-17T13:23:03.233 に答える
0

これには .NET 式ツリーを使用できます。そして、この例は実際には非常に単純です。

Expression<Func<int, int, int, int, bool>> test = (int a, int b, int c, int d) => ((a == b) | (c == 1)) & (c <= d);

そして、デバッガーで「テスト」を見てください。すべてがすでに解析されているので、そのまま使用できます。

唯一の問題は、.NET 3.5 では Func で最大 4 つの引数しか持てないことです。そこで、「e」を「c」に一箇所変えてみました。4.0 では、この制限は 16 に変更されました。

于 2009-11-02T20:02:06.283 に答える
0

可能であれば、.Net 3.5 式を使用してください。

コンパイラは式を解析し、必要に応じて分析して使用できる式ツリーを提供します。それほど単純ではありませんが、実行可能です (実際には、IQueryable インターフェイスのすべての実装がまさにこれを行います)。

于 2009-09-17T15:19:20.930 に答える