2012-03-21 21 views
0

私の会社では、ここでは.Net 2.0に固執しており、アップグレードする機会はありません。 .NET 2.0でIronyを動作させる方法はありますか?.Net 2.0でカスタム言語の設計にIronyを使用する

簡単に私が達成しようとしていることを説明しようとします。当社では給与計算システムを使用しており、そこでは顧客が支払済明細の数式を定義できるようにしています。これらの公式は、Regex(非常に信頼性が低い)を通してチェックするいくつかのキーワード/関数を使わなければなりません。次に、Microsoftスクリプトコントロールオブジェクトを作成し、そのeval関数を使用してスニペットを解析します。これらのスニペットは、クラスで定義されたキーワード/関数を呼び出して出力を取得します。

しかし、このシステムには、非常に丁寧な欠点があります。場合によってはエラーでオーバーフローすることもあります。

非常に愚かです。 -

FVAL(A)/(FVAL(B)+FVAL(C)) 

明らかに、この式が通過する段階があります。

まず、我々は次の操作を行い、検証段階 -

  • キーワード

  • の事前に定義されたArrayListの中に存在していない使用されるすべてのキーワードがあるかどうかを正規表現によるチェック後いずれかがあるかどうか確認してください変数のarraylistに存在しない変数(この場合、A、B、Cは1である)を使用します。

  • すべての検証に合格した場合は、その後、我々はScriptControlClassオブジェクトのeval関数に数式文字列を渡しても、それに定義されたすべての機能を静的なクラスを追加します(この場合はFVAL()を考慮)と変数がある場合、この関数はtrueブール値を返します。この文脈で使用するために有効なもの(日付と番号を追加するようにfalseを返します)

は今、この式を評価した後、結果がある - DivideByZeroException、なぜ1および実行するにtrue evalの型キャストは、すべてのブール理由ノーマルarそれへの算術。

FVAL(A)/(FVAL(B)+FVAL(C)) => 1/(1-1) 

第二相はほぼ同様であるが、任意の検証チェックせず、trueを返すことなく同様我々は、実際には各変数の値で構成さDataTableから変数の値を返します。

システムは陳腐化しており、真剣に神経に乗っていて、本当に助けが必要です。提案してください。

答えて

2

優れた通訳を書くのは簡単ですが、特に1つのデータ型しか扱わない場合は、かなり簡単です。コンパイラ(またはパーサー)の背景を持つ人は、おそらく1日以内にあなたを書き込むことができます。私は自分で束を書いた。

Embedding a scripting languageでも可能ですが、指定した言語の癖に慣れている必要があります。それがビジネス上の要件であれば、高精度の数値を使用することは難しいでしょう。

+0

[Spart](http://www.codeproject.com/Articles/5676/Spart-a-parser-generator-framework-100-C#)についてどう思いますか?私の目的のためにSpartを使用するように私を導くことができますか?私はそれが私の必要性のために十分だと思う。私はちょうど "Getting Started"記事なしで立ち往生しています。 –

+0

オプションの[たくさん](http://stackoverflow.com/questions/5060583/code-parser-for-own-dsl-in-c-sharp)がありますが、私が実装したコンパイラやインタプリタはありませんそれらのいずれかを使用した。アイロニーとスパートはどちらも素晴らしいことがあります。個人的には、APIを学ぶよりも、再帰的な降下システムを使って簡単な文法を最初からやり直す時間が少なくて済みました。 –

+0

質問に投稿したコードを使って文法の例を教えてもらえますか? –

関連する問題