2009-04-22 6 views
4

私が作業しているプロジェクトでは、むしろ奇妙なデータソースで作業する必要があります。私はそれに "クエリ"を与えることができ、それは私にDataTableを返します。しかし、クエリは従来の文字列ではありません。それは、私が望む基準を定義する一連のメソッド呼び出しのようなものです。これらの線に沿って何か:本質的にはC#:任意の文字列を式ツリーに解析するには?

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日のコーディングとバグ修正のために2〜3日節約できれば価値があります。

答えて

7

お試しくださいIronyです。ドキュメンテーションは不足していますが、サンプルはすぐに起動して実行されます。 Ironyは、コードを解析して抽象構文木を構築するプロジェクトですが、ニーズに合ったフォームを作成するには少し論理を書く必要があります。 DLRは、IronPythonとIronRubyで使用されている抽象構文木から動的にコードを生成/実行できるため、これを補完するものです。 2人は良いペアになるはずです。

ああ、彼らはファーストクラスの.NETソリューションとオープンソースの両方です。

+0

巨大に見えます。私の必要性は小さいです。 :P –

+0

Ironyアセンブリのサイズは171 KBです(デバッグバージョン)。また、必要に応じてソースコードを利用できるので、アプリにコンパイルすることもできます。あなたのニーズに合わせて、それを使用するのは非常にシンプル(つまりコードはあまりない)でなければなりません。私は表現パーサー/エバリュエータープロジェクトでそれを使用しています。コードはほんの数百行にすぎませんが、私の表現言語はあなたが記述したものよりはるかに複雑です。一方、DLRは実際にはもう少し大きいですが、それは本当にあなたのためには必要ありません:) – OregonGhost

0

BisonまたはJavaCCなどは、文法からパーサーを生成します。その後、独自のコードでツリーのノードを拡張して式を変換することができます。

OPコメント: 私のソフトではサードパーティの実行ファイルを実際に出荷したくありません。私はそれを自分のコードでコンパイルしたい。

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

+0

私は本当に私のソフトでサードパーティの実行ファイルを出荷したくありません。私はそれを自分のコードでコンパイルしたい。 –

0

私は手でexacltyこの使用方法や複雑さのレベルのためのパーサを書きました。約2日間かかりました。私はそれをしてうれしいですが、私は再びそれをやりません。 ANTLRまたはF#のFslexを使用します。

関連する問題