2010-12-08 11 views
26

高速で軽量な表現パーサを見つける必要があります。私は速いランタイム表現パーサを必要とします

理想的には、名前/値のペア(変数など)と評価する式を含む文字列を渡したいと思っています。私がそれから戻ってくる必要があるのは真偽値です。式の

タイプはのラインに沿ってなければならない:

varA == "xyz" and varB==123 

基本的に、その発現が単純な論理エンジンは、実行時に提供されます。それは==、!=、>、> =サポートする必要があります最低でも

UPDATE
、<、< =

スピードに関しては、私はおよそ5式が要求ごとに実行されることを期待しています。私たちは100 /要求の近くのどこかで1秒を見ます。現在のページは50ms未満で実行される傾向があります。通常、どの表現にも2つまたは3つの変数しか関与しません。しかし、実行前にパーサに約30をロードする必要があります。

UPDATE 2012/11/5
パフォーマンスに関する更新。私たちはほぼ2年前にnCalcを実装しました。それ以来、私たちはポストバックで300以上の変数をカバーする平均40以上の式を使用するように拡張しました。現在、1秒間に何千ものポストバックが発生し、パフォーマンスの低下は全くありません。

また、パフォーマンスの低下を伴わずにいくつかの追加機能を追加しました。要するに、nCalcは私たちのニーズをすべて満たし、私たちの期待を上回りました。

+1

@Cにカスタマイズする必要があります。ロス:どうしたの?私は、「ありがとう」と言っても間違いないと思う。 –

+0

は既製のものは何も知らないが、あなた自身を書くのは難しいようではない(要件に応じて)。 ==唯一の比較器ですか? varsはC#のように大文字と小文字を区別するか、vb.netのように大文字小文字を区別しませんか?ブール演算子は許されている(としない)。あなたがコードやユーザで書くことができる表現が本当にA = B – SFun28

+0

@Chris Livelyに限られているのかどうかを調べようとすると、ここにいくつかの良い方法があります。http://stackoverflow.com/questions/1437964/best-最短の評価方法 - 数式 - – acoolaum

答えて

29

https://ncalc.codeplex.com/https://github.com/sheetsync/NCalcを見ましたか?

これは拡張性があり、高速(独自のキャッシュを持つ)で、EvaluateFunction/EvaluateParameterイベントを処理することで、実行時にカスタム関数と変数を提供できます。例には、それが解析できる式:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

    e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
    e.Parameters["X"] = 10; 

    e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
     if (name == "Pi") 
     args.Result = 3.14; 
    }; 

    Debug.Assert(117.07 == e.Evaluate()); 

また、ユニコード&多くのデータをネイティブに入力し処理します。あなたが文法を変更したいのであれば、それはアンラーファイルが付属しています。新しい機能をロードするためにMEFをサポートするフォークもあります。

また、論理演算子、日付/時刻の文字列、if文もサポートしています。

+0

有望に見える – NotMe

+0

ちょうどテストされています。素晴らしく見える。まだテストをロードする必要がありますが、プロジェクトは非常に簡単に実装できました。 – NotMe

+0

エース、問題がある場合はNcalcのディスカッションページに投稿してください – GreyCloud

12

Fast Lightweight Expression Evaluatorはどうですか?それはset variablesをサポートし、logical operatorsをサポートします。

時間がある場合は、Ironyで独自の表現言語を設計することもできます。

+0

私はこれを見ましたが、誰かが実際に使っているかどうかはわかりませんでした。あなたはそれを実際に体験していますか? – NotMe

+0

@Chris - 私は自分自身の表現パーサーで微妙に変わっていました。広告されたように動作しますが、私の要件には*高速*が含まれていないため、ベンチマークが必要な場合があります。また、定義する方法によっては軽いかもしれません。 –

+0

私はあなたを支持しましたが、最終的にこれに反対しました。それをダウンロードした後、私はそれがすべてのVBコードだと思った。私は確かにうまくいっていますが、私の中に何か(おそらく20年以上の開発期間)があれば、私は選択肢があれば何でも関連する仕事を拒否します。 ;) – NotMe

5

ヒステリシスのインタープリタはカスタム関数、演算子、リテラルをサポートしていますが、軽量で純粋なC#移植コードです。現在MonoTouch経由でiOS上で動作し、他のMono環境やWindows上で動作する必要があります。商業用には無料です。 GitHub(https://github.com/hisystems/Interpreter)で利用可能です。

0

私はこの回答がどれほど遅いかを十分に理解していますが、誰かが複数のプラットフォームにわたって表現を使用したい場合は、NCalcを使用して受け入れられた答えよりも上に追加できると思っています。

C#のパーサを作成して、今後数ヶ月にわたってJavaとSwift用に実装する予定です。これは、プラットフォームごとに調整する必要なく、マルチプラットフォーム上の式を評価できることを意味します。

Expressiveはツールであり、 GitHubまたはNugetにあります。

サイトがそれにドキュメントのかなりの量を持っていますが、ここではリンク切れを防ぐためには、それを使用する方法の例です:

変数のサポートを

var expression = new Expression("1 * [variable]"); 
var result = expression.Evaluate(new Dictionary<string, object> { ["variable"] = 2); 

機能

var expression = new Expression("sum(1,2,3,4)"); 
var result = expression.Evaluate(); 

NCalcとできるだけ一致するように設計されていましたが、広告があります'ヌル'キーワードのようなものをサポートしています。

-1

ここで自己PR 私はあなたが私のgithubの上の例parseras表現を見つけることができますC#https://github.com/b3b00/csly のためのAAの一般的なパーサジェネレータを書きました。