私は次の問題を解決しようとしています:
私はJavaアプリ(私が書いたものではありません)を持っています。その目的は2つのレポートファイル(コンマ区切りのテーブル出力)を取得し、ファイルの各行と各列をセルごとに比較することです。基本的に、回帰テスト用です。
次の機能で拡張したいと思います。
C1列のすべての値が100%増加するようにソフトウェアを変更したとします。
特定の列「C1」を比較すると、ソフトウェアは現在、C1の値が100%変更されたことを報告します。
私がやりたいのは、単に「row1のC1は両方のファイルで同じである」と比較するのではなく、事前に構成された比較ルール/式をフィールドに適用するように回帰テスターを構成できるようにすることです。ファイル#2のC1値は、ファイル#1のC1値の2倍です。このようにして、すべての行の列C1が一致しないという偽の回帰エラーを100%抑制するだけでなく、新しいソフトウェアを使用して列C1が正確に100%大きくない実際のエラーもキャッチします。
以前にこの種の機能をPerlでコーディングした場合、解決策は非常に単純でした。カスタムの列ごとのコンパレータ構成を構成ファイルに格納されたPerlハッシュにコーディングするだけで、ハッシュキーは列で、ハッシュ値は2つの値を比較するためのPerlサブルーチンです。私が望んでいた複雑な方法。
明らかに、このアプローチはJavaでは機能しません。Javaでカスタムコンパレータロジックを記述できず、Javaで異なる実行時にこれらのコンパレータを評価/コンパイル/実行することができないためです。
これは、私の異なるものが解釈/評価/実行するドメイン固有の解釈可能な言語を考え出す必要があることを意味します。
私はJavaエコシステムとライブラリにあまり詳しくないので、SOに質問しています。
構成可能なコンパレータロジックにこのDSLを実装するための良いソリューションは何でしょうか?
私の要件は次のとおりです。
解決策は「ビールのように無料」でなければなりません
ソリューションは「シュリンクラップ」する必要があります。たとえば、既存のライブラリをコードにドロップし、構成ファイルを追加して、機能させることができます。
独自のBNF文法を作成する必要があり、独自のインタープリターを作成する必要がある汎用文法パーサーを提供するものは受け入れられません。
ソリューションは、データの処理と構文が豊富である限り、適度に柔軟である必要があります。例えば:
少なくとも、データの行全体をハッシュとして渡すことができ、DSL内から参照/アドレスを渡すことができるはずです。
適度に完全な構文が必要です。少なくとも基本的な文字列操作(連結、サブ文字列、理想的にはある程度の正規表現の一致と置換)を実行します。
abs(val1 - val2) > tolerance
浮動小数点#sで実行する機能を含む基本的な算術。条件文や理想的にはループなどの基本的なフロー制御/ロジック。
ソリューションは適度に高速で、スケーラブルである必要があります。たとえば、100x100サイズのファイルを比較する場合、10〜20のカスタム列で10分かかることはありません。
重要な場合、ターゲット環境はJava1.6です。