5

私が取り組んでいるプロジェクトでは、かなり奇妙なデータ ソースを使用する必要があります。「クエリ」を指定すると、DataTable が返されます。ただし、クエリは従来の文字列ではありません。それはもっと似ています...私が望む基準を定義する一連のメソッド呼び出しです。これらの行に沿ったもの:

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();

本質的に、それはすべての標準的なもの (ブール演算子、括弧、いくつかの関数など) をサポートしますが、それを記述するための構文は非常に冗長で、日常の使用には不快です。

"Column1 = 123 AND Column2 < 456"与えられた式 ( など) を解析し、それを上記の関数呼び出しに変換する小さなパーサーを作成したかったのです。また、そこにパラメータを追加できればいいので、インジェクション攻撃から保護されます。一番上の最後の小さな砂糖は、解析結果をキャッシュし、同じクエリが別のオブジェクトで再実行されるときにそれらを再利用できるかどうかです。

だから私は疑問に思っていました-これに使用できる既存のソリューションはありますか、それとも独自の式パーサーを展開する必要がありますか? それほど複雑ではありませんが、コーディングに 2 ~ 3 日かかり、修正するバグの山を節約できれば、それだけの価値があります。

4

3 に答える 3

7

アイロニーを試してみてください。ドキュメントが不足していますが、サンプルを使用すると、非常にすばやく起動して実行できます。Ironyは、コードを解析して抽象構文ツリーを構築するためのプロジェクトですが、ニーズに合ったフォームを作成するために、小さなロジックを作成する必要がある場合があります。DLRは、抽象構文ツリー(IronPythonおよびIronRubyで使用されます)からコードを動的に生成/実行できるため、これを補完するものになる可能性があります。2つは良いペアを作る必要があります。

ああ、それらは両方とも一流の.NETソリューションでありオープンソースです。

于 2009-04-22T09:01:20.600 に答える
0

BisonやJavaCCなどは、文法からパーサーを生成します。次に、独自のコードを使用してツリーのノードを拡張し、式を変換できます。

OPコメント:サードパーティの実行可能ファイルをソフトと一緒に出荷したくありません。コードにコンパイルしてほしい。

どちらのツールも、リンク先のソースコードを生成します。

于 2009-04-22T09:01:50.553 に答える
0

この使用法と複雑さのレベルを正確に表すパーサーを手作業で作成しました。2日ほどかかりました。やってよかったけど二度とやらない。ANTLR または F# の Fslex を使用します。

于 2009-04-22T18:15:01.440 に答える